通俗易懂Java集合框架整体梳理

Java集合框架总结


集合框架图

在这里插入图片描述

Collection接口

Collection是根接口,本身提供了一些方法,因此所有子类集合都会拥有这些方法。
常用方法:

  • add(): 添加一个元素到集合中
  • addAll(): 将指定集合中所有元素添加到集合中
  • contains(): 检测集合中是否包含指定的元素
  • toArray(): 集合转数组
  • iterator(): 迭代器遍历集合。
List接口

List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
在这里插入图片描述

Set接口

Set元素不能重复,允许为null仅有一个。它维持它自己的内部顺序,所以随机访问没有任何意义。虽然Set中元素没有顺序,但是元素在set的位置是由该元素的HashCode决定的,其具体位置其实是固定的。
虽然对象是不一样的,但是可能存在重写了HashCode后,导致不同对象的对象生成的HashCode是一样的的,这样不能同时放入到Set集合中。
在这里插入图片描述

Map接口

它是由一系列键值对组成的集合,提供了key到value的映射。
不能存在相同的key值,当然value值可以存在。
在这里插入图片描述
我们所熟知的缓存技术(比如redis、memcached)的核心其实就是在内存中维护一张巨大的哈希表。

ConcurrentHashMap与HashMap区别

HashMap:线程不安全的,在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。
HashTable: HashTable和HashMap的实现原理几乎一样,差别无非是
HashTable不允许key和value为null;HashTable是线程安全的。
但是HashTable线程安全的策略实现代价太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁。
ConcurrentHashMap: 主要是为了应对hashmap在并发环境下不安全而诞生的。大量利用了volatile,final,CAS等lock-free技术减少锁竞争对于性能的影响。

HashMap排序题

已知一个HashMap<Integer,User>集合,User有name(String)和age(int)属性,根据age大小进行倒序进行排序,返回排序后的HashMap<Integer,User>

 public class HashMapTest {

    public static void main(String[] args) {

        HashMap<Integer,User> hashMap = new HashMap<>();
        hashMap.put(1,new User("zhangsan",25));
        hashMap.put(2,new User("lisi",23));
        hashMap.put(3,new User("wangwu",27));


        //根据user的 age 倒序排序
        LinkedHashMap<Integer,User> linkedHashMap = new LinkedHashMap<>();

        //拿到hashmap中的值
        Set<Map.Entry<Integer, User>> entries = hashMap.entrySet();

        //将set集合转化为List集合
        ArrayList<Map.Entry<Integer, User>> entryArrayList = new ArrayList<>(entries);
        //排序 使用Collections
        Collections.sort(entryArrayList, new Comparator<Map.Entry<Integer, User>>() {
            @Override
            public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
                return o2.getValue().getAge() - o1.getValue().getAge();
            }
        });
        for (Map.Entry<Integer, User> entry:entryArrayList) {
            linkedHashMap.put(entry.getKey(),entry.getValue());
        }

        System.out.println(linkedHashMap);
    }


}

大部分参考:https://www.cnblogs.com/xiaoxi/p/6089984.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值