java集合(List集合、Set集合、Map集合)

java集合
    常用集合类
        UML
        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);
}
                    错误,为啥?
                for(int i=0;i<list.size();i++){
   if(list.get(i)==3) list.remove(i--);
}
                    正确,为啥?
                for(int i=list.size()-1;i>=0;i--){
 if(list.get(i)==3){
  list.remove(i);
 }
}
                    正确,为啥?
                for(Integer i:list){
    if(i==3) list.remove(i);
}
                    错误,??
                Iterator<Integer> it=list.iterator();
 while(it.hasNext()){
  if(it.next()==3){
   it.remove();
  }
}
                    ??
                Iterator<Integer> it=list.iterator();
 while(it.hasNext()){
  Integer value=it.next();
   if(value==3){
   list.remove(value);
  }
}
                    ??
                list.remove(2);
                    输出结果是什么?
        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时,就需要使用LinkedHashMap了
                     Map<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
        使用示例
            filter
            sorted
            distinct
            min,max,count
            group

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值