目录
1.集合体系结构
2.Collection集合
(1)迭代器
(2)增强for
(3)lambda表达式
3.List集合
4.数据结构
5.ArrayList集合
6.LinkedList集合
7.泛型深入
8.数据结构(树)
(1)二叉树
(2)平衡二叉树旋转机制
(3)红黑树
9.Set系列集合
(1) HashSet
(2)LinkedHashSet
(3)TreeSet
非原创,为方便后期复习
1. List系列集合:添加的元素是有序、可重复、有索引。
(有序:“存”和“取”的顺序一样)
2. Set系列集合:添加的元素是无序、不重复、无索引。
什么是数据结构?
计算机存储、组织数据的方式。
添加“aaa”,在LinkedList里的尾节点是null,所以l=last=null,尾结点last=newNode=0x0011,因为l==null,所以头结点为first=0x0011。
添加“bbb”,l=last=0x0011,尾结点last=newNode=0x0022,不满足l==null,所以l.next=newNode(就是0x0011.next=0x0022)
添加“ccc”,l=last=0x0022,尾结点last=newNode=0x0033,不满足l==null,所以l.next=newNode(就是0x0022.next=0x0033)
1.泛型中不能写基本数据类型,因为数据在存入之后会变成Object类型,int无法转Object类型,要写成Integer包装类才可以转Object。
2.存入数据的时候,会检查数据类型,数据进入后会转成Object类型,取出时又强转回一开始的数据类型。
3.指定泛型类型后,可以传入该类类型或者子类类型。比如Animal类型,还可以传cat,dog类型。
4.如果不写泛型,就默认为Object类型。
泛型方法:1.在类名后面定义泛型(所有方法都能用)
2.在方法后面定义泛型(只有本方法能用)
练习:定义一个工具类:ListUtil,类中定义一个静态方法addAll,用来添加多个集合的元素
方式1:public class MyArrayList1 implements List<String>{} 类型可替换
方式2:public class MyArrayList2
implements List {}
1.普通二叉树,没有规律,只能遍历查找,麻烦。
2.二叉查找树,方便,查找方法,拿数据跟根节点比较,比根节点小/大,就跟左/右子节点比较......
度<=2就是二叉树
普通二叉树,查找效率低,只能遍历。
二叉查找树,效率提升,但是存储时可能会造成左右子树的高度差很大,查询效率也降低。
平衡二叉树,任意节点子树的高度差不能超过1。
平衡二叉树缺点:添加节点时,旋转次数太多,导致添加节点时间浪费。
添加节点默认红色,效率更高
1.加载因子0.75,就是扩容,比如数组长度为16,16*0.75=12,12个位置都存满了就扩容,
扩大2倍,16*2 =32
重写是为了使用属性值进行计算,或者比较是否相等。不重写,就是用地址值计算,或比较
(用hashcode获得哈希值,哈希值确定数据存储在数组中的位置,用equals比较数据内部属性值是否相同)
hashset中存储自定义对象,一定要重写hashcade和equals
创建集合,需要去重,用hashset,不需要就用ArrayList
练习:创建一个存储学生对象的集合,存储多个学生对象,遍历该集合。
要求:学生对象的成员变量值相同,我们就认为是同一个对象。
import java.util.HashSet;
public class Test {
public static void main(String[] args){
Student s1=new Student("zhangsan",20);
Student s2=new Student("lisi",23);
Student s3=new Student("zhaowu",21);
Student s4=new Student("zhaowu",21);
HashSet hs=new HashSet<>();
System.out.println(hs.add(s1));
System.out.println(hs.add(s2));
System.out.println(hs.add(s3));
System.out.println(hs.add(s4));
System.out.println(hs);
}
}
练习:存储整数并进行排序
import java.util.Iterator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args){
TreeSet ts=new TreeSet<>();
ts.add(5);
ts.add(1);
ts.add(3);
ts.add(2);
ts.add(4);
System.out.println(ts); //结果:[1, 2, 3, 4, 5]
//迭代器
Iterator it=ts.iterator();
while (it.hasNext()){
Object i = it.next();
System.out.println(i);
}
//增强for
for (Integer t : ts) {
System.out.println(t);
}
//lambda
ts.forEach(i-> System.out.println(i));
}
}
练习:TreeSet对象排序练习题
需求:请自行选择比较器排序和自然排序两种方式;
要求:存入四个字符串,“c”,“ab”,“df”,“qwer”
按照长度排序,如果一样长则按照首字母排序
import java.util.Comparator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args){
TreeSet ts=new TreeSet<>(new Comparator() {
@Override
//o1是要添加的数据,o2是已经存在于红黑树的数据
public int compare(String o1, String o2) {
int i=o1.length()-o2.length();
i=i==0?o1.compareTo(o2):i;
return i;
}
});
ts.add("c");
ts.add("ab");
ts.add("df");
ts.add("qwer");
System.out.println(ts);//结果:[c, ab, df, qwer]
}
}
练习:需求:创建5个学生对象
属性:(姓名,年龄,语文成绩,数学成绩,英语成绩),
按照总分从高到低输出到控制台
如果总分一样,按照语文成绩排
如果语文一样,按照数学成绩排
如果数学成绩一样,按照英语成绩排
如果英文成绩一样,按照年龄排
如果年龄一样,按照姓名的字母顺序排
如果都一样,认为是同一个学生,不存。
public class Test {
public static void main(String[] args){
Student s1=new Student("zhangsan",18,89,85,88);
Student s2=new Student("lisi",22,97,65,78);
Student s3=new Student("wangwu",20,79,99,44);
Student s4=new Student("zhaoliu",19,69,95,78);
Student s5=new Student("qianqi",25,79,75,74);
TreeSet ts=new TreeSet<>();
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for (Student t : ts) {
System.out.println(t);
}
}
}
package study.api;
public class Student implements Comparable{
private String name;
private int age;
private int chinese;
private int math;
private int english;
public Student() {
}
public Student(String name, int age, int chinese, int math, int english) {
this.name = name;
this.age = age;
this.chinese = chinese;
this.math = math;
this.english = english;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return chinese
*/
public int getChinese() {
return chinese;
}
/**
* 设置
* @param chinese
*/
public void setChinese(int chinese) {
this.chinese = chinese;
}
/**
* 获取
* @return math
*/
public int getMath() {
return math;
}
/**
* 设置
* @param math
*/
public void setMath(int math) {
this.math = math;
}
/**
* 获取
* @return english
*/
public int getEnglish() {
return english;
}
/**
* 设置
* @param english
*/
public void setEnglish(int english) {
this.english = english;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + ", chinese = " + chinese + ", math = " + math + ", english = " + english + "}";
}
@Override
public int compareTo(Student o) {
int sum1=this.getChinese()+this.getMath()+this.getEnglish();
int sum2=o.getChinese()+o.getMath()+o.getEnglish();
int i=sum1-sum2;
i=i==0?this.getChinese()-o.getChinese():i;
i=i==0?this.getMath()-o.getMath():i;
i=i==0?this.getEnglish()-o.getEnglish():i;
i=i==0?this.getName().compareTo(o.getName()):i;
return i;
}
// 如果总分一样,按照语文成绩排
// 如果语文一样,按照数学成绩排
// 如果数学成绩一样,按照英语成绩排
// 如果英文成绩一样,按照年龄排
// 如果年龄一样,按照姓名的字母顺序排
// 如果都一样,认为是同一个学生,不存。
}