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());
}