Java集合模块的深度学习

集合:

  1. 集合主要分成两组(单列集合collection,双列集合map)

  2. Collection 接口有两个重要的子接口List Set,他们的实现子类都是单列的集合

  3. Map 接口的实现子类 都是双列集合,存放的K-V

  4. 把老师梳理的两张图记住!

Collection的常用方法:
添加和删除:

add 和remove ,remove可以根据下标或者指定元素来进行删除

查找,判断是否为空,清空元素,获得集合长度

常传入另一个集合~

(iterator)迭代器

  1. coll为要遍历的集合~

  2. 一开始,iteerator指向的是集合第一个元素的前一个位置

增强for循环:

List集合的特点和方法:

List的三种遍历方式:

返回的类型是object类型,要进行向下转型才可以调用原类里的成员

Arrayslist的注意事项:

Vector于arrayslist的比较!:

LinkList的底层结构:

Arrayslist和LinkList的比较:

Set接口和方法:
  1. 无序(添加和取出的元素的顺序不一样),并且没有索引

  2. 不允许有重复元素,所以最多包含一个nul

  3. 虽然取出的顺序不是添加的顺序,但是顺序是固定的,不会因为取的次数而改变

  4. set没有get()方法,所以set不能使用普通的for循环进行遍历

  5. 只能使用迭代器和增强for的方法进行遍历

hashset:实现了set接口

  1. 在执行add方法后会返回一个布尔值表示是否加入成功(成功 true 失败 false)

add方法的奥秘:如何判断是否加入相同数据的?
  1. hashset的底层是hashmap,hahsmap的底层是数组加链表加红黑树!

数组加链表的实现机制:1.创建一个链表数组,2将对应下标的数组进行链表方式的存结点,太妙 了!!

添加多少个结点,这个size就会加一。

重写hashcode和equals方法!

  1. 对象不同,hashcode这个值就会不同

在值存入哈希表中的时候,是现根据哈希值确定一个索引,然后根据索引找到表中的位置,如果位置为空则直接加入,否则根据equals方法挨个进行比较内容,内容不同则加到链表尾部,否则不加入!

  1. 可以看出,是否可以加入哈希表取决于hashcode的值跟equals的比较方法!

LinkedHashset:

注意

  1. linkhashset**内容是有序的!

  2. hashcode确定索引,equals确定同索引下元素的比较!

  3. 如果只重写hashcode方法,后面有相同内容的对象,是可以储存到表中的,只不过是存放到相同的链表中

  4. 如果只重写equals方法,创建一个对象就放到hash后的表中的索引,,这时候不管内容是否相同或者不同了,因为底层自带的哈希code方法,是根据对象是否相同来创建的,只要对象不同,hashcode值就不同!

  5. equals默认比较的是是否是同一个对象,要比较内容要重写equals方法!

Map!

  1. Map与collection并列存在,Map用与保存具有映射关系的数据(键值对)key—-value(双列元素)、

  2. Map中的key和value可以是任何引用类型的数据,会封装到hashnode对象中

  3. Map中的key不允许重复,但是如果重复了,也就是key的值相同时,等价于替换,会将value的值替换上去

  4. 但是value的值是可以相同的,Map存储的时候是根据key的哈希值来确定索引的,所以value的值不影响存放

  5. Map的key可以为null,value也可以为null,但是key为null时,只能有一个,value为null时可以多个!

  6. 常用String类作为Map的key

  7. key和value之间存在单向一对一的关系,即通过指定的key总能找到对应的value,通过Map的get方法,传入一个key,会返回对应的value值

Map接口和常用方法:

Map的遍历方式:

 

 
HashMap map=new HashMap<>();
        map.put("zzz","z");
        map.put("ccc","v");
        map.put("xxx","c");
        map.put("bbb","e");
        Set keySet = map.keySet();//map的方法,用来获得所有key的一个set集合
        //通过获得键的方式,然后获得值
        for (Object o :keySet) {
            System.out.println(o+"-"+map.get(o));
        }
        Iterator iterator = keySet.iterator();
        while (iterator.hasNext()){
            Object key=iterator.next();
            Object value=map.get(key);
            System.out.println(key+"-"+value);
        }
        //可以直接获得值
        Collection values = map.values();
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
        for (Object o :values) {
            System.out.println(o);
        }
        //通过entryset遍历
        Set entrySet = map.entrySet();//获得一个key和value的封装集合
//目的是为了更好的遍历,底层时存储在node数组里的,但是运行类型是Entryset,所以下面要是想要调用entry里的getkey和getvalue方法,先要向下转型一次(调用子类的特有方法跟属性时要向下转型才可调用!)
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()){
            Map.Entry e=(Map.Entry) iterator2.next();
            System.out.println(e.getKey()+""+e.getValue());
        }
        for (Object o :entrySet) {
            Map.Entry e=(Map.Entry) o;
            System.out.println(e.getKey()+""+e.getValue());
        }

HashMap的底层机制:

HashMap底层源码解读:

非常重要!!HashMap!

HashTable:

注意:hashtable的键跟值都不能为空!

HashMap的底层和扩容原理:

Properties:

Treeset:

TreeMap:

Key类型决定默认排序类型

Collection类:

开发中如何选择集合:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值