面试题之java基础
以下文章来源于程序员杂货铺 ,作者来根94的辣条
过去的几个月可以说是互联网的寒冬了,之前也就是吃瓜群众一个,看看别人的公司裁员什么的,可过去一周里我也算是切身体会到了裁员浪潮的残酷啊,各种CCC。有的人找不到工作总说是大环境不好的原因,送你一段话:
哈哈哈,就当是互联网裁员浪潮下的一个笑话吧。
应部分网友的建议,从今天起会逐步的总结一些java、php相关的面试题,由简单到复杂归纳一个系列:【金三银四】,中间部分题目的答案来源于网络,如若不严谨还望谅解。
java基础面试题
1、简述Java程序编译和运行的过程:
答:① Java编译程序将Java源程序翻译为JVM可执行代码--字节码,创建完源文件之后,程序会先被编译成 “.class” 文件。
② 在编译好的java程序得到“.class”文件后,使用命令java 运行这个 .class 文件,系统就会启动一个jvm进程,并找到主函数的入口,开始执行main函数。
2、值传递和引用传递的区别:
答:①值传递:值传递是将进行传递的值进行拷贝,然后对拷贝之后的值进行传递,传递过程前后不改变原值的大小;
②引用传递:引用传递是将需要传递值的地址进行传递,传递过程前后会改变原值的大小。
3、‘==’和equals的区别:
答:“==”操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
4、String 和StringBuilder的区别:
答:①String创新的字符串建的字符串是不可变的,如果改变字符串变量的值,是在内存中创建一个新的字符串,字符串变量将引用新创建的字符串地址,而原来的字符串在内存中依然存在且内容不变,直至java的垃圾回收系统对其进行销毁;
②StringBuilde创建一个可变的字符串,StringBuilder没有实现线程安全,因此性能较好。
5、java中,throw和throws 有什么区别:
答:throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)
而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。
6、HashMap的hashcode的作用:
答:hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的。
如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同。
如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点。
两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
7、什么时候需要重写?
答:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?
要比较两个类的内容属性值,是否相同时候,根据hashCode 重写规则,重写类的 指定字段的hashCode(),equals()方法。
8、Overload和Override的区别?
答:Overload是重载的意思,Override是覆盖的意思,也就是重写。
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
9、静态变量和实例变量的区别?
答:在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
10.如果main方法被声明为private会怎样?
答:能正常编译,但运行的时候会提示”main方法不是public的”。
11、说一说Servlet的生命周期?
答:Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
12、Java的”一次编写,处处运行”是如何实现的?
答:Java程序会被编译成字节码组成的class文件,这些字节码可以运行在任何平台,因此Java是平台独立的。
13、如果去掉了main方法的static修饰符会怎样?
答:程序能正常编译。运行时会抛NoSuchMethodError异常。
14、GC是什么?为什么要有GC?
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
15、为什么Java里没有全局变量?
答:全局变量是全局可见的,Java不支持全局可见的变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突。
16、Java支持哪种参数传递类型?
答:Java参数都是进行传值。对于对象而言,传递的值是对象的引用,也就是说原始引用和参数引用的那个拷贝,都是指向同一个对象。
17、get 和 post请求的区别
答:get:
1、请求的参数会附加在URL之后,多个参数用 & 连接。
2、因为URL的长度限制,get 方式传输的数据大小有所限制。
3、安全性低,因为传输的数据会显示在请求的URL中。
post:
1、将请求参数放置在 HTTP 数据包,发送给服务器。
2、传送的数据量比较大
3、安全性较高
18、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,然后在调用静态方法时可能对象并没有被初始化。
19、程序中可以允许多个类同时拥有都有main方法吗?
答:可以。当程序运行的时候,我们会指定运行的类名。JVM只会在你指定的类中查找main方法。因此多个类拥有main方法并不存在命名冲突的问题。
20、什么是反射API?它是如何实现的?
答:反射是指在运行时能查看一个类的状态及特征,并能进行动态管理的功能。这些功能是通过一些内建类的反射API提供的,比如Class,Method,Field, Constructors等。使用的例子:使用Java反射API的getName方法可以获取到类名。
21、为什么重载hashCode方法?
答:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?
如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。
22、Final在java中的作用
答:Final可以修饰类,修饰方法,修饰变量。
修饰的类叫最终类。该类不能被继承。
修饰的方法不能被重写。
修饰的变量叫常量,常量必须初始化,一旦初始化后,常量的值不能发生改变。
23、为什么需要hashCode?
答:1.通过hashCode可以很快的查到小内存块。
2.通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。
24、Super与this表示什么?
答:Super表示当前类的父类对象
This表示当前类的对象
25、Cookie 和 Session 的区别
答:Cookie:是把数据保存在浏览器本地,并随着每一次请求发送到服务器。
Session:是把用户数据保存在服务器端。
26、IO 和 NIO 的区别,NIO的优点
答:1、IO是面向流的,NIO是面向缓冲区的。
2、IO是阻塞的,NIO是非阻塞的。
3、NIO有选择器机制,可以让一个线程来监视多个IO通道。
NIO的优点:
1、不需要使用 read() 或者 write() 就可以处理文件内容。
2、NIO的处理效率很快。
27、谈谈对Java中多态的理解?
答:多态是指允许不同子类型的对象对同一消息作出不同的响应。
多态包括编译时多态和运行时多态。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
运行时多态是面向对象最精髓的东西,要实现运行时多态需要:
方法重写:子类继承父类并重写父类中已有的或抽象的方法。
对象造型:将父类型的引用指向子类型的对象,这样父类的引用调用同样的方法时即会根据子类对象的不同而表现出不同的行为。
28、Integer内部缓存?
答:Integer类内部有一个staitic 的Integer数组,存储的是一些已经完成初始化的Integer对象,一般值为(-128~127),若用==比较,则有时候会因为值不在缓存中而返回false,所以应该用equals比较。
29、LinkedList的原理?
答:(1)底层是一个双向链表,维护着一个first指针和一个last指针。
(2)随机读写(get,set)的时间复杂度为O(n)。
(3)插入操作add(object)的时间复杂度为O(1);add(index, object)的时间复杂度为O(n)。
(4)删除操作remove(object)的时间复杂度为O(1);remove(index)的时间复杂度为O(n)。
30、什么是拆装箱?
答:拆箱:把包装类型转成基本数据类型
装箱:把基本数据类型转成包装类型
31、Static关键字有什么作用?
答:Static可以修饰内部类、方法、变量、代码块
Static修饰的类是静态内部类
Static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象的,静态方法也不能被重写,可以直接使用类名来调用。在static方法中不能使用this或者super关键字。
Static修饰变量是静态变量或者叫类变量,静态变量被所有实例所共享,不会依赖于对象。静态变量在内存中只有一份拷贝,在JVM加载类的时候,只为静态分配一次内存。
Static修饰的代码块叫静态代码块,通常用来做程序优化的。静态代码块中的代码在整个类加载的时候只会执行一次。静态代码块可以有多个,如果有多个,按照先后顺序依次执行。
32、为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?
答:1.因为是按照hashCode来访问小内存块,所以hashCode必须相等。
2.HashMap获取一个对象是比较key的hashCode相等和equal为true。
之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equal为false。
33、heap和stack有什么区别。
答:java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
34、String 是最基本的数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。
35、数组有没有length()这个方法? String有没有length()这个方法
答:数组没有length()这个方法,有length的属性。String有有length()这个方法
36、接口有什么特点?
答:接口中声明全是public static final修饰的常量
接口中所有方法都是抽象方法
接口是没有构造方法的
接口也不能直接实例化
接口可以多继承
37、JDK 中常用的包有哪些?
答:java.lang、java.util、java.io、java.net、java.sql。
38、Collection 和 Collections的区别
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
39、什么是 Java 的反射机制
答:反射机制:是指程序可以在运行时 访问 或 修改 它本身状态和方法的这种能力。
40、JDK、JRE、JVM 分别是什么关系?
答:JDK 即为 Java 开发工具包,包含编写 Java 程序所必须的编译、运行等开发工具以及 JRE。开发工具如:用于编译 Java 程序的 javac 命令、用于启动 JVM 运行 Java 程序的 Java 命令、用于生成文档的 Javadoc 命令以及用于打包的 jar 命令等等。
JRE 即为 Java 运行环境,提供了运行 Java 应用程序所必须的软件环境,包含有 Java 虚拟机(JVM)和丰富的系统类库。系统类库即为 Java 提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。
JVM 即为 Java 虚拟机,提供了字节码文件(.class)的运行环境支持。简单说,就是 JDK 包含 JRE 包含 JVM
总结
面试难度:简单,基础
适合群体:2019毕业生,春招