- 根接口Collection
常用子接口
1. List
实现类:ArrayList、Vector、LinkedList
2. Set
实现类:HashSet、TreeSet
-
List
ArrayList:底层数据结构是数组,效率高,用于查询,线程不安全(size会变,复合操作不具有原子性)
LinkedList:底层数据结构是链表,用于插入和删除,线程不安全
Vector:底层数据结构是数组,线程安全 ,实际使用还是要加锁,一般不用。 -
Set:无序,元素唯一不能重复。
hashSet:
- 底层数据是哈希表
- 通过两个方法hashCode()和equals()保证元素的唯一性,方法自动生成
- 子类LinkedHashSet底层数据结构是链表和哈希表,由链表保证元素有序,由哈希表保证元素唯一。
使用场景:使用HashSet类随机产生10个不重复的1到20的不重复随机数实例
package test_11_hashset;
import java.util.HashSet;
import java.util.Random;
//使用HashSet类随机产生10个不重复的1到20的不重复随机数
public class HashSetDemo {
public static void main(String[] args) {
Random r=new Random();
HashSet <Integer> hs=new HashSet<Integer>();
while(hs.size()<10) {
hs.add((r.nextInt(20)+1));
}
for(Integer i:hs) {
System.out.println(i);
}
}
}
treeSet:
- 底层数据是红黑二叉树
- 排序方式:自然排序、比较器排序
- 通过比较返回值是否为0来保证元素的唯一性。
使用场景:TreeSet类中自然排序和比较器排序实例
Student类
package test11_Treeset;
//此处实现的为自然排序接口,如果仅仅使用比较器排序此接口可以不实现
public class Student implements Comparable<Student>{
private int age;
private String name;
public Student() {
super();
}
public Student(String name,int age) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Student s) {
//此处的this和s前后位置改变会影响排序方式
int num1=this.age-s.age;
int num2=num1==0?this.name.compareTo(s.name):num1;
return num2;
}
}
1、自然排序
package test11_Treeset;
import java.util.TreeSet;
//TreeSet类存储对象,自然排序
//规定:按照年龄进行排序
public class TreeSetDemo1 {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<Student>();
Student s1=new Student("zfliu",18);
Student s2=new Student("zfliu",20);
Student s3=new Student("zfliu",18);
Student s4=new Student("ZFLIU",18);
Student s5=new Student("Java",18);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for (Student s:ts) {
System.out.println(s.getName()+s.getAge());
}
}
}
2、比较器排序
package test11_Treeset;
import java.util.Comparator;
import java.util.TreeSet;
//TreeSet类存储对象,比较器排序
//规定:按照年龄进行排序
public class TreeSetDemo2 {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
//匿名内部类实现比较器排序接口
public int compare(Student s1, Student s2) {
int num1=s1.getAge()-s2.getAge();
int num2=num1==0? s1.getName().compareTo(s2.getName()):num1;
return num2;
}
});
Student s1=new Student("zfliu",18);
Student s2=new Student("zfliu",20);
Student s3=new Student("zfliu",18);
Student s4=new Student("ZFLIU",18);
Student s5=new Student("Java",18);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for (Student s:ts) {
System.out.println(s.getName()+s.getAge());
}
}
}
网友评论