collection集合的简单使用

Collection接口下有两个常用的子接口:List和Set

List存储元素时是有序的,允许重复元素

如:
list.add("bbb");
list.add("ccc");
list.add("ccc");
list.add("aaa");

输出:[bbb, ccc,ccc, aaa]


List接口的实现类:ArrayList、LinkedList、Vector

ArrayList,底层实现是Object数组结构,该实现不是同步的
也就是说多个线程同时操作的时候是不安全的
List list = new ArrayList();
可以添加一个null元素,也可以多个
list.add("aaa");
list.add(null);
输出:[aaa, null]

一旦创建ArrayList对象,会采用默认长度10个大小
随着不断添加数据,超过10个长度会递增:
规律:第一次扩容后的大小:10+10>>1(15)
      第二次扩容后的大小:15+15>>1(22)
      第三次扩容后的大小:22+22>>1(33)
      ....
伴随着容量的增加,会把原来的数据复制到新容量的数组中
每一次扩容都会重新复制一次
这样在添加比较多的数据的时候就显得麻烦,而且效率比较低
可以通过创建ArrayList list = new ArrayList();
 list.ensureCapacity(1000000);
的同时进行指定扩容大小,那么就好像一开始指定开辟多大的
空间,没达到那么大的空间就不会进行扩容了,就省去不断扩容不断复制数组了


LinkedList,底层实现是链表结构,该实现不是同步的
也就是说多个线程同时操作的时候是不安全的
List list = new LinkedList();
可以向首尾添加或删除元素
相比ArrayList的使用,LinkedList的增删操作快,查询慢

Vector,底层实现是Object数组结构,该实现是同步的,(这是与ArrayList的区别之处)
一旦创建Vector对象,会采用默认长度10个大小
随着不断添加数据,超过10个长度会递增:
规律:第一次扩容后的大小:10+10(20)
      第二次扩容后的大小:20+20(40)
      第三次扩容后的大小:40+40(80)
      ....
伴随扩容也会将数据复制到新容量大小的数组中
可以通过Vector vect = new Vector();
vect.ensureCapacity(1000000);
设置一开始的容量

Set存储元素时是无序的(注意我们所说的有序无序是根据添加顺序和取出顺序的是否一致),
不允许重复元素,可以有一个null元素(添加了重复的元素,只保留一个)

如:
Set set = new HashSet();
set.add("bbb");
set.add("aaa");
set.add("ddd");
set.add("ccc");
set.add(null);
输出:[null, aaa, ddd, ccc, bbb]

Set接口的实现类:HashSet、LinkedHashSet、TreeSet

HashSet,底层采用的是HashMap结构,此实现不是同步的
LinkedHashSet,底层采用的是LinkedHashMap结构,此实现不是同步的
Set set = new LinkedHashSet();
set.add("bbb");
set.add("aaa");
set.add("ddd");
set.add("ccc");
set.add(null);
输出:[bbb, aaa, ddd, ccc, null]
注意这里:与 HashSet 的不同之处在于,LinkedHashSet维护着一个运行于所有条目的双重链接列表。
此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代
所以这输出的顺序和添加的顺序一致


TreeSet,底层采用的是TreeMap结构,此实现不是同步的
注意了:它不能添加null元素,否则运行出现空指针异常

默认按照自然排序
TreeSet ts = new TreeSet();
ts.add("bbb");
ts.add("aaa");
ts.add("ddd");
ts.add("ccc");
输出:[aaa, bbb, ccc, ddd]
在创建的时候可传递自己的比较器



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值