vue单页面做网站加载慢,wordpress 上传图片500错误,wordpress排版教程视频,网站建设方案评审菜鸟之路Day09一一集合进阶(二)
作者#xff1a;blue
时间#xff1a;2025.1.27 文章目录 菜鸟之路Day09一一集合进阶(二)0.概述1.泛型1.1泛型概述1.2泛型类1.3泛型方法1.4泛型接口1.5泛型通配符 2.Set系列集合2.1遍历方式2.2HashSet2.3LinkedHashSet2.4TreeSet 0.概述
内…菜鸟之路Day09一一集合进阶(二)
作者blue
时间2025.1.27 文章目录 菜鸟之路Day09一一集合进阶(二)0.概述1.泛型1.1泛型概述1.2泛型类1.3泛型方法1.4泛型接口1.5泛型通配符 2.Set系列集合2.1遍历方式2.2HashSet2.3LinkedHashSet2.4TreeSet 0.概述
内容学习至黑马程序员BV17F411T7Ao无论如何今天是值得铭记的一天我们终于完结了200集的上部。下部漫漫我们再接再厉。
1.泛型
1.1泛型概述
泛型是JDK5中引入的新特性可以在编译阶段约束操作的数据类型并进行检查
泛型的格式数据类型
注意泛型只能支持引用数据类型原因数据在装入集合的过程中会做一个泛型的擦除也就是说在集合中实际存储的是Object类型的数据而引用数据类型是继承Object的这里利用了多态所以这里必须使用引用数据类型。指定了泛型的具体类型后传入数据时可以传入该类类型或其子类类型
泛型的好处1.统一了数据类型2.把运行时期的问题提前到了编译期间避免了强制类型转换可能出现的异常因为在编译阶段类型就能够确定下来
如果不写泛型类型默认是Object
1.2泛型类
使用场景当一个类中某个变量的数据类型不确定时就可以定义带有泛型的类
比如下面我们手写一个MyArrayList
import java.util.Arrays;public class MyArrayListE {Object[] obj new Object[10];int size;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);}
}使用一下我们自己写的MyArrayList
public class GenericsDemo1 {public static void main(String[] args) {MyArrayListInteger list new MyArrayList();list.add(123);list.add(234);list.add(345);list.add(456);System.out.println(list.get(3));}
}1.3泛型方法
方法中形参类型不确定时方案①使用类名后面定义的泛型所有方法都能用方案②在方法申明上定义自己的泛型只有本方法能用
泛型方法的格式
/*
修饰符 类型 返回值类型 方法名(类型 变量名){方法体
}
*/练习定义一个工具类ListUtil
类中定义一个静态方法addAll用来添加多个集合的元素
package Generics;import java.util.ArrayList;public class ListUtil {private ListUtil(){}//工具类私有化其构造方法//静态方法的话泛型写在static之后public staticE void addAll(ArrayListE list,E e1,E e2,E e3,E e4){list.add(e1);list.add(e2);list.add(e3);list.add(e4);}
}1.4泛型接口
/*修饰符 interface 接口名类型{}*/泛型接口的重点在于如何使用一个带泛型的接口
方式1实现类给出具体的类型
public class MyArrayList implements ListString方式2实现类延续泛型创建对象时再确定
public class MyArrayListE implement ListE
MyArrayListString list new MyArrayList();1.5泛型通配符
/*?也表示不确定类型他可以进行类型的限定? extends E:表示可以传递E或者E所有的子类类型? super E:表示可以传递E或者E所有父亲类型应用场景1.如果我们在定义类方法接口的时候如果类型不确定就可以定义泛型类泛型方法泛型接口2.如果类型不确定但是能知道以后只能传递某个继承体系中的就可以使用泛型的通配符泛型的通配符关键点可以限定类型的范围
*/package Generics;import java.util.ArrayList;public class GenericsDemo2 {public static void main(String[] args) {ArrayListYe list1 new ArrayList();ArrayListFu list2 new ArrayList();ArrayListZi list3 new ArrayList();method(list1);method(list2);method(list3);//method(new ArrayListInteger());这个就不行}public static void method(ArrayList? extends Ye list){}
}
class Ye {}
class Fu extends Ye{}
class Zi extends Fu {}2.Set系列集合
Set系列集合添加的元素是无序不重复无索引的
Set集合的实现类特点
名字特点HashSet无序不重复无索引LinkedHashSet有序不重复无索引TreeSet可排序不重复无索引
2.1遍历方式
Set还是属于Collection系列的所以它的API与Collection是一样不同是其遍历方式因为它是无索引的所以只能用Collection通用的遍历方式迭代器增强forLambada表达式
package SetDemo;import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.function.Consumer;public class SetDemo1 {public static void main(String[] args) {HashSetString set new HashSet();set.add(aaa);set.add(aaa);//利用set去重set.add(bbb);set.add(ccc);set.add(ddd);//迭代器遍历IteratorString it set.iterator();while(it.hasNext()){System.out.println(it.next());}//增强forfor(String i:set){System.out.println(i);}//Lambda表达式set.forEach((String s)-{System.out.println(s);});}
}2.2HashSet
HashSet集合的底层原理采取哈希表存取数据
哈希表是一种对于增删改查数据性能都较好的结构
哈希值
根据hashCode方法算出来的int类型的整数整数
该方法定义在Object类中所有对象都可以调用默认使用地址值进行计算
一般情况下会重写hashCode方法利用对象内部属性值计算哈希值
注意
如果没有重写hashCode方法不同对象计算出的哈希值是不同的
如果重写hashCode方法不同的对象只要属性值相同计算出的哈希值就是一样的
在小部分情况下不同属性值或者不同地址值计算出来的哈希值也有可能一样。哈希碰撞
练习
需求
package SetDemo;import java.util.HashSet;public class HashSetDemo1 {public static void main(String[] args) {HashSetStudent set new HashSet();Student stu1 new Student(zhangsan,11);Student stu2 new Student(lisi,12);Student stu3 new Student(wangwu,13);set.add(stu1);set.add(stu2);set.add(stu3);//这个添加是失败的因为他是根据hashCode来去重的我们重写了hashCode方法,使得属性一样的hashCode是一致的Student stu4 new Student(zhangsan,11);System.out.println(set.add(stu4));//falseSystem.out.println(stu1.hashCode());System.out.println(stu4.hashCode());for(Student i : set){System.out.println(i);}}
}2.3LinkedHashSet
有序不重复无索引
这里的有序指的是保证存储和取出的元素顺序是一致的因为有序的要求更复杂所以它的效率比HashSet的效率低一点
原理底层数据结构依然是哈希表只是每个元素又额外多了一个双链表的机制记录存储的顺序
打印出来的顺序是按照我们添加的顺序
public class LinkedHashSetDemo1 {public static void main(String[] args) {LinkedHashSetStudent set new LinkedHashSet();Student stu1 new Student(zhangsan,11);Student stu2 new Student(lisi,12);Student stu3 new Student(wangwu,13);set.add(stu1);set.add(stu2);set.add(stu3);System.out.println(set);}
}2.4TreeSet
TreeSet不重复无索引可排序
可排序按照元素的默认规则有小到大排序
TreeSet集合的底层是基于红黑树的数据结构实现排序的增删改查的性能都比较好
//基本使用
package SetDemo;import java.util.Iterator;
import java.util.TreeSet;
import java.util.function.Consumer;public class TreeSetDemo1 {public static void main(String[] args) {TreeSetInteger ts new TreeSet();ts.add(2);ts.add(1);ts.add(5);ts.add(4);ts.add(3);System.out.println(ts);//自动排序//增强forfor(Integer i : ts){System.out.print(i );}System.out.println();//迭代器IteratorInteger it ts.iterator();while(it.hasNext()){System.out.print(it.next() );}System.out.println();//Lambadats.forEach((Integer i)-{System.out.print(i );});}
}TreeSet集合默认的规则
对于数值类型IntegerDouble默认按照从小到大的顺序排序
对于字符字符串类型按照字符在ASCII码表中的数字升序进行排序
自定义类型如何排序
方式一自然排序/默认排序javabean类实现Comparable接口指定比较规则
package SetDemo;import java.util.Objects;public class Student implements ComparableStudent{private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}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;}Overridepublic String toString() {return Student{ name name \ , age age };}Overridepublic int compareTo(Student o) {//按照年龄大小排序return this.getAge()-o.getAge();}
}package SetDemo;import java.util.TreeSet;public class TreeSetDemo2 {public static void main(String[] args) {Student stu1 new Student(zhangsan,11);Student stu2 new Student(lisi,12);Student stu3 new Student(wangwu,13);TreeSetStudent ts new TreeSet();ts.add(stu1);ts.add(stu2);ts.add(stu3);System.out.println(ts);}
}方式二比较器排序创建TreeSet对象的时候传递比较器Comparator指定规则
package SetDemo;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo3 {public static void main(String[] args) {//按照长度排序如果一样长则按照首字母排序TreeSetString ts new TreeSet(new ComparatorString() {Override/*o1:表示当前要添加的元素o2:表示已经在红黑树中的元素返回值的规则和之前是一样的*/public int compare(String o1, String o2) {//按照长度排序int i o1.length()-o2.length();//如果一样长则按照首字母排序ii0?o1.compareTo(o2):i;//String的内置比较方法return i;}});ts.add(c);ts.add(ab);ts.add(df);ts.add(qwer);}
}改为Lambada
package SetDemo;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo3 {public static void main(String[] args) {//按照长度排序如果一样长则按照首字母排序TreeSetString ts new TreeSet((String o1, String o2) -{//按照长度排序int i o1.length()-o2.length();//如果一样长则按照首字母排序ii0?o1.compareTo(o2):i;//String的内置比较方法return i;});ts.add(c);ts.add(ab);ts.add(df);ts.add(qwer);for (String i:ts){System.out.println(i);}}
}