尖括号 java 集合_java 集合类基础问题汇总

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条语句:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值