Java集合复习

集合类存放于Java.util包中,主要有3种:set(集)、list和map(映射)。
1.Collection:Collection是集合List、Set、Queue的最基本的接口。
2.Iterator:迭代器,可以通过迭代器遍历集合中的数据
3.Map:是映射表的基础接口

一、Collection接口

1.List
1.1ArrayList:排列有序,可重复;底层使用数组;速度快增删慢;线程不安全;当容量不够使,ArrayList是当前容量*1.5+1
1.2Vector:排列有序,可重复;底层使用数组

速度快,增删慢;线程安全效率低;容量不够时Vector默认扩展已被容量
1.3LinkedList:排列有序,可重复;底层使用双向循环链表数据结构:查询速度慢,增删快;线程不安全

2.Set
2.1HashSet:排列无序,不可重复;底层使用Hash表现;存取速度快;内部是HashMap
2.2TreeSet:排列无序,不可重复;底层使用二叉树实现;排序存储;内部是TreeMap的SortedSet
2.3LinkedHashSet:采用hash存储,并用双向链表记录插入顺序;内不是LinkedHashMap
3.Map
HashMap:键不可重复,只可以重复;底层哈希表;线程不安全;允许key值为null,value也可以为null
hashtable:键不可以重复,值可以重复;底层哈希表;线程安全;key、value也可以为null
treeMap:键不可重复,值可重复;底层二叉树。

二、分析

1.List

Java的List是非常常用的数据类型。List是有序的Collection。Java List一共有三个实现类

1.1ArrayList

ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。素组的缺点是每个元素之间不能有间隔。注:当数组大小不满足时需要增加存储能力,就要将已经有数据的数组赋值到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合碎甲查找和遍历,不适合插入和删除。

2.Set

Set注重独一无二的性质,该体系集合用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。对象的相等性本质是对象hashCode值(java是依据对象的内存地址计算出的次序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法。

2.1HashSet

哈希表存放的是哈希值。HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同)而是按照哈希值来存的所以数据也是按照哈希值取得。元素的哈希值是通过元素的hashcode方法获取的,HashSet首先判断两个元素的值,如果哈希值一样,介质会比较equals方法如果我去了上结果为true,HashSet就视为同一个元素。如果equals为false就不是同一个元素。
哈希值相同equals为false的元素是怎样存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。形成一个链表。
HashSet通过hashCode值来确定元素在内存中的位置。一个hashCode位置上可以存放多个元素。

2.2TreeSet

TreeSet()是使用二叉树的原理对新add()的对象按照指定顺序排序(升序、降序),每赠加一个对象都会进行排序,将对象插入到二叉指定的位置。
Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自定义的类必须实现Comparable接口,并且重写comparaTo()函数或者使用匿名内部类实现自定义比较器Comparator ,才可以正常使用。

  TreeSet<Person> treeSet = new TreeSet<>(new Comparator<Person>() {//降序
            @Override
            public int compare(Person o1, Person o2) {

                int result = o2.getAge() - o1.getAge();
                //ctrl + d  ---> 复制当前行!!!!!!!
                result = result == 0 ? o2.getHeight() - o1.getHeight() : result;
                result = result == 0 ? o2.getName().compareTo( o1.getName()) : result;
                return result;
            }
        });
3.Map
3.1HashMap(数组+链表+红黑树)

HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序趋势不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导师数据的不一致。如果需要满足线程安全,可以使用Collections的synchronizedMap方法使HashMap安排具有线程安全的能力,或者使用ConcurrentHashMap。

3.2TreeMap

TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,
也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
如果使用排序的映射,建议使用TreeMap
当key为自定义类时,key必须实现Comparable接口或者在构造TreeMap时传入自动以的Comparator,否则会在运行时抛出ClassCastException类型的异常

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值