JAVA集合重要知识点

本文详细介绍了Java集合框架体系,包括ArrayList与LinkedList的异同,HashSet、TreeSet、LinkedHashSet的特点及原理,HashMap、TreeMap、LinkedHashMap、HashTabel的特性,还阐述了List、Set和Map的遍历方法,为Java开发者提供了全面的集合知识。

1.集合框架体系

在这里插入图片描述

2.ArrayList与LinkedList

*ArrayList和LinkedList的相同点和不同点

共同点:都是单列集合中List接口的实现类。存取有序,有索引,可重复、线程不安全
不同点:
1.底层实现不同:
ArrayList底层实现是数组,LinkedList底层是双向链表,有头尾指针。
2.ArrayList查询快,增删慢。
查询快:数组随机访问,通过数组地址和元素索引计算出元素地址,进行访问。
增删慢:增删不在尾部,都需要移动元素,如果数组容量不足,还需要扩容。(扩容非常影响效率)
扩容:
(1)分配一个原数组1.5倍大小的新数组 (2)将原数组的内容拷贝到新数组
3.LinkedList查询慢,增删快
查询慢:从头或尾依次寻址。
增删快:只需要修改几个指针的指向。

3.HashSet、TreeSet、LinkedHashSet

*HashSet特点及原理
1.特点:无序、唯一、可以有空值、线程不安全
2.唯一性原理:底层依靠HashMap实现,通过hashcode()和equals()方法保证元素唯一,保存元素时,先使用hashcode()判断,若返回值不同则直接保存;若返回值不同则使用equals()判断,若返回true则不保存,返回false则保存
*TreeSet特点及原理
1.特点:有序、唯一、不能有空值、线程不安全
2.有序性原理:底层用二叉树实现,TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
3.使用方式
a.自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
c.两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator
*LinkedHashSet
LinkedHashSet继承自HashSet,源码更少、更简单,唯一的区别是LinkedHashSet内部使用的是LinkHashMap。这样做的意义或者好处就是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。

4.HashMap、TreeMap、LinkedHashMap、HashTabel

*Map集合的特点
map集合特点就是采用了 Key-value键值对映射的方式进行存储
key在Map里面是唯一的但是value可以重复,一个key对应一个value。

*Hashmap的特点
无序、key值唯一,通过hashcode()和equals()方法保证key唯一,保存元素时,先使用hashcode()判断,若返回值不同则直接保存;若返回值不同则使用equals()判断,若返回true则不保存,返回false则保存

*HashMap和HashTabel的区别
1.hashtable不允许null值(key和value都不可以),hashmap允许null值(key和value都可以)。
2.hashmap线程不安全,hashtabel线程安全

*TreeMap 简介
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆。
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。

*LinkedHashMap
LinkedHashMap是HashMap的子类,内部还有一个双向链表维护键值对的顺序,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现

集合遍历

*List与Set的遍历方法
方法一:
超级for循环遍历
for(String attribute : list) {
System.out.println(attribute);
}
方法二:
对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:
for(int i = 0 ; i < list.size() ; i++) {
system.out.println(list.get(i));
}
方法三:
集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()) {
System.ou.println(it.next);
}
*Map遍历的方法
方法一:
Map集合的遍历之键找值
Setkeyset=m.keySet();
for(Integer key:keyset) {
System.out.println(key+"–"+m.get(key));
}
方法二:
Map集合的遍历之键值对对象找键和值
Set<Map.Entry<Integer, String>>es=m.entrySet();
for(Map.Entry<Integer, String> en:es) {
Integer key=en.getKey();
String value=en.getValue();
System.out.println(key+"–"+value);
}
方法三:
Map集合的遍历之values取值
Collectionva=m.values();
for(String value:va) {
System.out.println(value);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值