Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。
1、Java集合类里面最基本的接口?
Collection:代表一组对象,每一个对象都是是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的Collection,可重复。
Map:Key-Value,Key不重复。
2、集合类为什么没有实现Cloneable和Serializable接口?
集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
3、什么是迭代器(Iterator)?
Iterator接口提供了很多对集合元素进行迭代的方法。每个集合类都包含了可能返回 迭代器的实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。
4、Iterator和ListIterator的区别?
Iterator可遍历Set,List集合,ListIterator只能遍历List。
Iterator对集合只能向前遍历,ListIterator可向前也可向后遍历。
ListIterator实现了Iterator接口,并包含了其他功能。例如,增加元素,替换元素,获取前一个和后一个元素的索引等等。
5、HashMap的工作原理?
键值对形式存储。HashMap有一个Hash()函数,它使用hashCode()和equals方法来向集合/从集合添加/检索元素。当使用put()方法时,HashMap会计算key的hash值,然后将键值对存储在集合中合适的索引上。若key已存在,则更新value值。HashMap重要特性:容量(capacity),负载因子(load factor),扩容极限(threshold resizing)。
6、hashCode()和equals()方法的重要性体现在?
这两个方法用来确定键值对的索引,也用来发现重复元素。
7、HashMap秘HashTable区别?
均实现Map接口。
HashMap允许键值是null(仅一个),HashTable,key不能为null。
HashTable同步,适合于多线程,HashMap不同步,适用于单线程环境。
HashMap提供了可供应用迭代的键的集合。HashTable提供了对键的列表 (Enumeration)。
HashMap与HashTable保存key的方式与HashSet保存集合元素的要求完全相同。
若需要创建线程安全的Map实现类,无须使用HashTable实现类,可能过Collections类。
与HashSet类似的是:尽量不要使用可变对象为HashMap,HashTable的key。
8、Array与ArrayList的区别?
Array可包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小固定,ArrayList大小动态变化。
ArrayList提供了更多方法和特性:AddAll(),removeAll(),iterator()。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
9、Enumeration接口和Iterator接口的区别有哪些?
Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的
10、HashSet和TreeSet区别?
HashSet由一个hash表实现,元素无序。add(),remove(),contains()。方法的时间复杂度O(1)。
TreeSet由树形结构来实现,元素有序。add(),remove(),Contains()方法时间复杂度O(logn)。
11、Collection和Collections类区别?
Collection类是集合类的上级接口。
Collections是针对集合的一个帮助者类,他提供一系列静态方法实现对集合的搜索、排序、线程安全化等操作。
12、Set判断两个对象相同使用equals()方法,而不是"=="。
13、HashSet集合判断两个元素相等?
HashSet采用hash算法来决定元素的存储位置。HashSet存入一个元素,HashSet会调用该对象的hashCode方法得到该对象的HashCode值,根据此值决定在HashSet中的存储位置。因此,两个判断两个对象相等,需要判断equals()方法返回相等,以及hashCode()值相等。底层采用数组存储Key-Value对。
14、LinkedHashSet
LinckedHashSet用链表来记录集合元素的添加顺序,但其依然是个HashSet,不允许重复。
14、使用Properties读写属性文件
将Map对象与属性文件关联起来,即可以把Map对象中的key-value对写入(stroe()方法)属性文件中,也可以把属性文件中的“属性名=属性值”加载(load()方法)到Map对象中。
Properties里的key,value都是字符串类型。
14、SortedMap接口与TreeMap
Map接口 - SortedMap接口 - TreeMap实现类
TreeMap:红黑树数据结构。其排序方式:自然排序,定制排序,见16。
14、WeakHashMap
与HashMap用法基本相似。
区别是HashMap的key强引用,key所引用的对象不会被垃圾回收,WeakHashMap的key弱引用,key所引用的对象可能被垃圾回收。
14、IdentifyHashMap
IdenfityHashMap:当且仅当两个key严格相等(==)。
HashMap:equals()返回true,hashCode相同。
15、Treeset
采用红黑树的结构存储集合元素。TreeSet会调用元素的compareTo(Object obj)方法比较两个元素大小。向TreeSet集合中添加第一个元素时无须有compareTo方法,添加第二个元素时便会引发异常。向TreeSet集合中添加的元素必须有comopareTo方法。Java提供了一个Comparable接口,接口中定义了compareTo(Object obj)方法。TreeSet中添加的应该是同一个类的对象,否则引发异常。对于TreeSet来说判断两个对象是否相等的唯一标准是compareto方法返回是否是0。若在TreeSet中添加的对象,重写此对象的equals方法,需要保证equals方法与compareTo方法比较结果一致。推荐TreeSet和HashSet集合中添加不可变元素。
16、自然排序,定制排序?
自然排序:实例对象的compareTo方法进行比较,并按升序排列。
定制排序:TreeSet中有一个方法,Comparator comparator():返回定制排序排序所使用的Comparator,如果是自然排序,则返回null。TreeSet treeSet = new TreeSet("传入写好的Comparator实例对象")。Comparator接口中含有方法compare(T o1,T o2):用来比较两个对象大小。TreeSet实现定制排序时,仍然不可以添加不同类型的对象。
17、List判断两个对象的标准是什么?
equals()方法返回true。List在删除元素时,List会调用该对象的equals()方法集资与集合元素进行比较,如果该equals()方法以某个集合元素作为参数时返回true,List将会删除该元素。List提供了iterator()(返回Iterator对象),IistIterator()(返回ListIiterator对象)方法。ListIterator接口继承了Iterator接口。
18、ArrayList与Vector
基于动态数据,内置可再分配的Object[]数组。
ArrayList与Vector设有参数initialCapacity设置该数组长度,当元素超出该数组长度时,initialCapacity自动增加。
当添加大量元素时,使用ensureCapacity(int minCapacity)一次性设置initicalCapacity,减少重新分配次数。
Object[]默认长度10。
ArrayList与Vector重新分配Object[]的两个方法:
void ensureCapacity(int minCapacity):数组长度增加minCapacity。
void trimToSize():数组长度为当前元素个数。
Vector线程安全,ArrayList线程不安全。
Collections工具类,可以将ArrayList变成线程安全。
19、固定长度的List
数组操作类Arrays,提供了asList(Object....)方法,将数组或多个对象转换成一个List对象。
但这个List集合即不是ArrayList实现类的实例,也不是Vector实现类的实例,而且Arrays的肉类部的ArrayList的实例。
即Arrays.ArrayList是一个固定长度的List集合,只能遍历访问访该集合里的元素,不能添加和删除集合里的元素。(添加或删除,编译不会报错,运行时会报错)。
20、Queue
Queue有一个PriorityQueue实现类,一个Deque接口。
Deque提供了ArrayDeque和LinkedList两个都实现类。
21、PriorityQueue
保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。
不允许加入null元素,因为需要对队列元素进行排序。同样排序有两种方式,自然排序和定制排序。见16
PriorityQueue与TreeSet对元素的要求一致。
22、Deque接口与ArrayDeque实现类
Deque:双端队列。创建时可指定一个numElement参数指定Object[]长度,不指定默认为16。
ArrayDeque:Deque实现类,基于数组实现的双端队列。与ArrayList实现机制基本相似。可当成Stack使用。
23、LinkedList
LinckedList是List的实现类,并实现Deque接口。
因此它可被当成双端队列和栈。
24、当运行程序需要很大的内存空间时,JVM默认的内存空间不足,需要设置Xmx,Xms两个参数。-Xms:JVM的堆内存初始大小,-Xmx;JVM的堆内存最大大小(最好不要超过物理内存)。
25、Map
key不允许重复,即Map任意两个key通过equals()方法比较返回总是false。
Map中的所有key组成了一个Set集合。
Map提供一个Entry内部类来封装key-value对。而计算Entry存储时则只考虑Entry封装的key。