18、集合框架,list,map,set都有哪些具体的实现类,区别都是什么?
参考答案
1.List,Set都是继承自Collection接口,Map则不是;
2.List特点:元素有放入顺序,元素可重复;
Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法;
另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值)。
3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
4.Map适合储存键值对的数据。
5.线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
19、ArrayList与Vector的区别和适用场景
参考答案
ArrayList有三个构造方法:
public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。
public ArrayList()//构造一个初始容量为10的空列表。
public ArrayList(Collection extends E> c)//构造一个包含指定 collection 的元素的列表
Vector有四个构造方法:
public Vector() //使用指定的初始容量和等于零的容量增量构造一个空向量。
public Vector(int initialCapacity) //构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。
public Vector(Collection extends E> c)//构造一个包含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量
ArrayList和Vector都是用数组实现的,主要有这么三个区别:
1).Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
2).两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同。
3).Vector可以设置增长因子,而ArrayList不可以。
4).Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
适用场景:
1.Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。
2.如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。
class A {}
class B extends A {}
class C extends A {}
class D extends B {}
Which four statements are true ?
The type Listis assignable to List.
The type Listis assignable to List.
The type Listis assignable to List>.
The type Listis assignable to List<?extends B>.
The type List<?extends A>is assignable to List.
The type Listis assignable to any List reference.
The type List<?extends B>is assignable to List<?extends A>.
查看正确选项
正确答案:A C D G
1. 只看尖括号里边的!!明确点和范围两个概念
2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List,List,List
3. 如果尖括号里面带有问号,那么代表一个范围, extends A> 代表小于等于A的范围, super A>代表大于等于A的范围,>代表全部范围
4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
6. List>和List 是相等的,都代表最大范围
----------------------------------------------------------------------------------
7.补充:List既是点也是范围,当表示范围时,表示最大范围
下面贴代码:(本来用的Eclipse截图的,结果好像网站出来Bug,不能传图了o(╯□╰)o
大概的观点就是:java数组具有协变性,而java集合不是协变的;
什么意思呢?我举几个例子:
1. 假设有一个函数 fun(Animal animal),如果我们传入一个Dog d 对象进去,编译器是不会报错的,这是多态的概念;
2. 假设有一个函数 fun(Animal[] animals),如果我们传如一个Dog[] dogs数组进去,编译器也不会报错,这就是数组的协变性;
3. 假设有一个函数 fun(List animal), 如果我们传如一个List dog 集合进去,编译器就会报错了,这就是集合泛型的不变性;
那么该怎么办呢?我们可以将泛型改成这样 fun (List extends Animal> ),这样之后,当我们再 传入一个List dog 集合进去,编译器就就不会报错了。也就是说可以传入包含Animal的子类的List了。
在Java中,关于HashMap类的描述,以下错误的是()?
HashMap能够保证其中元素的顺序
HashMap允许将null用作值
HashMap允许将null用作键
HashMap使用键/值得形式保存数据
参考答案:A
HashMap的底层是由数组加链表实现的,对于每一个key值,都需要计算哈希值,然后通过哈希值来确定顺序,并不是按照加入顺序来存放的,因此可以认为是无序的,但不管是有序还是无序,它都一个自己的顺序。故A错。
最开始有Hashtable,Hashtable是不允许key和value的值为空的,但后来开发者认为有时候也会有key值为空的情况,因为可以允许null为空,通过查看HashMap的源代码就知道:if(key = null) {putForNullKey(value);};
Map底层都是用key/value键值对的形式存放的
在jdk1.5的环境下,有如下4条语句: