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

DAY07 Collection、Iterator、泛型、数据结构

学习目标

能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 = new int[10];  int[] arr2 = {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类型的一种2.可以存储多个元素3.集合的长度是可以变化的(可以往集合中添加元素,删除集合中的元素)4.只能存储引用数据类型的数据ArrayList<int> 错误	ArrayList<Integer>	ArrayList<Student>
能够使用Collection集合的常用功能(重点)public boolean add(E e) : 把给定的对象添加到当前集合中 。public boolean remove(E e) : 把给定的对象在当前集合中删除。public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。public boolean isEmpty() : 判断当前集合是否为空。public int size() : 返回集合中元素的个数。public Object[] toArray() : 把集合中的元素,存储到数组中public void clear() :清空集合中所有的元素。
能够使用迭代器对集合进行取元素(重点)//1.创建集合对象,往集合中添加元素Collection<String> coll = new ArrayList<>();//Collection<String> coll = new HashSet<>();coll.add("詹姆斯");coll.add("姚明");coll.add("科比");coll.add("乔丹");coll.add("艾弗森");//2.使用Collection接口中的方法iterator,获取迭代器的实现类对象Iterator<String> it = coll.iterator();//3.使用迭代器对象Iterator中的方法hasNext和next遍历集合while(it.hasNext()){String s = it.next();System.out.println(s);}
能够使用增强for循环遍历集合和数组(重点)for(集合|数组中元素的数据类型 变量名: 集合|数组){sout(变量名);}int[] arr = {1,2,3};for(int i : arr){sout(i);}ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");for(String s : list){sout(s);}
能够理解泛型上下限泛型的上限限定: ? extends E ==>传递的未知类型?只能是E的子类或者本身泛型的下限限定: ? super E   ==>传递的未知类型?只能是E的父类或者本身
能够阐述泛型通配符的作用泛型的通配符: ?  可以接收任意的数据类型
能够说出常见的数据结构栈,队列,数组,链表,红黑树
能够说出数组结构特点查询快,增删慢
能够说出栈结构特点先进后出
能够说出队列结构特点先进先出
能够说出单向链表结构特点查询慢,增删快

第一章 Collection集合

1.集合和数组的区别

数组:

1.是引用数据类型的一种

2.可以存储多个元素

3.数组的长度是固定的 int[] arr1 = new int[10]; int[] arr2 = {1,2,3};

4.数组即可以存储基本数据类型的数据,又可以存储引用数据类型的数据 int[] double[] String[] Student[]

集合:

1.是引用数据类型的一种

2.可以存储多个元素

3.集合的长度是可以变化的(添加元素,删除集合中的元素)

4.集合只能存储引用数据类型的数据

ArrayList<int> 错误 ArrayList<Integer> ArrayList<Student> ArrayList<String>正确

2.集合常用类的继承体系

请添加图片描述

3.Collection常用功能(重点)

package com.itheima.demo01Collection;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;/*java.util.Collection<E>Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。Collection接口中定义了所有单列集合共性的成员方法,所有的实现类都可以使用public boolean add(E e) : 往集合中添加元素public boolean remove(E e) : 移除集合中指定的元素public boolean contains(Object obj) : 判断当前集合中是否包指定的元素。public boolean isEmpty() : 判断当前集合是否为空。public int size() : 返回集合中元素的个数。获取集合的长度public Object[] toArray() : 把集合中的元素,存储到数组中public void clear() :清空集合中所有的元素。*/
public class Demo01Collection {public static void main(String[] args) {//创建Collection集合对象:多态(接口指向实现类对象,扩展性强)Collection<String> coll = new ArrayList<>();coll = new HashSet<>();/*public boolean add(E e) : 往集合中添加元素返回值:boolean添加成功,返回true,添加元素百分之百会成功添加失败,返回false*/boolean b1 = coll.add("张三");System.out.println("b1:"+b1);//b1:truecoll.add("李四");coll.add("王五");coll.add("张三");coll.add("赵六");coll.add("田七");System.out.println(coll);//[张三, 李四, 王五, 张三, 赵六, 田七]  打印对象名,不是地址值,重写了Object类的toString方法/*public boolean remove(E e) : 移除集合中指定的元素返回值:boolean集合中存储指定的元素,移除元素,返回true;如果集合移除的元素有相同的,只会移除第一个集合中不存在指定的元素,remove方法对集合没有影响,返回false*/boolean b2 = coll.remove("张三");System.out.println("b2:"+b2);//b2:trueSystem.out.println(coll);//[李四, 王五, 张三, 赵六, 田七]boolean b3 = coll.remove("赵四");System.out.println("b3:"+b3);//b3:falseSystem.out.println(coll);//[李四, 王五, 张三, 赵六, 田七]/*public boolean contains(Object obj) : 判断当前集合中是否包指定的元素。返回值:boolean集合中包含指定的元素,返回true集合中不包含指定的元素,返回false*/boolean b4 = coll.contains("田七");System.out.println("b4:"+b4);//b4:trueboolean b5 = coll.contains("胡歌");System.out.println("b5:"+b5);//b5:false/*public boolean isEmpty() : 判断当前集合是否为空。返回值:boolean集合中没有元素,是空的,返回true集合中有元素,不是空的,返回false*/boolean b6 = coll.isEmpty();System.out.println("b6:"+b6);//b6:false/*public int size() : 返回集合中元素的个数。获取集合的长度*/int size = coll.size();System.out.println("size:"+size);//size:5/*public Object[] toArray() : 把集合中的元素,存储到数组中*/Object[] arr = coll.toArray();System.out.println(Arrays.toString(arr));//[李四, 王五, 张三, 赵六, 田七]/*public void clear() :清空集合中所有的元素。注意:此方法只是清空集合中的元素,不是删除集合;清空完集合还存在,还可以使用*/coll.clear();System.out.println(coll);//[]System.out.println(coll.size());//0System.out.println(coll.isEmpty());//true}
}

第二章 Iterator迭代器

1.迭代器的概述

/*迭代器:是一种通用取出集合中元素的方式迭代器的由来:集合有很多种,每种集合的数据结构不同(数组,链表,哈希表...),集合取出元素的方式也不同我们不可能为每种集合都定义一种取出元素的方式,浪费所以我们可以使用迭代器,是集合通用的取出元素的方式迭代器的原理:判断集合中还有没有元素,有就取出来;再判断集合中还有没有元素,有再取出来;一直判断到集合中没有元素为止,这种取出元素的方式叫迭代------------------------------------------------------------------------------------java.util.Iterator<E>接口:对 collection 进行迭代的迭代器。Iterator接口的常用方法:boolean hasNext() 如果仍有元素可以迭代,则返回 true。判断集合中还没有没有元素;有返回true,没有返回falseE next() 返回迭代的下一个元素。 取出集合中的元素------------------------------------------------------------------------------------Iterator是一个接口无法创建对象使用,使用Iterator接口的实现类对象,Iterator接口的实现类对象是每个集合的内部类(了解)我们可以使用Collection接口中的方法iterator获取迭代器Iterator接口的实现类对象Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。注意:我们无需关注iterator方法返回的是接口的哪个实现类对象,我们只需要会使用Iterator接口来接收这个实现类对象即可(多态)*/

2.迭代器的基本使用(重点)

/*迭代器的使用步骤(重点):1.创建集合对象,往集合中存储元素2.使用Collection接口中的方法iterator,获取迭代器接口的实现类对象3.使用迭代器对象Iterator接口中的方法hasNext和next遍历集合*/
public class Demo01Iterator {public static void main(String[] args) {//1.创建集合对象,往集合中存储元素Collection<String> coll = new ArrayList<>();coll.add("詹姆斯");coll.add("姚明");coll.add("科比");coll.add("乔丹");coll.add("艾弗森");/*2.使用Collection接口中的方法iterator,获取迭代器接口的实现类对象注意:迭代器Iterator是有泛型的,迭代的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型*///多态 接口         =   实现类对象Iterator<String> it = coll.iterator();//3.使用迭代器对象Iterator接口中的方法hasNext和next遍历集合/*我们发现使用迭代器取出元素是一个重复的过程,所以我们可以使用循环优化代码不知道集合中有多个元素,一般使用while循环while循环结束的条件:it.hasNext方法返回false*/while (it.hasNext()){//判断集合中还有没有元素//有元素,取出元素String s = it.next();System.out.println(s);}System.out.println("-----------------------------");//注意:迭代器只能使用一次,想要在遍历元素,必须重新获取一个新的迭代器for(Iterator<String> it2 = coll.iterator();it2.hasNext();){String s = it2.next();System.out.println(s);}/*boolean b = it.hasNext();System.out.println(b);//trueString s = it.next();System.out.println(s);//詹姆斯b = it.hasNext();System.out.println(b);//trues = it.next();System.out.println(s);//姚明b = it.hasNext();System.out.println(b);//trues = it.next();System.out.println(s);//科比b = it.hasNext();System.out.println(b);//trues = it.next();System.out.println(s);//乔丹b = it.hasNext();System.out.println(b);//trues = it.next();System.out.println(s);//艾弗森b = it.hasNext();System.out.println(b);//false*///s = it.next();//没有元素,就不能使用next方法获取元素,在获取元素会抛出没有元素异常:NoSuchElementException}
}

3.迭代器的执行原理

请添加图片描述

4.迭代器的并发修改异常(面试)

请添加图片描述

package com.itheima.demo02Iterator;import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;/*迭代器的并发修改异常:在使用迭代器遍历集合的过程中,对集合长度进行了修改,迭代器就会抛出并发修改异常ConcurrentModificationException注意:1.并发:遍历和修改同时进行2.修改:修改集合的长度(添加元素,删除元素)解决方案:1.遍历集合的同时,不修改集合的长度2.Iterator接口有一个子接口叫ListIterator在ListIterator接口定义了往集合中添加元素的方法public interface ListIterator<E>extends Iterator<E>void add(E e)  迭代器中往集合添加元素的方法void remove() 删除的是next方法取出的元素注意:1.如果使用迭代器中的add|remove方法,往集合中添加|删除元素就相当于集合和迭代器商量好了,可以往集合中添加|删除元素,迭代器就不会抛出并发修改异常了2.ListIterator迭代器只能遍历List接口下的集合(ArrayList,LinkedList),不能遍历Set接口下的集合(HashSet,LinkedHashSet)*/
public class Demo02Iterator {public static void main(String[] args) {//创建集合对象,往集合中添加元素ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add(null);list.add("bbb");list.add("ccc");list.add("ddd");list.add("eee");//使用迭代器遍历list集合//使用集合中的方法iterator获取迭代器接口的实现类对象Iterator<String> it = list.iterator();//使用Iterator迭代器中的方法hasNext和next遍历集合while (it.hasNext()){String s = it.next();System.out.println(s);/*需求:增加一个判断,如果取出的元素是"ccc"就给集合添加一个新的元素"itcast"编程技巧:使用equals方法判断的时候,一般都把已知的值写在前边,防止空指针异常*/if("ccc".equals(s)){//list.add("itcast");//ConcurrentModificationException//list.remove("ddd");//ConcurrentModificationException}}System.out.println("--------------第二种解决并发修改异常的方法------------------------");//使用List接口中的方法listIterator获取ListIterator迭代器接口的实现类对象//ListIterator<E> listIterator() 返回此列表元素的列表迭代器(按适当顺序)。ListIterator<String> lit = list.listIterator();//使用迭代器中的方法hasNext和next遍历集合while (lit.hasNext()){String s = lit.next();System.out.println(s);/*需求:增加一个判断,如果取出的元素是"ccc"就给集合添加一个新的元素"itcast"*/if("ccc".equals(s)){//lit.add("itcast");//使用迭代器中的add方法,往集合中添加元素lit.remove();//删除的是next方法取出的元素}}//遍历的过程中是不会打印出新添加的元素的,遍历之后在打印就可以看到了System.out.println(list);//[aaa, null, bbb, ccc, itcast, ddd, eee]    [aaa, null, bbb, ddd, eee]}
}

5.迭代器的实现类是每个集合的内部类(了解)

请添加图片描述

6.增强for循环(重点)

注意:

增强for循环底层是一个迭代器,所以在使用增强for循环遍历的时候,不能对集合的长度进行修改,否则会抛出并发修改异常
请添加图片描述

package com.itheima.demo02Iterator;import java.util.ArrayList;/*增强for循环(重点)是JDK1.5之后出现的新特性使用for循环的方式,对迭代器进行了简化增强for循环内部就是一个迭代器,对迭代器进行了封装Collection接口有一个父接口叫Iterablepublic interface Collection<E> extends Iterable<E>java.lang.Iterable<T>接口实现这个接口允许对象成为 "foreach" 语句的目标。Collection接口继承了Iterable接口,所以可以使用增强for循环Collection接口所有的实现类,都可以使用增强for循环(ArrayList,LinkedList,HashSet...)------------------------------------------------------------增强for循环的格式:重点for(集合|数组中元素的类型 变量名 : 集合名|数组名){sout(变量名);}*/
public class Demo03Foreach {public static void main(String[] args) {show03();}/*使用增强for循环遍历集合快捷键:数组名|集合名.for 增强for*/private static void show03() {ArrayList<Student> list = new ArrayList<>();list.add(new Student("张三",18));list.add(new Student("李四",19));list.add(new Student("王五",20));for (Student s : list) {//注意:增强for循环底层就是一个迭代器,在遍历的过程中不能修改集合的长度//list.add(new Student("赵六",18));//ConcurrentModificationExceptionSystem.out.println(s);}}/*使用增强for循环遍历集合好处:可以在遍历的过程中使用元素特有的方法*/private static void show02() {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbbbbbb");list.add("cc");list.add("ddddd");for(String s : list){System.out.println(s+"-->"+s.length());}}/*使用增强for循环遍历数组好处:格式简单弊端:只能遍历,不能修改数组中的元素*/private static void show01() {int[] arr1 = {1,2,3};//使用普通for循环遍历数组for (int i = 0; i < arr1.length; i++) {arr1[i]*=2;System.out.println(arr1[i]);}System.out.println("arr1[0]:"+arr1[0]);System.out.println("--------------------");int[] arr2 = {1,2,3};for(int s : arr2){s *= 2;System.out.println(s);}System.out.println("arr2[0]:"+arr2[0]);}
}

第三章 泛型

1.泛型的概述

请添加图片描述

2.使用泛型的好处

package com.itheima.demo03Generic;import java.util.ArrayList;
import java.util.Iterator;/*java中的泛型:是一个伪泛型,在.java文件中有,但是.class文件中没有*/
public class Demo01Generic {public static void main(String[] args) {show02();}/*使用泛型创建ArrayList集合对象好处:1.使用什么泛型就只能存储什么类型的数据;避免向下转型抛出类型转换异常2.写上泛型存储的是什么类型,取出的就是什么类型,不用向下转型,就可以使用特有的方法弊端:1.不能什么类型的数据都存储*/private static void show02() {ArrayList<String> list = new ArrayList<>();list.add("aaa");//list.add(1);//使用迭代器遍历list集合Iterator<String> it = list.iterator();while (it.hasNext()){String s = it.next();System.out.println(s+"-->"+s.length());}}/*不使用泛型创建ArrayList集合对象好处:不使用泛型,集合默认的数据类型就是Object类型,可以存储任意数据类型的元素弊端:1.不能使用元素特有的方法(多态)2.在进行向下转型的时候,容易引发类型转换异常*/private static void show01() {ArrayList list = new ArrayList();list.add("aaa");list.add(1);//使用迭代器遍历list集合Iterator it = list.iterator();while (it.hasNext()){//存储的泛型是Object类型,取出元素类型也是Object类型Object obj = it.next();System.out.println(obj);/*多态 Object obj = "aaa"; 无法使用子类特有的方法*/if(obj instanceof String){String s = (String)obj;System.out.println(s.length());}}}
}

通过反编译软件,查看的class文件中,没有泛型
请添加图片描述

3.定义和使用含有泛型的类

package com.itheima.demo04GenericClass;/*定义和使用含有泛型的类:模拟ArrayList集合当我们不知道使用什么类型的时候,就可以使用泛型,是一个未知的数据类型可以给泛型赋值任意的数据类型:Integer,Student,Person,String...定义格式:public class 类名<泛型>{类中使用数据类型的地方,都可以使用类上定义好的泛型}什么时候确定类上泛型的数据类型创建对象的时候,确定类上泛型的数据类型;对象使用什么类型,类的泛型就是什么类型*/
public class GenericClass<C> {private C name;public C getName() {return name;}public void setName(C name) {this.name = name;}
}
package com.itheima.demo04GenericClass;public class Demo01GenericClass {public static void main(String[] args) {//创建GenericClass对象,不使用泛型,类型默认就是Object类型GenericClass gc1 = new GenericClass();//创建GenericClass对象,泛型使用String类型GenericClass<String> gc2 = new GenericClass<>();gc2.setName("aaa");String name = gc2.getName();System.out.println(name);//创建GenericClass对象,泛型使用Integer类型GenericClass<Integer> gc3 = new GenericClass<>();gc3.setName(10);Integer in = gc3.getName();System.out.println(in);}
}

请添加图片描述

4.定义和使用含有泛型的方法(重点)

package com.itheima.demo05GenericMethod;/*定义和使用含有泛型的方法(重点)泛型需要定义在方法的修饰符和返回值类型之间定义格式:修饰符 <泛型> 返回值类型 方法名(参数类型-->使用泛型){方法体;}什么时候确定泛型的数据类型:调用方法,传递的参数是什么类型,方法的泛型就是什么类型*/
public class GenericMethod {//定义含有泛型的方法(重点)public <M> void method01(M m){System.out.println(m);}//定义含有泛型的静态方法(了解)public static <S> void method02(S s){System.out.println(s);}//定义含有泛型的方法,返回值类型使用泛型(了解==>看源码)public <AAA> AAA method03(AAA aaa){System.out.println(aaa);return aaa;}
}
package com.itheima.demo05GenericMethod;import com.itheima.demo02Iterator.Student;public class Demo01GenericMethod {public static void main(String[] args) {//创建GenericMethod对象GenericMethod gm = new GenericMethod();gm.method01(1);gm.method01("aaa");gm.method01(1.1);gm.method01(true);gm.method01('@');gm.method01(new Student("徐峥",45));System.out.println("------------------------------");//通过类名.方法名(参数)可以直接调用静态方法GenericMethod.method02(1);GenericMethod.method02("aaa");GenericMethod.method02(1.1);System.out.println("------------------------------");Integer in = gm.method03(11);System.out.println(in);String abc = gm.method03("abc");System.out.println(abc);}
}

请添加图片描述

5.定义和使用含有泛型的接口

package com.itheima.demo06GenericInterface;/*定义含有泛型的接口*/
public interface GenericInterface<I> {//定义抽象方法,使用接口上的泛型,作为参数的类型public abstract void show(I i);
}
package com.itheima.demo06GenericInterface;/*含有泛型的接口:第一种使用方式定义一个类,实现含有泛型的接口,在实现接口的同时,指定接口泛型的数据类型格式:public class GenericInterfaceImpl1 implements GenericInterface<String>{重写接口中的方法,使用指定的类型Stringpublic void show(String s) { }}public class GenericInterfaceImpl1 implements GenericInterface<Integer>{重写接口中的方法,使用指定的类型Integerpublic void show(Integer integer) { }}*/
public class GenericInterfaceImpl1 implements GenericInterface<Integer>{@Overridepublic void show(Integer in) {System.out.println(in);}
}
package com.itheima.demo06GenericInterface;/*含有泛型的接口:第二种使用方式定义类实现含有泛型的接口,接口使用什么泛型,实现类就使用什么泛型实现类跟着接口走,就和定义一个含有泛型的类是一样的格式:public class GenericInterfaceImpl2<I> implements GenericInterface<I>{重写的方法使用接口上的泛型public void show(I i) { }}注意:创建对象的时候,确定泛型的数据类型;创建对象是什么数据类型,泛型就是什么数据类型*/
public class GenericInterfaceImpl2<I> implements GenericInterface<I>{@Overridepublic void show(I i) {System.out.println(i);}
}
package com.itheima.demo06GenericInterface;public class Demo01GenericInterface {public static void main(String[] args) {//创建GenericInterfaceImp1对象GenericInterfaceImpl1 gii1 = new GenericInterfaceImpl1();gii1.show(10);//创建GenericInterfaceImpl2对象GenericInterfaceImpl2<String> gii2 = new GenericInterfaceImpl2<>();gii2.show("aaa");GenericInterfaceImpl2<Double> gii3 = new GenericInterfaceImpl2<>();gii3.show(1.1);//匿名内部类new GenericInterface<String>(){@Overridepublic void show(String s) {System.out.println(s);}}.show("123123");}
}

6.泛型的通配符

package com.itheima.demo07Generic;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;/*泛型的通配符?:代表可以接收任意的数据类型?已经由java定义好了,我们可以直接使用*/
public class Demo01Generic {public static void main(String[] args) {Collection<Integer> c1 = new ArrayList<>();c1.add(1);c1.add(2);Collection<String> c2 = new ArrayList<>();c2.add("aaa");c2.add("bbb");printCollction(c1);printCollction(c2);/*泛型的通配符只能作为方法参数的数据类型使用,不能创建对象作为数据类型使用*///ArrayList<?> list = new ArrayList<>();//list.add(1);//list.add("a");}/*定义一个方法,能遍历任意数据类型的Collection集合1.Collection c:不写泛型,默认就是Object类型2.可以使用泛型的通配符?,可以接收任意的数据类型*/public static void printCollction(Collection<?> c){//使用迭代器遍历集合;集合的泛型是?,迭代器也是?Iterator<?> it = c.iterator();while (it.hasNext()){/*it.next方法取出的元素是什么类型是Object类型,Object可以接收任意数据类型的数据*/Object obj = it.next();System.out.println(obj);}}
}
package com.itheima.demo07Generic;import java.util.ArrayList;
import java.util.Collection;/*泛型通配符的高级使用泛型的通配符: ? 代表可以接收任意数据类型的数据泛型的上限限定: ? extends E==>传递的未知类型?只能使用E的子类或者是E本身泛型的下限限定: ? super E==>传递的未知类型?只能使用E的父类或者是E本身*/
public class Demo02Generic {public static void main(String[] args) {Collection<Integer> list1 = new ArrayList<Integer>();Collection<String> list2 = new ArrayList<String>();Collection<Number> list3 = new ArrayList<Number>();Collection<Object> list4 = new ArrayList<Object>();/*Integer extends Number extends ObjectString exntends Object*/getElement1(list1);//getElement1(list2);//报错 String和Number没有关系getElement1(list3);//getElement1(list4);//报错 Object类型是Number的父类,需要Number子类//getElement2(list1);//报错 Integer是Number的子类,需要Number的父类//getElement2(list2);//报错 String和Number没有关系getElement2(list3);getElement2(list4);System.out.println("----------------------------------");//Collection集合中的方法 boolean addAll(Collection<? extends E> c);ArrayList<Integer> list01 = new ArrayList<>();list01.add(1);list01.add(2);ArrayList<Object> list02 = new ArrayList<>();//addAll的限制,传递list01集合泛型只能使用list02集合泛型的子类或者本身list02.addAll(list01);//把list01集合中的所有元素都存储到list02中System.out.println(list02);//[1, 2]ArrayList<String> list03 = new ArrayList<>();//list03.addAll(list01);}// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类public static void getElement1(Collection<? extends Number> coll){}// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类public static void getElement2(Collection<? super Number> coll){}}

第四章 数据结构

1.数据结构_栈

2.数据结构_队列

请添加图片描述

3.数据结构_数组

请添加图片描述

4.数据结构_链表

请添加图片描述

5.数据结构_红黑树

请添加图片描述

相关文章:

DAY07 Collection、Iterator、泛型、数据结构

学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…...

k8s集群如何赋权普通用户仅管理指定命名空间资源

文章目录 1. 普通用户2. 创建私钥3. 创建 CertificateSigningRequest4. 批准 CertificateSigningRequest5. 创建 kubeconfig6. 创建角色和角色绑定7. 测试 1. 普通用户 创建用户demo useradd demo2. 创建私钥 下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 …...

DeepSeek与ChatGPT的全面对比

在人工智能&#xff08;AI&#xff09;领域&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来&#xff0c;凭借其卓越的自然语言处理能力&#xff0c;迅速占据市场主导地位。然而&#xff0c;近期中国AI初创公…...

C# dynamic 关键字 使用详解

总目录 前言 dynamic 是 C# 4.0 引入的关键字&#xff0c;用于声明动态类型&#xff0c;允许在运行时解析类型和成员&#xff0c;而非编译时。它主要设计用于简化与动态语言&#xff08;如 Python、JavaScript&#xff09;的交互、处理未知结构的数据&#xff08;如 JSON、XML…...

sql server 数据库 锁教程及锁操作

SQL Server数据库 锁的教程 SQL Server 的数据库锁是为了保证数据库的并发性和数据一致性而设计的。锁机制能够确保多个事务不会同时修改同一数据&#xff0c;从而避免数据冲突和不一致的发生。理解 SQL Server 的锁机制对于开发高效、并发性强的数据库应用非常重要。 1. 锁的…...

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…...

DeepSeek24小时写作机器人,持续创作高质量文案

内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求&#xff0c;人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容&#xff1f;DeepSeek写作机器人&#xff0c;一款24小时持续创作的智能工具&#xff0c;为企业和个人提…...

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…...

玩客云 IP查找

1.玩客云使用静态IP在不同网段路由器下不能使用&#xff0c;动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…...

【鸿蒙Next】鸿蒙应用发布前的准备

图标生成&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-apply-generated-icon-V5 debug 与 release使用不同的bundle name 鸿蒙多环境配置 https://segmentfault.com/a/1190000045418731...

【OpenCV】入门教学

&#x1f3e0;大家好&#xff0c;我是Yui_&#x1f4ac; &#x1f351;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680;如有不懂&#xff0c;可以随时向我提问&#xff0c;我会全力讲解~ &#x1f52…...

嵌入式 lwip http server makefsdata

背景&#xff1a; 基于君正X2000 MCU Freertoslwip架构 实现HTTP server服务&#xff0c;MCU作为HTTP服务器通过网口进行数据包的传输&#xff0c;提供网页服务。其中设计到LWIP提供的工具makefsdata&#xff0c;常用于将文件或目录结构转换为适合嵌入到固件中的二进制格式。 …...

qemu-kvm源码解析-cpu虚拟化

背景 Qemu 虚拟化中&#xff0c;CPU&#xff0c;内存&#xff0c;中断是虚拟化的核心板块。本章主要对CPU虚拟化源码进行分析 而随着技术的发展包括CPU、内存、网卡等常见外设。硬件层面的虚拟化现在已经是云计算的标配。形成了&#xff0c;qemu作为cpu外层控制面&#xff0c…...

【蓝桥杯集训·每日一题2025】 AcWing 6123. 哞叫时间 python

6123. 哞叫时间 Week 1 2月18日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛&#xff0c;但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解&#xff0c;所以农夫约翰将竞赛以…...

数据治理中 大数据处理一般都遵循哪些原则

在数据治理中&#xff0c;大数据处理通常遵循以下原则&#xff1a; 最小化原则&#xff1a;企业应只收集实现特定目的所需的数据&#xff0c;避免数据冗余和安全风险。 合法性原则&#xff1a;企业必须遵守相关法律法规&#xff0c;确保数据处理符合法律要求&#xff0c;降低法…...

Linux 多进程生产者消费者模型实现

Linux 多进程生产者消费者模型实现 一、模型核心组件二、关键代码解析1. 信号量封装类&#xff08;csemp&#xff09;2. 共享内存初始化3. 生产者核心逻辑4. 消费者核心逻辑 三、关键同步机制信号量使用策略操作时序图 四、扩展知识1. System V与POSIX信号量对比2. 共享内存最佳…...

【Python pro】基本数据类型

一、数字类型 1.1 数字类型的组成 1.1.1 整数 &#xff08;1&#xff09;十进制&#xff0c;二进制0b&#xff0c;八进制0o&#xff0c;十六进制0x print(16 0b10000 0o20 0x10) # 输出&#xff1a;True&#xff08;2&#xff09;十进制转其他进制 a bin(16) b oct(1…...

sql server查询IO消耗大的排查sql诊断语句

原文链接&#xff1a; sql server查询IO消耗大的排查sql诊断语句-S3软件[code]select top 50 (total_logical_reads/execution_count) as avg_logical_reads , (total_logical_writes/execution_count) as avg_logical_writes , (tota ... https://blog.s3.sh.cn/thread-120-1…...

Spring Boot 自动装配原理深度剖析

一、引言 在 Java 开发领域&#xff0c;Spring 框架无疑是中流砥柱。而 Spring Boot 的出现&#xff0c;更是极大地简化了 Spring 应用的搭建和开发过程。其中&#xff0c;自动装配原理是 Spring Boot 的核心亮点之一&#xff0c;它让开发者无需手动编写大量繁琐的配置代码&am…...

kubernetes源码分析 kubelet

简介 从官方的架构图中很容易就能找到 kubelet 执行 kubelet -h 看到 kubelet 的功能介绍&#xff1a; kubelet 是每个 Node 节点上都运行的主要“节点代理”。使用如下的一个向 apiserver 注册 Node 节点&#xff1a;主机的 hostname&#xff1b;覆盖 host 的参数&#xff1…...

Golang学习笔记_33——桥接模式

Golang学习笔记_30——建造者模式 Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 文章目录 桥接模式详解一、桥接模式核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、桥接模式的特点三、适用场景1. 多维度变化2. 跨平台开发3. 动态切换实现 四、与其他…...

使用EasyExcel和多线程实现高效数据导出

​ 使用EasyExcel和多线程实现高效数据导出 1. 概述 在企业级应用中&#xff0c;数据导出是一个常见的需求。为了提高导出效率&#xff0c;尤其是在处理大量数据时&#xff0c;我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高…...

告别冷冰冰:如何训练AI写出温暖人心的广告文案

朋友们&#xff0c;你们是不是也好奇过&#xff0c;如果让AI来写广告文案&#xff0c;会是什么效果&#xff1f; 是冷冰冰的数据堆砌&#xff0c;还是也能玩出创意和温度&#xff1f; 别担心&#xff0c;今天我就来给你揭秘&#xff0c;怎么调教AI&#xff0c;让它写出的广告…...

【js逆向_入门】图灵爬虫练习平台 第四题

(base64解码&#xff09;地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 请求接口带有加密参数&#xff1a; 全局搜索Sign,找到参数生成位置 一目了然&#xff0c;知道参数是怎么构造生成的 调试代码 测试验证思路是否正确 时间&#xff1a; …...

Mybatis后端数据库查询多对多查询解决方案

问题场景&#xff1a; 我开发的是一个论文选择系统。 后端用一个论文表paper来存储论文信息。 论文信息中&#xff0c;包含前置课程&#xff0c;也就是你需要修过这些课程才能选择这个论文。 而一个论文对应的课程有很多个。 这样就造成了一个数据库存储的问题。一个paper…...

记一次 Git Fetch 后切换分支为空的情况

Git Fetch 后切换分支为空的情况 在使用 Git 时&#xff0c;我遇到这样的情况&#xff1a;执行 git fetch 后切换分支&#xff0c;发现工作目录是空的&#xff0c;没有任何文件&#xff0c;所以插眼记录一下。 原因分析 git fetch 的作用&#xff1a;git fetch 只会从远程仓库…...

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法 A Solution to Solve Error - mysql: command not found After The Installation of MySQL Community Server By JacksonML 本文简要介绍如何在macOS安装完毕MySQL数据库服务器后&#xff0c;针对无…...

分享一款AI绘画图片展示和分享的小程序

&#x1f3a8;奇绘图册 【开源】一款帮AI绘画爱好者维护绘图作品的小程序 查看Demo 反馈 github 文章目录 前言一、奇绘图册是什么&#xff1f;二、项目全景三、预览体验3.1 截图示例3.2 在线体验 四、功能介绍4.1 小程序4.2 服务端 五、安装部署5.1 快速开始~~5.2 手动部…...

大模型知识蒸馏技术(4)——离线蒸馏

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl离线蒸馏概述 离线蒸馏是知识蒸馏中最早被提出且最为常见的实现方式,其核心在于教师模型和学生模型的训练是分阶段进行的。具体而言,教师模型首先在训练集上进行充分训练,直至收敛,然后利用教…...

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断&#xff08;数据来源&#xff1a;Gartner 2025&#xff09;。当竞品在凌晨3点自动发布「智能家居安装指南」时&#xff0c;你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…...