集合体系结构
Collection
迭代器对象的演示代码:
package kl003;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class demo2 {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//获取迭代器对象
Iterator<String> it = coll.iterator();;
//利用循环遍历集合中的每一个元素
while (it.hasNext()){
//获取指针并移动指针
String str = it.next();
System.out.println(str);
}
//上面循环结束的时候指针已经指向没有元素的位置
//迭代器遍历完集合后,指针不会复位
//如果还想遍历第二次就必须获取新的迭代器对象
//循环中只能调用一次next方法
//迭代器对象遍历的时候不能使用集合对象的方法修改和删除
//如果要删除,可以用迭代器的方法删除
}
}
迭代器的总结:
增强for遍历
增强for的细节:
增强for循环的演示代码
package kl003;
import java.util.ArrayList;
import java.util.Collection;
public class demo3 {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//利用增强for遍历集合
//注意点:s是一个第三方变量,代表集合中的每一个数据
for (String s : coll) {
System.out.println(s);
}
}
}
运行结果:
aaa
bbb
ccc
ddd
Lambda表达式遍历
Collection总结
Collection包含了list
和Collection一样同为接口类
list的演示代码
package kl003;
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
//创建一个集合
List<String> list = new ArrayList<>();
//添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
//插入指定元素
//细节:原来索引的元素会一次往后移动
list.add(1,"kkk");
//删除指定元素,并返回被删除的元素
//细节:原来索引的元素会依次往前移动
String remove = list.remove(1);
System.out.println(remove);
//set方法修改集合索引的指定元素,返回被修改的元素
String result = list.set(0,"QQQ");
//get方法获取指定索引的元素
String s = list.get(1);
System.out.println(s);
//打印集合
System.out.println(list);
}
}
package kl003;
import java.util.ArrayList;
import java.util.List;
public class ListRemoveDemo1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//删除元素
//list.remove(1);这是为自动装箱,优先调用实参一致的方法
//手动装箱
Integer i = Integer.valueOf(1);
list.remove(i);
System.out.println(list);
}
}
list集合的遍历方式
list的五种遍历方式的演示代码
package kl003;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;
public class ListDemo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println("迭代器遍历");
//迭代器遍历
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
//增强for循环遍历
System.out.println("增强for循环遍历");
for (String s : list) {
System.out.println(s);
}
System.out.println("Lambda表达式遍历");
//Lambda表达式遍历
list.forEach(string->System.out.println(string));
//普通遍历
System.out.println("普通遍历");
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
//列表迭代器
System.out.println("列表迭代器遍历");
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()){
String s = it2.next();
if ("bbb".equals(s)){
//添加元素
it2.add("qqq");
}
}
System.out.println(list);
}
}
五种遍历方式的对比
数据结构:
扩展的分块查找:
不同的业务场景采用不同的数据结构
常见的数据结构:
数据结构(栈)
数据进出入栈
数据结构(队列)
队列和栈的总结
数组
数组的弊端:
查询块,增删慢的模型
链表
单向链表和双向链表
对上述数据结构模型的总结
ArrayList集合底层原理
一次添加一个元素
一次添加一堆元素
linkedlist集合
泛型
泛型代码演示
package kl002;
import java.sql.Array;
import java.util.ArrayList;
import java.util.Iterator;
public class GengericsDemo1 {
public static void main(String[] args) {
//没有泛型的时候,集合如何存储数据
//创建集合对象
//获取数据的时候,无法获取特有行为
ArrayList<String> list = new ArrayList();
//添加数据
//list.add(123);
list.add("aaa");
//list.add(new Student());
//遍历集合获取集合里面的每一个数据
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
}
}
泛型的细节:
Arraylist泛型演示代码
package kl002;
import java.util.Arrays;
public class MyArrayList<E> {
Object[] obj = new Object[10];
int size;
//E代表不确定类型,e代表形参类型
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
public E get(int index){
return (E)obj[index];
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
package kl002;
public class GengericsDemo2 {
public static void main(String[] args) {
/*MyArrayList<String> list = new MyArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);*/
//同理<Integer><double>
MyArrayList<Integer> list = new MyArrayList<>();
list.add(123);
list.add(478);
list.add(910);
int i = list.get(0);
System.out.println(i);
System.out.println(list);
}
}
运行结果:
123
[123, 478, 910, null, null, null, null, null, null, null]
泛型方法:
泛型方法的练习
package kl004;
import java.util.ArrayList;
public class demo1 {
//定义一个工具类:listutil
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
//添加元素
Listutil.addAll(list1, "aaa", "aaa", "aaa", "aaa");
ArrayList<String> list2 = new ArrayList<>();
Listutil.addAll(list2, "bbb", "bbb", "bbb", "bbb");
System.out.println(list1);
System.out.println(list2);
}
}
package kl004;
import java.util.ArrayList;
public class Listutil<E> {
private Listutil(){
}
// public static <E> void addAll(ArrayList<E> list,E...e)
//添加未知数量的元素
//可变参数
public static <E> void addAll(ArrayList<E> list,E e1,E e2,E e3,E e4){
list.add(e1);
list.add(e2);
list.add(e3);
list.add(e4);
}
}
运行结果:
[aaa, aaa, aaa, aaa]
[bbb, bbb, bbb, bbb]
泛型接口:
package kl004;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class MyArrayList implements List<String> {
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator<String> iterator() {
return null;
}
@Override
public Object[] toArray() {
return new Object[0];
}
@Override
public <T> T[] toArray(T[] a) {
return null;
}
@Override
public boolean add(String string) {
return false;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean containsAll(Collection<?> c) {
return false;
}
@Override
public boolean addAll(Collection<? extends String> c) {
return false;
}
@Override
public boolean addAll(int index, Collection<? extends String> c) {
return false;
}
@Override
public boolean removeAll(Collection<?> c) {
return false;
}
@Override
public boolean retainAll(Collection<?> c) {
return false;
}
@Override
public void clear() {
}
@Override
public String get(int index) {
return "";
}
@Override
public String set(int index, String element) {
return "";
}
@Override
public void add(int index, String element) {
}
@Override
public String remove(int index) {
return "";
}
@Override
public int indexOf(Object o) {
return 0;
}
@Override
public int lastIndexOf(Object o) {
return 0;
}
@Override
public ListIterator<String> listIterator() {
return null;
}
@Override
public ListIterator<String> listIterator(int index) {
return null;
}
@Override
public List<String> subList(int fromIndex, int toIndex) {
return List.of();
}
}
package kl004;
import kl002.MyArrayList;
public class MyArrayListTest {
public static void main(String[] args) {
/*
泛型接口的两种使用方式
1.实现类给出具体的类型
2.实现类延续泛型,创建实现类对象再确定类型
*/
MyArrayList list = new MyArrayList();
}
}
package kl004;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class MyArrayList2<E> implements List<E> {
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator<E> iterator() {
return null;
}
@Override
public Object[] toArray() {
return new Object[0];
}
@Override
public <T> T[] toArray(T[] a) {
return null;
}
@Override
public boolean add(E e) {
return false;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean containsAll(Collection<?> c) {
return false;
}
@Override
public boolean addAll(Collection<? extends E> c) {
return false;
}
@Override
public boolean addAll(int index, Collection<? extends E> c) {
return false;
}
@Override
public boolean removeAll(Collection<?> c) {
return false;
}
@Override
public boolean retainAll(Collection<?> c) {
return false;
}
@Override
public void clear() {
}
@Override
public E get(int index) {
return null;
}
@Override
public E set(int index, E element) {
return null;
}
@Override
public void add(int index, E element) {
}
@Override
public E remove(int index) {
return null;
}
@Override
public int indexOf(Object o) {
return 0;
}
@Override
public int lastIndexOf(Object o) {
return 0;
}
@Override
public ListIterator<E> listIterator() {
return null;
}
@Override
public ListIterator<E> listIterator(int index) {
return null;
}
@Override
public List<E> subList(int fromIndex, int toIndex) {
return List.of();
}
}
泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性
泛型演示代码
package kl004;
import java.util.ArrayList;
public class GenericsDemo1 {
public static void main(String[] args) {
//泛型不具备继承条件,但是数据具备继承条件
//创建集合对象
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();
//调用method方法
//只能传达list1
method(list1);
}
public static void method(ArrayList<Ye> list){
}
}
class Ye{}
class Fu extends Ye{}
class Zi extends Fu{}
泛型的通配符:
泛型的通配符应用场景:
package kl005;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<TDog> list1 = new ArrayList<>();
ArrayList<HDog> list2 = new ArrayList<>();
ArrayList<Lcat> list3 = new ArrayList<>();
ArrayList<Fcat> list4 = new ArrayList<>();
keepPet(list3);
keepPet(list4);
}
public static void keepPet(ArrayList<? extends Cat> list){
}
}
package kl005;
public class HDog extends Dog{
@Override
public void eat() {
System.out.println("一只叫做" + getName() + "的" + getAge() + "岁的哈士奇,正在吃骨头,边吃边拆家");
}
}
package kl005;
public class TDog extends Dog{
@Override
public void eat() {
System.out.println("一只狗叫做" + getName() + "的"+getAge()+"x岁的土狗,正在吃骨头");
}
}
package kl005;
public abstract class Dog extends Animal{
}
package kl005;
public class Lcat extends Cat{
@Override
public void eat() {
System.out.println("一只猫叫做" + getName() + "的"+getAge()+"x岁的狸花猫,正在吃鱼");
}
}
package kl005;
public class Fcat extends Cat{
@Override
public void eat() {
System.out.println("一只猫叫做" + getName() + "的" + getAge() + "岁的波斯猫,正在吃猫粮");
}
}
package kl005;
public abstract class Cat extends Animal{
}
package kl005;
public abstract class Animal {
private String name;
private int age;
public Animal(){
}
public Animal(String name,int age){
this.name=name;
this.age=age;
}
/**
* 获取
* @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;
}
public abstract void eat();
public String toString() {
return "Animal{name = " + name + ", age = " + age + "}";
}
}
泛型:
添加节点(二叉查找树):
大的存右边
小的存左边
一样的不存
二叉树的遍历方式:
前序遍历:
中序遍历:
后序遍历:
层序遍历:
数据结构(二叉树)小结:
二叉查找树(好处):
提高运行效率
二叉查找树(弊端):
数据结构(平衡二叉树):
注意:
数据结构(树)的演变:
数据结构(平衡二叉树)旋转机制
左旋:
判断左右旋转的方法,找不平衡点
旋转前
旋转后
右旋:
右旋前:
右旋后:
左左:
左右:
先局部左旋,变为左左的情况:
然后在整体右旋:
最后得到平衡二叉树
右右:
一次左旋,就可以得到平衡二叉树:
右左:
先局部右旋:
再整体左旋,得到平衡二叉树
小结(平衡二叉树)
红黑树
红黑规则
添加节点规则
增删查改的性能很不错
HashSet底层原理
package kl001;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @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;
}
@Override
public boolean equals(Object o) {
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(name, age);
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
package kl001;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
//1.创建对象
Student s1 = new Student("qq",18);
Student s2 = new Student("qk",19);
Student s3 = new Student("kk",20);
Student s4 = new Student("kk",20);
//2.创建集合添加学生
HashSet<Student> hs = new HashSet<>();
//3.添加
System.out.println(hs.add(s1));
System.out.println(hs.add(s2));
System.out.println(hs.add(s3));
System.out.println(hs.add(s4));
//4.打印集合
System.out.println(hs);
}
}
记得alt+insert,用IDEA重写hashset方法
String和Integer不需要重写hashset方法
因为JAVA已经重写好了这两个东西
总结:
TreeSet的特点:
package kl001;
import java.util.Iterator;
import java.util.TreeSet;
import java.util.function.Consumer;
public class TreeSetdemo1 {
public static void main(String[] args) {
//1.创建对象
TreeSet<Integer> ts = new TreeSet<>();
//2.添加
ts.add(1);
ts.add(3);
ts.add(5);
ts.add(2);
ts.add(4);
//3.遍历集合
//增强for循环
for(Integer t : ts){
System.out.println(t);
}
System.out.println("-----------------------");
//迭代器
Iterator<Integer> it = ts.iterator();
while(it.hasNext()){
int i = it.next();
System.out.println(i);
}
System.out.println("-----------------------");
//Lambda表达式
ts.forEach(i-> System.out.println(i));
}
}
谢谢观看!