本周总结
一、linklist
1、特点
线程不安全的类,执行效率高
链接列表结构,查询慢,增删块
2、特有功能
public void addFirst(Object e):在列表开头插入元素
public void addLast(Object e):将元素追加到列表的末尾
public Object getFirst();获取列表的第一个元素
public Object getLast():获取列表的最后一个元素
public Object removeFirst():删除列表的第一个元素,并获取第一个元素
public Object removeLast():删除列表的醉后一个元素,并获取最后一个元素
public class LinkedListDemo {
public static void main(String[] args) {
//创建一个LinkedList集合对象
LinkedList<String> link = new LinkedList<>() ;
//添加元素
// public void addFirst(Object e):在列表开头插入元素
link.addFirst("hello") ;
link.addFirst("world") ;
link.addFirst("JavaEE") ;
link.addFirst("Android") ;
link.addLast("Php") ;
//public Object getFirst():获取列表的第一个元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
// 删除列表的第一个元素,并获取第一个元素
System.out.println(link.removeFirst());
// 删除列表的醉后一个元素,并获取最后一个元素
System.out.println(link.removeLast());
System.out.println(link);
}
}
二、Set集合
1、特点
无序,存储和取出不一致,能够保证元素唯一
2、子实现类
1)HashSet
概述 : 不保证set的迭代顺序
底层数据结构是一个哈希表(桶结构)是线程不安全的类,不同步,执行效率高
如何保证元素唯一性?
底层数据结构是哈希表(元素是链表的数组)
哈希表依赖于哈希值存储
添加功能底层依赖方法:int hashCode()
boolean equals(Object obj)
2)linkedHsahSet
概述 :元素有序唯一
由链表保证元素有序
由哈希表保证元素唯一
3、 TreeSet类
TreeSet集合:无序性,元素唯一
底层依赖于TreeMap集合,红黑树结构(也称为“自平衡的二叉树结构”),可以实现Map的自然排序以及比较器排序取决于使用的构造方法
构造方法:
public TreeSet():构造一个空的树,实现元素的自然排序(取决于存储的元素类型能否实现Comparable接口)
自然排序——》执行的TreeSet无参构造方法,而且前提条件当前存储类型必须实现Comparable接口
public class TreeSetDemo {
public static void main(String[] args) {
//Integer类型
TreeSet<Integer> ts = new TreeSet<>() ;
//Intger元素 实现Comparable接口---就能够按照元素自然排序(默认升序排序)
//添加元素
ts.add(85) ;
ts.add(17) ;
ts.add(17) ;
ts.add(21) ;
ts.add(65) ;
ts.add(23) ;
ts.add(94) ;
ts.add(19) ;
//遍历集合TreeSet
for(Integer i:ts){
System.out.println(i);
}
}
}
TreeSet能够实现两种排序:
自然排序和比较器排序,取决于构造方法
自然排序:
TreeSet< E>(),E类型必须实现Comparable接口,实现自然排序(实现compareTo(T t))
比较器排序:
public TreeSet(Comparator<? super E> comparator)
Comparator是一个接口类型
1)自定义一个类实现Comparator接口,重写compare方法
2)使用接口的匿名内部类
泛型高级通配符
- <?> :任意Java类型,包括Object
- <? super E> : 向上限定:E类型以及E父类
- <? extends E>: 向下限定:E以及它的子类
定义几个学生,按年龄大小进行排序
public class Student {
private String name ;//姓名
private int age ;//年龄
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name.equals(student.name);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + age;
return result;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//主要条件:按照学生的年龄从小到大排序
//s1---->就是刚才自然排序里面this
//s2---->就是刚才自然排序里面s
int num = s1.getAge() - s2.getAge() ;
//如果年龄相同,比较姓名是否一样
int num2 = (num==0)? (s1.getName().compareTo(s2.getName())): num ;
return num2;
}
}) ;
Student s1 = new Student("zhangsan",21) ;
Student s2 = new Student("liumei",19) ;
Student s3 = new Student("wangtian",23) ;
Student s4 = new Student("lixiao",15) ;
Student s5 = new Student("abcd",20) ;
Student s6 = new Student(&#