集合分类
常用集合一般分为分为两个大类即单列集合Collection和和双列结合Map;Map是以键值对的方式存储数据。而对于单列集合Collection则有有序集合LIst,和无序集合Set集合两种。下面将对两种集合进行简单总结。
单列集合Collection
list集合
list是有序集合其常用为Arraylist和LinkedList
两种,Arraylist的底层是数组形式的集合,初始长度为零会在首次使用add()方法时将数组长度设置为10,以后当存储的数据长度大于数组的长度Arraylist会自动扩容为当前容量的1.5倍。而LinkedList
底层是链表结构,没有长度限制。
Arraylist和LinkedList区别;
数组(ArrayList)的随机访问时因为数组可以通过索引查找元素因而速度非常快,但是指定位置添加、删除操作时需要将后续元素全部顺移。可概括为查询快,增删慢
LinkedList则恰恰相反,我们在使用链表做指定位置的添加删除操作时,所需的操作非常少,但随机访问时因为链表没有索引需要从头开始逐个遍历因而查询速度慢。可概括为查询慢,增删快
set集合
Set接口有两个实现类:HashSet: 依靠hash值进行存储的,如果两个元素hash值一样的话,就不再存储了,但实际的哈希值计算是以内存地址为根据,因此会导致即使成员属性一样但因为地址值不同而重复存储的情况,因此要使用Set去除重复元素的特性就必须在javaBean中重写hashcode方法。如下:
public class student {
private int age;
private String name;
public student() {
}
public student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
student student = (student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, 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;
}
@Override
public String toString() {
return "student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
TreeSet:底层是二叉树,对存储数据进行自然排序,
public static void demoOne() {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("张三", 11));
ts.add(new Person("李四", 12));
ts.add(new Person("王五", 15));
ts.add(new Person("赵六", 21));
System.out.println(ts);
}
要是直接使用就会因为无法确定排序方式而报ClassCastException异常,需要指定比较的规则,即需要在自定义类(Person)中实现Comparable
接口,并重写接口中的compareTo方法。
public class student implements Comparable<student>{
private int age;
private String name;
public student() {
}
public student(int age, String name) {
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;
}
@Override
public String toString() {
return "student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(student o) {
return this.age-o.age==0?this.name.compareTo(o.name):this.age-o.age;
}
}
PS:注意返回值的区别只是正负与值的大小无关,当返回值为0时表示重复不会进行存储,而且在比较时会把要存储的对象依次与已经存好的对象进行比较。从而进行排位
或使用比较器排序
String s1="a";
String s2="cd";
String s3="bd";
String s4="qwrw";
String s5="chicken";
reeSet<String>s=new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int result=o1.length()-o2.length()==0?o1.compareTo(o2):o1.length()-o2.length();
return result;
}
});
当然也可以使用 lambda表达式简化
TreeSet<String>s=new TreeSet<>(
(o1,o2)
->
o1.length()-o2.length()==0?o1.compareTo(o2):o1.length()-o2.length()
);
以上是对单列集合Collection的知识整理