java集合框架

java集合框架

本期内容
集合类图

在这里插入图片描述

List集合
  • 特点:元素有序,且可重复

  • 遍历:下标,foreach,迭代器

扩容:
  • 初始容量10,负载因子0.5,扩容增量0.5倍
  • 新容量 = 原容量 + 原容量 * 0.5 , 如 ArrayList的容量为10,一次扩容后是容量为15
实现:
ArrayList

​ 简单数据结构,超出容量自动扩容,动态数组
​ 内部实现是基于基础的对象数组的
​ 随机访问快
​ 不适合随机增加或删除
​ 线程不安全

LinkedList

​ LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
​ 线程不安全
​ LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue)或双向队列(deque)
​ 以双向链表实现,链表无容量限制,允许元素为null,线程不安全
​ 适合做随机的增加或删除

Vector

​ 线程安全
但行性能慢,不建议使用

CopyOnWriteArrayList

​ 写时复制
​ 线程安全
​ 适合于读多,写少的场景
​ 写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
​ 比Vector性能高
​ 最终一致性
​ 实现了List接口,使用方式与ArrayList类似

ArrayList remove 的注意点
列举:
  • ​ 数据准备:为方便演示,需要有紧挨在一起的两个或多个相同的元素
  List<Integer> list=new ArrayList<Integer>();
  list.add(1);
  list.add(2);
  list.add(3);
  list.add(3);
  list.add(4);

for(int i=0;i<list.size();i++){
   if(list.get(i)==3) list.remove(i);//当他删除之后 我们的另一个三就会挤上去  所以输出的是                                              [1,2,3,4]
}
可以删除 为啥?
 下标变了 

Set

特点:

无序,不重复

思考:

如果对List容器中的元素去重?上方有操作

遍历:

foreach,迭代器
扩容:

初始容量16,负载因子0.75,扩容增量1倍
实现:

​ HashSet

  • ​ 它存储唯一元素并允许空值

  • ​ 依据对象的hashcode来确定该元素是否存在

  • ​ 由HashMap支持

  • ​ 不保持插入顺序

  • ​ 非线程安全

  • ​ 性能参数:初始容量,负载因子

  • ​ 默认值: 初始容量16,负载因子0.75

    ​ 示例:new HashSet<>(20, 0.5f);

TreeSet

​ 是一个包含有序的且没有重复元素的集合
​ 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
​ TreeSet是基于TreeMap实现的

Map
特点:

​ 无序,键值对,键不能重复,值可以重复,
​ 键重复则覆盖,没有继承Collection接口
​ 扩容:初始容量16,负载因子0.75,扩容增量1倍

遍历:

​ 先获取所有键的Set集合,再遍历(通过键获取值)
​ 取出保存所有Entry的Set,再遍历此Set即可

实现:
HashMap

​ 线程不安全,最常用,速度快
​ 内部采用数组来存放数据
​ 基本原理

put执行过程 图:

在这里插入图片描述

​ Table数组中的的Node

  • 链表结构示意图:

在这里插入图片描述

  • 红黑树结构示意图:

在这里插入图片描述

​ 流程图中绿色标出的部分为JDK8新增的处理逻辑,目的是在Table[i]中的Node节点数量大于8时,通过红黑树提升查找速度。


HashTable:

​ 线程安全,不太常用

ConcurrentHashMap:

​ 线程安全,比HashTable性能高

TreeMap:

​ key值按一定的顺序排序
​ 添加或获取元素时性能较HashMap慢
​ 因为需求维护内部的红黑树,用于保证key值的顺序

LinkedHashMap:
		继承HashMap
			LinkedHashMap是有序的,且默认为插入顺序
				当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMapMap<String, String> linkedHashMap = new LinkedHashMap<>();
             linkedHashMap.put("name1", "josan1");
             linkedHashMap.put("name2", "josan2");
             linkedHashMap.put("name3", "josan3");
             Set<Entry<String, String>> set = linkedHashMap.entrySet();
             Iterator<Entry<String, String>> iterator = set.iterator();
              while(iterator.hasNext()) {
            Entry entry = iterator.next();
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            System.out.println("key:" + key + ",value:" + value);
        }
排序:

​ java.lang.Comparable
​ java.util.Comparator

工具类:
Collections

​ 提供一组静态方法操作集合

Arrays

​ 提供一组静态方法操作数组

jdk8:stream
介绍
jdk8添加的一个新的功能,称之为流,可以以声明的方式来处理数据,提供一种对 Java 集合运算的方便处理方式

​ 让程序员写出高效率、干净、简洁的代码

特点

​ 可以方便的对集合进行并行操作,便于使用多核资源
​ 惰性求值
​ 不是数据结构,不保存数据
​ 不会修改原来的数据源,将操作后的数据保存到另一个对象中

操作
中间操作(Intermediate)

​ map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 skip、 parallel、 sequential、 unordered

最终操作(Terminal)

​ forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、iterator

特点:

​ 在一次聚合操作中,可以有多个Intermediate,但是有且只有一个Terminal

⭐⭐⭐⭐⭐本期类容到此结束⭐⭐⭐⭐⭐
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷亿!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值