• 16.Set、List、Queue集合;Map.md



    • 单列集合:Collection

      • Set:无序,不可重复

      • List:

        • 有序,可以重复。速度快,因为底层维护的是数组,数组的内存地址是连续的,所以查询的时候快,但是移动的效率低,因为增删的时候需要判断原数组长度是否够用,如果不够,需要将旧的数组拷贝到新的数组中!
        • 适合于查询多余增删的情况
    • 双列集合:Map


    1.Set

    1.2HashSet

    • HashSet的内部是维护一个Object数组

    • 当每次添加的时候,先调用HashCode获取道哈希值,通过这个值进行位运算,获得在哈希表中位置:

      • 如果没有元素在这个位置,那么直接存储

      • 如果有元素存在这个位置,那么调用equals方法,,返回false才添加

    • 哈希表每个元素位置维护一个哈希桶,所以在同一个哈希表元素位置可以添加多个存储对象

    TreeSet

    TreeSet内部是一个红黑树,所以TreeSet可以实现自动排序,分为两种情况:

    • 自然元素:自动实现排序,不需要特别调整。但是需要注意的是对字符串的排序

      • 如果找到相同的字符串,那么从不同位置的字符串开始比较

      • 如果找不到相同的字符串,那么以长度来比较

    • 非自然元素:

      • 实现Comparable 接口,并且重写这个接口的Comparable To方法。
    package per.liyue.code.treeset;
    public class User implements Comparable{
        private int id;
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "{id:" + this.id + " name:" + this.name + "}";
        }
        
        @Override
        public int compareTo(Object o) {
            // TODO Auto-generated method stub
            User com = (User)o;
            return this.id - com.id;
        }
    }  
    
    
    package per.liyue.code.treeset;
    import java.util.TreeSet;
    public class MainPrint {
        public static void main(String[] args){
            //实现Comparable接口
            TreeSet<User> mytreeSet = new TreeSet<>();
            User u1 = new User();
            u1.setId(3);
            u1.setName("z");
            
            User u2 = new User();
            u2.setId(1);
            u2.setName("f");
            
            User u3 = new User();
            u3.setId(2);
            u3.setName("b");
            
            
            mytreeSet.add(u1);
            mytreeSet.add(u2);
            mytreeSet.add(u3);
            
            System.out.println(mytreeSet);      
        }
    }  
    
    
    *实现Comparator 接口实现比较器,并且在创建TreeSet时候传入这个比较器
    
       比较器格式为:
    
    public class 类名 implements Comparator {
        //.....
    
    }  
    
    
    package per.liyue.code.treeset;
    import java.util.Comparator;
    public class MyComparator implements Comparator {
        @Override
        public int compare(Object o1, Object o2) {
            if ((o1 instanceof User) && (o2 instanceof User)) {
                User u1 = (User)o1;
                User u2 = (User)o2;
                return u1.getId() - u2.getId();
            }
            return 0;
        }
        
    }  
    
    
    package per.liyue.code.treeset;
    import java.util.TreeSet;
    public class MainPrint {
        public static void main(String[] args){      
            //实现Comparator接口
            MyComparator c = new MyComparator();
            //带参构造
            TreeSet<User> mytreeSet2 = new TreeSet<>(c);
            User u11 = new User();
            u11.setId(3);
            u11.setName("z");
            
            User u22 = new User();
            u22.setId(1);
            u22.setName("f");
            
            User u33 = new User();
            u33.setId(2);
            u33.setName("b");
                 
            mytreeSet2.add(u1);
            mytreeSet2.add(u2);
            mytreeSet2.add(u3);
            
            System.out.println(mytreeSet2);      
        }
    }  
    
    

    推荐使用比较器,并且在一个类即实现比较接口又实现比较器的时候,以比较器为准!
    比较器和比较接口中如果返回0表示重复,不能添加成功,负整数为小元素,正整数位大元素


    2.List

    2.1ArrayList

    • 底层维护了一个Object数组
      *它的无参构造创建一个对象时候,其底层维护的Object数组默认10,长度不够时候自动增加0.5倍

    2.1.1ArrayList和Vector的区别

    • 二者内部都是维护一个Object数组来实现
    • ArrayList是线程不安全,Vector线程安全。但是后者版本从JDK1.0开始,已经被淘汰。

    2.2LinkedList

    • 链表实现

    3.Queue


    4.各种线性表的性能


    5.Map概念


    6.各类Map的性能


    7.线程安全的集合工具类:Collections


    public static void main(String[] args) {
            Collection c = Collections.synchronizedCollection(new ArrayList());
            List l = Collections.synchronizedList(new ArrayList());
            Set s = Collections.synchronizedSet(new HashSet());
            Map m = Collections.synchronizedMap(new HashMap());
        }
    
  • 相关阅读:
    逝华
    数论知识
    #10081. 「一本通 3.2 练习 7」道路和航线 题解
    Tire 字典树
    Manacher算法
    时间变奏曲
    【算法】莫队
    【算法】深度优先搜索(dfs)
    【算法】数位 dp
    【笔记】关于位运算(2)
  • 原文地址:https://www.cnblogs.com/bugstar/p/8492781.html
Copyright © 2020-2023  润新知