Java集合类框架的基本接口有哪些?区别是什么?
1.集合的两大常用框架:Collection接口和Map接口;
1.1Collection接口又有两个常用的子接口:List接口和Set接口。
1.1.1对List接口有三个常用实现类:ArrayList类和Vector类,还有LinkedList类。
ArrayList类:有序可重复,增加、删除慢,查找快,非线程安全
Vector类:与ArrayList的区别是,其线程安全,两者都是使用变长数组实现的线性表集合。
LinkedList:有序可重复,增加、删除快,查找慢,其使用双向循环链表实现的线性表集合。
1.1.2对Set接口有一个比较常用的实现类:HashSet类(Set接口下的实现类都是不允许有重复值的)
HashSet类底层采用HashMap类(下面讲到)实现的,但其只用Key值。
1.2Map接口有两个常用的实现类:HashMap类和Hashtable类(两者不同之处是,Hashtable类是线程安全
的,下面主要讲HashMap类.)
HashMap类根据Key值存储value值,Key类似于数据库中的主键,不可重复,但value值可以重复
什么是迭代器(Iterator)?
(1)、List接口及其实现类
List接口继承于Collection接口。 List接口及其实现类是容量可变的列表,可按索引访问集合中的元素。
特点:集合中的元素有序、可重复;
实现类:
· ArrayList是以Arayy方式实现的List,允许快速随机存取,相对于LinkedList不适合进行插入和移除元素操作;
· LinkedList提供最佳顺序存取,适合插入和移除元素。
(2)、Set接口及其实现类
Set接口同样继承于Collection接口。
特点:集合中的元素无序、不包含重复的元素。
实现类:
· HashSet 能够快速定位一个元素,要注意的是:存入HashSet中的对象必须实现HashCode()方法;
· TreeSet 将放入其中的元素按序存放。
(3)、Map接口及其实现类
Map是一个单独的接口,不继承于Collection。Map是一种把键对象和值对象进行关联的容器。
特点:键对象不允许重复。
实现类:
· HashMap 实现一个键到值映射的哈希表,通过键取得值对象;
· Properties 一般是把属性文件读入流中后,以键-值对的形式进行保存,以方便读取其中的数据。
(4)、Iterator接口
Iterator接口位于java.util包中,它是一个对集合进行迭代的迭代器。
集合容器(如:List、Set、Map等)本身提供了处理元素置入和取出的方式,但是单一选取元素的方法很受限制。所以我们要用Iterator去选取容器中的元素,它将容器转换成一个序列。
Collection、Set和List的区别如下:
· Collection对象之间没有指定的顺序,允许有重复元素和多个null元素对象;它是Set和List接口的父类,是一种最通用型的集合接口;
· Set各个元素对象之间没有指定的顺序,不允许有重复元素,最多允许有一个null元素对象;
· List各个元素对象之间有指定的顺序,允许重复元素和多个null元素对象
Iterator和ListIterator的区别是什么?
Iterator与ListIterator区别如下: 1、Iterator是ListIterator的父接口。 2、Iterator是单列集合(Collection)公共取出容器中元素的方式。 对于List,Set都通用。 而ListIterator是List集合的特有取出元素方式。 3、Iterator中具备的功能只有hashNext(),next(),remove(); ListIterator中具备着对被遍历的元素进行增删改查的方法,可以对元素进行逆向遍历。 之所以如此,是因为ListIterator遍历的元素所在的容器都有索引。
Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
HashMap和Hashtable有什么区别?
这个问题都老掉牙了。有以下三方面:
1.hashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
3.hashMap允许空键值,而hashTable不允许
数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
ArrayList和LinkedList有什么区别?删除它们的一个元素,底层原理分别是什么?
HashSet和TreeSet有什么区别?
什么是面向对象?
Collection 和 Collections的区别?
HashMap,LinkedMap,TreeMap的区别
ArrayList底层是数组,那么为什么数组长度是固定的而集合长度是可变的?怎么实现?
参考:如何计算时间复杂度:http://blog.csdn.net/firefly_2002/article/details/8008987
集合结构:
1.Java集合类框架的基本接口有哪些?
集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。
2.为什么集合类没有实现Cloneable和Serializable接口?
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
3.什么是迭代器(Iterator)?
Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的
迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的
remove(ObjectObj)删除,可以通过迭代器的remove()方法删除。
4.Iterator和ListIterator的区别是什么?
下面列出了他们的区别:
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
5.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
6.Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
7.hashCode()和equals()方法的重要性体现在什么地方?
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
8.HashMap和Hashtable有什么区别?
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
9.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
10.ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
也可以参考ArrayList vs. LinkedList。
11.Comparable和Comparator接口是干什么的?列出它们的区别。
Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
12.什么是Java优先级队列(Priority Queue)?
PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。
13.你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。
大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。
14.如何权衡是使用无序的数组还是有序的数组?
有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。
15.Java集合类框架的最佳实践有哪些?
根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。
有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。
为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。
使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。
编程的时候接口优于实现。
底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。
16.Enumeration接口和Iterator接口的区别有哪些?
Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。
17.HashSet和TreeSet有什么区别?
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。
1.请讲下Java里面的容器
分两大类,Map和Collection。而Collection又有子接口List(数据存储顺序和插入顺序是一样的)、Set(里面的元素具有唯一性)
Map是存储键值对的,里面的健不可以重复,但值可以重复
a. 对于List主要有ArrayList和LinkedList两种实现。实现的数据结构不同,所以主要的区别也都是和数据结构相关的。 ArrayList基于数组,随机访问快,而对于中间元素的插入删除效率比较低,而且需要考虑扩容问题。LinkedList,则 基于链表,和ArrayList提到的正相反,随机访问慢,但对于中间元素的插入和删除更有效率。
Set也是一种Collection,和List比起来主要体现在元素唯一性。
2.请说下Iterator的作用
迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素
在遍历集合时可判断是否有下一个元素
3.说下ArrayList和LinkedList的区别和联系,并说明什么情况下用它们
区别:ArrayList用于对象的随机访问速度快,没有顺序
LinkedList实现机制是链表式的,和顺序有关,速度比ArrayList慢
联系:ArrayList和LinkedList都是List接口的实现类
当要快速获取一个值时,用ArrayList,用于顺序插入操作时,用LinkedList.
4.说下List,Set,Map三种集合各有什么特征
List集合中的元素可以重复,
Set集合中的元素不可以重复
Map集合用键-值映射存放对象,Map容器中的键对象不能重复,值对象可以重复
5.HashSet和TreeSet有什么区别,什么时候用它们
区别:HashSet中的元素不能重复,没有顺序
TreeSet中的元素不能重复,但有顺序
当集合中的元素需要排序时,用TreeSet
一般情况下用HashSet,因为不需要排序,速度比TreeSet快
6.什么是泛型,怎么使用的,有什么好处?
答案
定义一个集合时,可以知道里面定义的是什么类型
使用:在集合类型后面加< 数据类型 >
使用泛型后,从集合中取得元素后就不用再用强转
7.什么是for each循环,它可以循环那些数据类型
答案
也可以叫增强型循环,通过对象拿到集合里的值,因为扩展性比较强,建议多使用
可以用来循环集合和数组
8.写一个for each循环看看
for(Objectobject : list){
System.out.println(object);
}
9. 什么是强转怎么写的,有什么优缺点,一般要多用还是少用,为什么?
一般在继承的基础上用.一般是范围小的转换成范围大的,譬如byte可以转换成int,还可以子类转换成父类,反之则不行。
Person person=new Student();
Student student=(Student)person;
把运行期的强转为编译期的.
编译期不会出错.运行期容易出错.所以一般少用
10.HashMap和Hashtable有什么区别,一 般情况下常用那个?
HashMap的键-值都可以为空(null)
Hashtable的键-值都不可以为空(null),线程安全 ,
一般情况下用HashMap
11.Hashtable名字为什么没有驼峰命名
Hashtable的由来比较古老,当时还没有命名规范
12.Collections和Collection有什么区别
Collections是一个工具类,可以直接调用List和Set的方法
Collection是一个接口,是List和Set集合的父接口
13.写出Collections的6个方法,并详细解释
sort():对集合进行排序
shuffle():打乱集合中的元素顺序
addAll():将一个集合添加到另一个集合中
max():判断集合中的最大值
min():判断集合中的最小值
copy():将一个集合中的元素复制到另一个集合中去
fill():将一个集合中的元素全部替换成指定的元素
14.Arrays类是做什么的,写出它的常用6个方法
Arrays是数组的一个工具类
sort():对数组进行排序
binarySearch():搜索数组指定元素的下标
copyOf():复制数组中指定长度的元素
deepEquals():比较两个数组的深度
fill():把数组中的所有元素替换成指定元素
equals():比较指定两个数组的元素是否相等
15.比较下集合和数组的优缺点
集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起
数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的
16.如何对一个对象排序,有几种方法
把对象放入List集合中,用Collections工具类调用sort()方法进行排序,但是这个类必须实现Compable接口才行
把对象放在Set集合中,用TreeSet()实现类对集合直接排序
17.在集合里面怎么判断两个对象相等,要实现什么方法
equals方法
18.怎么样把集合转化成数组,或把数组转化为集合
把集合转为数组,可以用toArray()方法
把数组转为集合时, for each循坏,先把数组中的元素转为String型,再放到集合里
19.分别写出List,Set,Map里面的5个常用方法
List:add()新增clear()清除 contains()判断是否包含某个元素
indexOf()一个元素在集合中首次出现的位置
set()把指定下标的元素替换成自定义元素
Set:add()新增 clear()清除contains()判断是否包含某个元素
remove():把集合中指定下标的元素删掉
size():返回集合长度
Map: containsKey()是否包含指定key containsValue()是否包含指定value keySet()返回所有key put()添加元素 Remove()移除
20.HashMap与LinkedHashMap,和TreeMap的区别。
共同点:HashMap,LinkedHashMap,TreeMap都属于Map的实现类.
不同点: 1.HashMap里面存入的键值对在取出的时候是随机的,
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
3. LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.
21.HashMap怎么实现有序
可以转化放入TreeMap里面。
22.在List里面怎么去掉重复的数?
通过把List里面的数据放入HashSet可以去除重复
23.在List里面有几种排序?
答:两种:实现Comparable接口,实现里面的CompareTo方法进行排序。还有调用Collections.sort()方法排序!
24.说一下链表跟数组的区别
链表:用一组任意储存单元存放线性表的数据元素,并且通过指针链相接结点的序列称为链表。是一种常见的数据组织形式,它采用了动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。不靠数组实现,没有下标。
数组必须事先定义固定的长度,不能适应数据动态增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成数据浪费。在使用的时候还要数组初始化,注意数组的下标越界。
25.HashSet的理解
HashSet实现了Set接口,HashSet不保证集合的迭代顺序,允许使用Null元素。HashSet的底层使用了HashMap,使用HashMap实列进行对集合的元素进行操作,然后再封装成HashSet的操作。
26.什么类可以实现有序存储(除ArrayList以外)?
一种按照插入的顺序排序,譬如LinkedList,LiskedHashMap,另外一种是插入后重新排序TreeSet,TreeMap
27.HashMap和ArrayList是不是都是线程不安全的?
ArrayList是线程不安全的;HashMap是线程不安全的;还有我们常见的一些JAVA集合都是线程不安全,这样做是为了提高性能
在JDK5以后提供了线程安全的并发包java.util.concurrent并发包,譬如里面的类CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等
28.ArrayList集合加入1万条数据,应该怎么提高效率
因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能
29.你知道HashMap底层是怎么实现的吗?
简单的说是一个数组,因为数组的性能比较好,数组里面放的是Entry类,HashMap类有一个叫做Entry的内部类。这个Entry类包含了key-value作为实例变量。当存储或者获取对象的时候,就根据哈希算法,对象的hashCode调用得到这个下标,以便实现快速访问.
30.怎样遍历List Set,Map
List 和Set可以通过一般for循环,迭代器循环,或者增强型循环来遍历, 其中一般for循环性能最快,迭代器循环可以判断和得到下一个值,for each增强型循环扩展性强,但性能稍低.
Map循环可以通过keySet得到Key的Set集合,然后遍历这个集合就可以得到所有的Value
31.Set为什么是不允许重复的。
set的实现机制不允许重复的
32.ArrayList为什么要用for循环,为什么要用迭代器,又有什么好处。
for循环通过对象拿到集合里的值
迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素
在遍历集合时可判断是否有下一个元素
33.你对栈与队列了解多少你是怎么用的。
答:队列是一种数据结构,FIFO 先进先出有点类似与栈,只是在队列中第一个插入的数据项也会被最先删除,
队列的两个基本操作:
一个是插入一个数据项,即把一个数据项放入队尾
另一个是移除一个数据项,即移除队头的数据项.
34.如果我要存取很多的数据,但是又不需要重复的,要选择什么容器,说一下为什么使用它,它是哪个的子类?
答:Set容器,它是不允许重复的,它是collection的子类
35.哪种方法可以得到Map的Key?
keySet()方法