集合-进阶
Collection
collection的遍历方式
- 迭代器遍历
- 不依赖索引
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class mycollection {public static void main(String[] args) {//1.创建集合并添加元素Collection<String> coll = new ArrayList();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");//2.获取迭代器对象//迭代器就好比是一个箭头,指向集合中的0索引处Iterator<String> it = coll.iterator();//3.利用循环不断的去获取集合中的每一个元素while(it.hasNext()) {//4.next方法夫人两件事情:获取元素并移动指针String str = it.next();System.out.println(str);}}
}
- 迭代器的细节注意点:
1.报错NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能用集合的方法进行增加或者删除
增强for
//快速生成方式:
//集合的名字+for回车
//1.创建集合并添加元素
collection<string> coll new arrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
//2.利用增强for进行遍历
//注意点:
1/s其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据
for(string s : coll){s "qqq"'
system.out.println(coll);//zhangsan lisi wangwu
List集合
- 删除元素
请问:此时删除的是1这个元素,还是1索引上的元素?
为什么?
因为在调用方法的时候,如果方法出现了重载现象
优先调用,实参跟形参类型一致的那个方法。
list.remove(1);
- 练习
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;public class mylist {public static void main(String[] args) {//1.创建列表并添加元素List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");//1.迭代器方式遍历Iterator<String> it = list.iterator();while (it.hasNext()) {String str = it.next();System.out.println(str);}//2.增强for//下面的变量s,其实是一个第三方的变量而已//在循环的过程中,依次表示集合中的每一个元素for (String str : list) {System.out.println(str);}//3.Lambda表达式//forEach方法的底层启示就是一个循环遍历,依次得到集合的每一个元素//并把每一个元素传递给下面的accept方法//accept方法的形参s,依次表示集合的每一个元素list.forEach(s-> System.out.println(s));}
}
数据结构
栈
- 栈的特点:后进先出,先进后出
队列
- 队列特点:先进先出,后进后出
- 数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列模型的过程称为:出队列
链表
- 链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
- 链表查询慢,无论查询哪个数据都要从头开始找。
- 链表增删相对快
ArrayList
- 底层源码
LinkedList集合
- 底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。
- LinkedList本身多了很多直接操作首尾元素的特有API。
泛型深入
- 统一数据类型。
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
泛型的细节
- 泛型中不能写基本数据类型
- 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
- 如果不写泛型,类型默认是Object
泛型可以在很多地方进行定义
泛型接口
- 泛型不具备继承性
- 此时,泛型里面写的是什么类型,那么只能传递什么类型的的数据
弊端:
利用泛型方法有一个小弊端,此时他可以接受任意的数据线类型
Ye Fu Zi Student
希望:本方法虽然不确定类型,但是以后我希望只能传递 Ye Fu Zi
此时我们就可以使用泛型的通配符:
?也表示不确定的类型
他可以进行类型的限定
?extendsE:表示可以传递E或者E所有的子类类型
?superE:表示可以传递E或者E所有的父类类型
TreeSet
package TreeSetDemo;import java.util.TreeSet;
import java.util.function.Consumer;public class TreeSetDemo2 {public static void main(String[] args) {/*需求:创建5个学生对象属性:(姓名,年龄,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台如果总分一样,按照语文成绩排如果语文一样,按照数学成绩排如果数学成绩一样,按照英语成绩排如果英文成绩一样,按照年龄排如果年龄一样,按照姓名的字母顺序排如果都一样,认为是同一个学生,不存。*///默认排序//创建学生对象Student s1 = new Student("zhangsan",23,77,88,99);Student s2 = new Student("lisi",23,87,67,99);Student s3 = new Student("wangwu",23,67,85,78);Student s4 = new Student("zhaoliu",23,87,86,87);//创建集合TreeSet<Student> treeSet = new TreeSet<Student>();treeSet.add(s1);treeSet.add(s2);treeSet.add(s3);treeSet.add(s4);//增强forfor (Student t : treeSet) {System.out.println(t);}}
}
package TreeSetDemo;public class Student implements Comparable<Student>{private String name;private int age;private int chinese;private int math;private int english;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", chinese=" + chinese +", math=" + math +", english=" + english +'}';}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;}public int getChinese() {return chinese;}public void setChinese(int chinese) {this.chinese = chinese;}public int getMath() {return math;}public void setMath(int math) {this.math = math;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}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;}public Student() {}@Overridepublic 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.getAge() - o.getAge() : i;i = i ==0 ? this.getName().compareTo(o.getName()) : i;return i;}
}