当前位置: 首页 > news >正文

Java集合进阶

集合体系结构

在这里插入图片描述
在这里插入图片描述

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];}@Overridepublic 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 {//定义一个工具类:listutilpublic 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> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}@Overridepublic Iterator<String> iterator() {return null;}@Overridepublic Object[] toArray() {return new Object[0];}@Overridepublic <T> T[] toArray(T[] a) {return null;}@Overridepublic boolean add(String string) {return false;}@Overridepublic boolean remove(Object o) {return false;}@Overridepublic boolean containsAll(Collection<?> c) {return false;}@Overridepublic boolean addAll(Collection<? extends String> c) {return false;}@Overridepublic boolean addAll(int index, Collection<? extends String> c) {return false;}@Overridepublic boolean removeAll(Collection<?> c) {return false;}@Overridepublic boolean retainAll(Collection<?> c) {return false;}@Overridepublic void clear() {}@Overridepublic String get(int index) {return "";}@Overridepublic String set(int index, String element) {return "";}@Overridepublic void add(int index, String element) {}@Overridepublic String remove(int index) {return "";}@Overridepublic int indexOf(Object o) {return 0;}@Overridepublic int lastIndexOf(Object o) {return 0;}@Overridepublic ListIterator<String> listIterator() {return null;}@Overridepublic ListIterator<String> listIterator(int index) {return null;}@Overridepublic 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> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}@Overridepublic Iterator<E> iterator() {return null;}@Overridepublic Object[] toArray() {return new Object[0];}@Overridepublic <T> T[] toArray(T[] a) {return null;}@Overridepublic boolean add(E e) {return false;}@Overridepublic boolean remove(Object o) {return false;}@Overridepublic boolean containsAll(Collection<?> c) {return false;}@Overridepublic boolean addAll(Collection<? extends E> c) {return false;}@Overridepublic boolean addAll(int index, Collection<? extends E> c) {return false;}@Overridepublic boolean removeAll(Collection<?> c) {return false;}@Overridepublic boolean retainAll(Collection<?> c) {return false;}@Overridepublic void clear() {}@Overridepublic E get(int index) {return null;}@Overridepublic E set(int index, E element) {return null;}@Overridepublic void add(int index, E element) {}@Overridepublic E remove(int index) {return null;}@Overridepublic int indexOf(Object o) {return 0;}@Overridepublic int lastIndexOf(Object o) {return 0;}@Overridepublic ListIterator<E> listIterator() {return null;}@Overridepublic ListIterator<E> listIterator(int index) {return null;}@Overridepublic 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方法//只能传达list1method(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{@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的" + getAge() + "岁的哈士奇,正在吃骨头,边吃边拆家");}
}
package kl005;public class TDog extends Dog{@Overridepublic void eat() {System.out.println("一只狗叫做" + getName() + "的"+getAge()+"x岁的土狗,正在吃骨头");}
}
package kl005;public abstract class Dog extends Animal{
}
package kl005;public class Lcat extends Cat{@Overridepublic void eat() {System.out.println("一只猫叫做" + getName() + "的"+getAge()+"x岁的狸花猫,正在吃鱼");}
}
package kl005;public class Fcat extends Cat{@Overridepublic 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;}@Overridepublic 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);}@Overridepublic 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));}
}

在这里插入图片描述在这里插入图片描述
谢谢观看!

http://www.xdnf.cn/news/699355.html

相关文章:

  • C++补充基础小知识:什么是接口类 和 抽象类?为什么要继承?
  • 线程的生命周期?怎么终止线程?线程和线程池有什么区别?如何创建线程池?说一下 ThreadPoolExecutor 的参数含义?
  • yolov12毕设前置知识准备 1
  • Linux基本指令/上
  • Python常用模块实用指南
  • Python人工智能算法学习 禁忌搜索算法求解旅行商问题(TSP)的研究与实现
  • .net Winfrom 如何将窗口设置为MDI容器
  • QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)
  • Git:现代软件开发的基石——原理、实践与行业智慧·优雅草卓伊凡
  • go实例化结构体的方式
  • 【C/C++】设计模式之工厂模式:从简单到抽象的演进
  • 《接口和抽象类到底怎么选?设计原则与经典误区解析》
  • com.alibaba.fastjson.JSONException: default constructor not found.
  • 【25-cv-05887、25-cv-05893、25-cv-05897】一张图片连发3案!
  • 【Python实例】读取/处理 Landsat LST数据
  • Three.js引擎基础
  • HIS系统——药库管理模块功能解析
  • 【操作系统】内存管理知识点深度解析
  • 直播框架:基础知识点
  • 【基础题库回复四则】2022-1-26
  • git提交更改
  • 三强联合!Attention+LSTM,结合特征融合,起手二区!
  • 从“被动养老”到“主动健康管理”:平台如何重构代际关系?
  • Linux上给SD卡创建分区
  • 光谱相机在生态修复监测中的应用
  • LeetCode 463. 岛屿的周长 java题解
  • 软件测试之黑盒测试与白盒测试详解
  • python 小工具,获取 github 仓库信息
  • ORDER BY子句在一个 SQL 查询中只能出现一次
  • 全球轨道铺设设备市场发展现状与未来趋势分析