学习笔记:集合总结

List

1.ArrayList
底层使用数组实现存储。
特点:查询效率高,增删效率低,线程不安全,通常使用
与数组差异点在于,数组长度是有限的,需要给定一个长度,但是ArrayList可以存放任意长度的对象,没有长度限制,底层实现方式是将原数组内容复制到一个更大的数组中。

2.LinkedList
底层使用双链表实现存储。
双链表:每个数据节点都有两个指针,分别指向前一个节点和后一个节点。
特点:查询效率低,增删效率高,线程不安全。

3.Vector
底层也是数组实现。
相关的方法都添加了同步检查,线程安全,效率低。

Map

存放键值对,键不可重复。(如果重复,则新的键值对覆盖旧的键值对)
1.HashMap
底层采用Hash表。数组+链表的组合,数组+二叉树的组合。链表为单链表
常见hash算法:
(1)取余:hash值 = hashcode % 数组长度
(2)位运算(数组的长度必须为2的整数幂):
hash值 = hashcode & (数组长度-1)

扩容问题
HashMap的位桶数组初始大小为16,当数组的使用达到(0.75*数组lenth)时会扩容到原数组大小的两倍,原理就是定义新的数组,然后将原数组内容复制到新数组中。
链表转换红黑树
jdk8以后,当链表的长度大于8时,将会自动转换为红黑树。
二叉树

取数据的过程取数据的过程
2.HashTable
HashTable线程安全效率低,不允许key和value为空,底层和HashMap几乎一致。加了同步检查(synchronized)
HashMap线程不安全,效率高,允许key和value为空。

3.TreeMap
使用红黑二叉树实现。
使用场景:如果要对map中的内容做排序的时候,可以使用TreeMap。
按照key递增的方式排序放入。
如果想要按照自己需要的属性进行排序,则需要使用Comparable接口去重写compareto方法去自定义比较的属性。
实现Comparable接口去自定义排序规则

Set

没有顺序,不可重复。内部没有索引,如果新元素通过equals方法比较后和Set中已经有,那么则新元素不可加入,连null也只能放一个。
1.HashSet
HashSet底层使用了一个HashMap,HashSet中的所有元素作为HashMap中的key,Value由一个固定值代替。

2.TreeSet
TreeSet底层使用TreeMap实现,也是按照key递增排序,可以实现Comparable接口进行自定义的排序。参见TreeMap。

迭代器

1.遍历List

//方法一,使用普通for循环
    public void method1(ArrayList<Integer> list){
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    //方法二,增强for循环
    public void method2(ArrayList<Integer> list){
        for (Integer in:list) {
            System.out.println(in);
        }
    }

    //方法三:使用迭代器
    public void method3(ArrayList<Integer> list){
        for (Iterator<Integer> iter =list.iterator();iter.hasNext();) {
            System.out.println(iter.next());          //next方法即返回迭代的下一个元素
        }
    }

    //方法四:使用迭代器(2)
    public void method4(ArrayList<Integer> list){
        Iterator<Integer> iter =list.iterator();
        while (iter.hasNext()){
            System.out.println(iter.next());
            //如果遍历删除某元素,使用这种方法
            //iter.remove();
        }
    }

遍历List的其他方式
2.遍历Set

 //方法一,增强for循环
    public void method1(HashSet<Integer> set){
        for (Integer s:set) {
            System.out.println(s);
        }
    }
    //方法二,迭代器
    public void method2(HashSet<Integer> set){
        for (Iterator<Integer> iterator = set.iterator();iterator.hasNext();) {
            System.out.println(iterator.next());
        }
    }

3.遍历Map

//方法一,根据key获取value
    public void method1(HashMap<Integer,String> map){
        Set<Integer> keySet = map.keySet();    //获得key的Set集合
        for (Integer key:keySet) {
            System.out.println(key+":"+map.get(key));
        }
    }
    //方法二,使用entrySet
    public void method2(HashMap<Integer,String> map){
    	//获得节点的Set集合,然后遍历节点即可
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();iterator.hasNext();){
            System.out.println(iterator.next());
        }
    }

Collections工具类

常用方法::

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值