集合框架List Set Map

本文深入讲解Java集合框架,包括Collection和Map接口,探讨ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、Hashtable等数据结构的特点与使用场景。

集合框架概述

java视频笔记 https://www.bilibili.com/video/av48065654/

集合是队多个数据进行存储操作的结构,简称java容器,是内存层面的存储。
集合可分为Collection接口Map接口
Collection接口:单列数据分为ListSet
List:有序、可重复
Set:无序、不可重复
Map接口:双列数据,保存具有映射关系"key-value对"集合

Collection接口继承树

在这里插入图片描述

Map接口继承树

在这里插入图片描述

List接口

ArrayList

线程不安全,查询效率高,增删慢

ArrayList(jdk7)

添加方法为list.add(),初始容量为10,若超过初始容量,则扩容为1.5倍,并将原有宿主复制到新的数组中。

ArrayList(jdk8)

初始化为{},第一次调用add方法再赋值初始容量,若超过初始容量,则扩容为1.5倍,并将原有宿主复制到新的数组中。

LinkedList

双向列表,线程不安全,查询效率低,增删快

vector

线程安全,效率低

List遍历

Iterator迭代器

 Iterator iterator = list.iterator();
 while (iterator.hasNext()){
      System.out.println(iterator.next());
  }

for循环

 int len = list.size();
 for (int i=0;i<len;i++){
     System.out.println(list.get(i));
 }

foreach循环

 for (Object o:list){
            System.out.println(o);
 }

List遍历时删除

public void testDel() {
        List<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(2);
        list.add(3);
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer integer = iterator.next();
            if (integer == 2)
                iterator.remove();
        }
    }
 
执行后结果: list = [1,3]

参考 https://blog.csdn.net/zcyzsy/article/details/82790381

Set接口

HashSet

线程不安全,可以存null值。基于hashmap添加,通过hash值来添加,底层是个数组。
**添加元素过程:**先调用hashCode()方法计算hash值,然后通过某种算法计算出在数组中存放位置,判断该位置上是否有元素:
如果没有,则添加成功
如果有,先比较hash值,
如果不同,则添加成功,以链表的形式;
如果相同,则通过equals()判断
如果equals()返回true,则添加失败,否则添加成功,以链表的形式

LinkedHashSet

HashSet的子类,遍历时可以按照添加顺序遍历,添加数据的同时还维护了两个引用,记录前后数据,对于频繁遍历,效率高于hashSet

TreeSet

底层是红黑树,可以按照添加对象的指定属性,进行排序。

  1. 向TreeSet添加数据只能为相同类的对象
  2. 自然排序和定制排序
  3. 自然排序实现Comparable中compareTo()方法,判断相等是compareTo()不是equals()
  4. 定制排序使用中compare()方法,不是equals()

Map接口

map结构理解:
key:无序,不可重复,使用set存储所有的key
value: 无序,可以重复,使用Collection存储所有的value
entry:无序,不可以重复,使用set存储entry

HashMap

线程不安全,效率高,可以存储null的key和value
HashMap底层:数组+链表+红黑树

HashMap底层原理(jdk7)
HashMap map = new HashMap();
实例化后,底层创建了长度是16的Entry[] table数组.
map.put(key1,value1)添加元素时,先使用hashCode()计算key1的hash值,经过算法之后,得到在Entry数组中的存放位置
如果此位置上数据为空,此时entry添加成功
如果不为空,比较当前key1和链表中数据的key的hash值
如果hash值都不同,添加成功,以链表方式
如果相同,调用key所在类的equals()方法
如果返回false,添加成功,以链表方式
如果返回true,将value1替换value值
扩容:容量为2倍,原来数据复制过来

HashMap底层原理(jdk8相较于7)

  1. 底层没有创建数组
  2. 底层数组是Node[]
  3. 首次调用put()时才在创建数组
  4. 底层增加了红黑树,当索引位置上元素以链表存储数据个数 > 8 且数组长度 > 64改为红黑树存储,查找效率高

遍历HashMap

 public void test() {
        HashMap<String, Object> map = new HashMap();
        map.put("AAA",111);
        map.put("BBB",222);
        //迭代器 推荐
        Iterator iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry next = (Map.Entry)iterator.next();
            System.out.println(next.getKey() +".."+next.getValue());
        }
        //调用entrySet()方法的map必须是泛型
        for (Map.Entry entry :  map.entrySet()) {/*---*/
            System.out.print("key= " + entry.getKey() + " and value= " + 			 entry.getValue() + "; ");
        }
        //遍历value
        for(Object o: map.values()){
            System.out.println(o);
        }
        //key集合再获取value,速度慢
        for(Object key:map.keySet()){
            System.out.println(key+".."+map.get(key));
        }

    }

LinkedHashMap

保证遍历map时,按照添加顺序实现遍历,添加了指向前后指针,频繁操作效率高于LinkedHashMap

Hashtable

线程安全,效率低,不可以存储null的key和value

propertise

常用来处理配置文件,key和value都是String类型

TreeMap

保证按照添加的key-value排序,key的自然排序或者定制排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值