基础问题:
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
java虚拟机是一个能执行java字节码的虚拟机进程,java源代码被编译成java虚拟机能处理的字节码文件。Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行,Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。
2.JDK和JRE的区别是什么?
JRE是Java运行时环境,包含了jvm以及相关的java类库。
JDK是完整的java软件开发包,包含了jre,编译器以及其他的工具,可以让开发者开发编译java程序。
3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
表明成员变量或方法在没有所属类的实例对象的情况下被访问。不可以,因为方法覆盖是在运行时动态绑定的,而static方法是在编译时静态绑定的。
4.是否可以在static环境中访问非static变量?
不行,因为static变量是在类初始化时访问,而此时非static变量还没有被创建出来。
5.Java支持的数据类型有哪些?什么是自动拆装箱?
8种数据类型,byte、short、int、float、double、long、char、boolean。
自动装箱就是把基本数据类型和对应的对象包装类型之间做的转换,例如int-Integer
6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
方法覆盖:子类重新定义了父类的方法,方法名方法参数都相同。
方法重载:同一个类中多个方法名相同,但方法参数不同。
7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
当新对象被创建的时候,会调用构造函数。
构造函数重载类似于方法重载只不过没有返回值类型。
java不支持复制构造函数,不同于c++,他会创建默认的构造函数。
8.Java支持多继承么?
不继承,java是单继承语言,接口支持多继承
9.接口和抽象类的区别是什么?
接口比抽象类更抽象。
1.抽象类中可以包含抽象方法和非抽象方法,而接口中都是抽象方法。
2.类可以实现多个接口,但只能继承一个抽象类。
3.类如果要实现一个接口必须实现它所有的方法 ,但抽象类可以不需要。
4.接口中的变量默认都是final类型,而抽象类中可以包含非final的变量
5.java接口中成员函数默认为public,而抽象类还可以包含protect,private的成员函数
10.什么是值传递和引用传递?
值传递传递的是对象的副本,改变不影响原值。
而引用传递传递的是对象的引用,外部引用的对象会影响原值的改变。
容器问题:
四种类型:collection,set(无重复元素),List(有顺序的),map(有键值对)
map底层实现:数组+链表
HashSet的底层是通过HashMap来实现的
11.为什么集合类没有实现Cloneable和Serializable接口?
Cloneable和Serializable与collection具体的实现类有关,有他们决定元素对象的存储方式。
12.什么是迭代器(Iterator)?
Iterator提供了很多对集合元素进行迭代的方法,迭代器可以在迭代过程中删除底层元素的集合。
13.Iterator和ListIterator的区别是什么?
1.Iterator可以遍历list和set,而ListIterator只能用来遍历List
2.Iterator只能前向便利,而ListIterator可以前向和后向
3.ListIterator实现了Iterator接口,增加了其他功能,例如
14.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
快速失败:在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
安全失败:采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
因此在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception,java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
15.Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
16.hashCode()和equals()方法的重要性体现在什么地方?
不同的key值可能有相同的hash值,因此这两个方法也用来发现重复元素。这两个方法的实现对HashMap的精确性和正确性是至关重要的。
17.HashMap和Hashtable有什么区别?
HashMap允许键和值为null,而Hashtable不允许键或着值为空。
HashMap适用于单线程,效率高,而Hashtable适用于单线程,效率低。
18.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
Array大小是固定的,而ArrayList是动态变化的。
Array可以存储基本数据类型以及变量,而ArrayList只能存储对象。
在处理固定大小的基本数据类型时,使用Array更好。
19.ArrayList和LinkedList有什么区别?
底层实现一个是数组,一个是链表。
20.Comparable和Comparator接口是干什么的?列出它们的区别
java提供了只包含一个compareTo()方法的Comparable接口,这个方法用来对两个对象进行排序,已经实现了Integer 和 list的排序,只需要实现该接口即可。
Java提供了包含compare()和equals()两个方法的Comparator接口,是在集合外部实现的排序。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,例如class person implements Comparable{}
但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了,例如 public personCompare implements Comparator{} 然后在对对象进行比较排序时,Collection.sort(personlist, new PersonCompare())
21.什么是Java优先级队列(Priority Queue)?
PriorityQueue是个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable)也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。 依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。
PriorityQueue对元素采用的是堆排序,头是按指定排序方式的最小元素。堆排序只能保证根是最大(最小),整个堆并不是有序的。 方法iterator()中提供的迭代器可能只是对整个数组的依次遍历。也就只能保证数组的第一个元素是最小的。
22.Enumeration接口和Iterator接口的区别有哪些?
Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。
23.HashSet和TreeSet有什么区别?
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。