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());
    }
原文地址:https://www.cnblogs.com/bugstar/p/8492781.html