关于java中List集合的使用时常遇到的几个问题

一.List与Set的异同

Lsit和Set都是继承自Collection接口。都是用来储存一组相同的元素。

List的特点:元素有放入的顺序,元素可以重复。有顺序---即先放入的元素排在前面。

Set的特点:元素无放入的顺序,元素不可以重复。

无顺序---先放入的元素不一定在前面。

不可重复---相同的元素在set中只会保留一份,所以有些场景可以利用set去重复。不过需要注意的是set在元素插入的时候是要有一定的方法判断元素是否重复,这个方法很重要,决定了set可以存哪些元素

二.什么是synchronizedList?他和Vector有什么区别?

SynchronizedList是java.util.Collections中的一个静态内部类。

eg. List TEST_LIST = Collections.synchronizedList(new ArrayList());

在多线程的环境下可以直接使用Vector类,也可以使用Collections.synchronizedList(List list)方法来返回一个线程安全的List

1.如果使用add方法,那么他们的扩容机制不一样(类似arraylist和Vector的区别)

2.SynchronizedList可以指定锁定的对象。即锁粒度是同步代码块。而Vector的锁粒度是同步方法

3.SynchronizedList有很好的扩展性和兼容功能。他可以将所有的list子类转成线程安全的类。

4.使用SynchronizedList的时候,进行遍历时需要手动进行同步处理

5.SynchronizedLsit可以指定锁定的对象

三.通过Array.asList()获得的List有什么特点,使用时应该注意什么?

1.asList()得到的只是个Arrays的内部类,一个原来数组的视图List,因此如果对他进行增删操作会报错

2.用ArrayList的构造器可以将其转变成为一个真正的ArrayList

四.如何在遍历的同时删除ArrayList中的元素

1.错误场景:使用增强for循环,在循环 的过程中删除非基本数据类型之后,继续循环list会报ConcurrentModificationException

像这种情况下,在删除元素后马上跳出循环也不会报错(break)

eg.list.remove(l);

break;

2.使用普通的for循环不会报错,但是删除元素后,被删除的元素索引发生了变化,假设被删除的list中有10个元素,当删除了第三个元素,第四个元素就变成了第三个,第五个元素就变成了第四个,但是程序下一步的循环的索引是第四个了,这时候取到的元素是第五个元素

3.使用Iterator的方式可以顺利的删除和遍历元素

注意:删除元素的时候要使用Iterator 的remove()方法移除当前的对象,如果使用List 的remove方法同样会出现异常

 

 

 

你可能感兴趣的:(java基础)