Java集合框架
集合
概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能
和数组的区别
-
数组长度固定,集合长度不固定
-
数组可以存储基本类型和引用类型,集合只能存储引用类型
位置:java.util.*
Collection体系集合
Collection接口
练习一
package com.collection.demo01;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;/** Collection接口的使用* 1.添加元素* 2.删除元素* 3.遍历元素* 4.判断* */public class Demo01 {public static void main(String[] args) {//创建集合Collection collection = new ArrayList();//添加元素 add()collection.add("苹果");collection.add("西瓜");collection.add("榴莲");System.out.println("元素个数:" + collection.size());System.out.println(collection); //相当于sout(collection.toString());//删除元素 remove()// collection.remove("榴莲");// System.out.println("删除后"+collection.size());// collection.clear();// System.out.println("清除后"+collection.size());//遍历元素//1.使用增强for forEach 普通for不能用,因为没有下标for (Object o : collection) {System.out.println(o);}//2.使用迭代器 Iterator 专门用来遍历集合的一种方式Iterator it = collection.iterator(); //Iterator遍历collection的迭代器 hasNext():有没有下一个元素 next():获取下一个元素 remove():删除当前元素while (it.hasNext()) {String s = (String) it.next();System.out.println(s);//collection.remove(s); //迭代时不能进行集合删除操作 会报异常:ConcurrentModificationException//it.remove(); //使用迭代器的remove方法是可以的}System.out.println("元素个数" + collection.size());//判断 contains() isEmpty()System.out.println(collection.contains("西瓜"));System.out.println(collection.isEmpty()); //判断元素是否为空}}
练习二
package com.collection.demo01;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;//Collection的使用:保存学生信息public class Demo02 {public static void main(String[] args) {//新建一个Collection对象Collection collection = new ArrayList();//创建学生对象Student s1 = new Student("Tom",1);Student s2 = new Student("Jack",2);Student s3 = new Student("Jack",3);//1.添加学生数据collection.add(s1);collection.add(s2);collection.add(s3);collection.add(s3);System.out.println("元素个数" + collection.size());System.out.println(collection.toString());//删除collection.remove(s3); //只是把地址删除,堆里还留着System.out.println("删除之后" + collection.size());//1.增强forfor(Object o : collection) {Student s = (Student)o;System.out.println(s);}//2.迭代器Iterator iterator = collection.iterator();while(iterator.hasNext()) {Student s = (Student)iterator.next();System.out.println(s);}//判断System.out.println(collection.contains(new Student("Tom",1))); //false 并不是原有的TomSystem.out.println(collection.contains(s1));System.out.println(collection.isEmpty());}}
package com.collection.demo01;public class Student {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 "名字:" + name +", 年龄:" + age +"\t";}}
List集合
-
特点:有序、有下标、元素可以重复
List方法使用
案例1:
package com.collection.demo02;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.ListIterator;/** List接口的使用* 1.有序、有下标* 2.可重复* */public class Demo01 {public static void main(String[] args) {//创建集合对象List list = new ArrayList();//1.添加元素list.add("iPhone");list.add("xiaomi");list.add(0,"HUAWEI"); //表示在角标为0位置添加System.out.println("元素个数"+list.size());System.out.println(list);//删除元素list.remove(0); //把第一个元素删除System.out.println("元素个数"+list.size());System.out.println(list);//遍历//1.forfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//2.forEachfor(Object o : list) {System.out.println(o);}//3.迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}//4.列表迭代器/** 和Iterator的区别:* ListIterator可以向前向后遍历,可以增、删、改元素* *///4.1从前往后ListIterator lit = list.listIterator();while (lit.hasNext()) {System.out.println(lit.nextIndex()+ ":" +lit.next());}//4.2从后往前while (lit.hasPrevious()) {System.out.println(lit.previousIndex()+ ":" +lit.previous());}//判断System.out.println(list.contains("xiaomi"));System.out.println(list.isEmpty());//获取位置System.out.println(list.indexOf("xiaomi"));}}
案例2:
package com.collection.demo02;import java.util.ArrayList;import java.util.List;/** List的使用** */public class demo02 {public static void main(String[] args) {//创建集合List list = new ArrayList();//添加数字数据(隐含自动装箱) 集合不能存储基本类型数据list.add(20);list.add(30);list.add(40);list.add(50);list.add(60);System.out.println("元素个数"+list.size());System.out.println(list);//删除//list.remove(20); //默认删除角标是20的元素//System.out.println("删除数据后"+list.size()); //报错:IndexOutOfBoundsException//解决方法// list.remove(0);// list.remove((Object)20);// list.remove(new Integer(20));//补充方法subList 截取集合 返回子集合List subList = list.subList(1, 3); //含头不含尾System.out.println(subList);}}
List实现类
ArrayList
-
ArrayList【重点】:
-
数组结构实现,内部有数组,查询快、增删满
-
JDK1.2版本引入,运行效率快、线程不安全
源码分析:
默认容量DEFAULT_CAPACITY = 10
注意:如果没有向集合中添加任何元素时,容量0,添加任意一个元素,容量为10,超过10,扩容,每次扩容大小是原来的1.5倍
存放元素数组:elementData
size 实际元素个数
add()
-
package com.collection.demo02;import java.util.ArrayList;import java.util.Iterator;import java.util.ListIterator;/** ArrayList的使用* 存储结构:查找遍历速度快,增删慢** */public class Demo03 {public static void main(String[] args) {ArrayList arrayList = new ArrayList<>();//添加元素Student s1 = new Student("Tom",1);Student s2 = new Student("Jack",2);Student s3 = new Student("Jerry",3);arrayList.add(s1);arrayList.add(s2);arrayList.add(s3);System.out.println("元素个数"+arrayList.size());System.out.println(arrayList);//删除元素// arrayList.remove(s1);// System.out.println("删除之后"+arrayList.size());// System.out.println(arrayList);// arrayList.remove(new Student("Tom",1)); //remove其实调用了equals(this == obj)方法//想要实现这行代码,解决方案:重写equals//遍历元素【重点】//1.forfor (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));}//2.forEachfor(Object o: arrayList) {System.out.println(o);}//迭代器Iterator it = arrayList.iterator();while(it.hasNext()) {Student s = (Student)it.next();System.out.println(s);}//列表迭代器//正序ListIterator lit = arrayList.listIterator();while(lit.hasNext()){Student s = (Student)lit.next();System.out.println(s);}//倒序while(lit.hasPrevious()){Student s = (Student)lit.previous();System.out.println(s);}//判断System.out.println(arrayList.contains(s1));System.out.println(arrayList.contains(new Student("Tom",1)));System.out.println(arrayList.isEmpty());//查找System.out.println(arrayList.indexOf(s1));System.out.println(arrayList.indexOf(new Student("Tom",1)));}}
Vector
-
Vector:
-
数组结构实现,查询快、增删慢
-
1.0版本,运行效率满,线程安全
-
package com.collection.demo02;import java.util.Enumeration;import java.util.Vector;public class Demo04 {public static void main(String[] args) {//创建集合Vector vector = new Vector();//添加元素vector.add("草莓");vector.add("西瓜");vector.add("苹果");System.out.println(vector);//删除元素// vector.remove(1);// vector.remove("苹果");// System.out.println(vector);//遍历元素//1.forfor(int i = 0; i < vector.size();i++){System.out.println(vector.get(i));}//2.foreachfor (Object o : vector) {System.out.println(o);}//3.使用枚举器Enumeration enumeration = vector.elements();while(enumeration.hasMoreElements()) {System.out.println(enumeration.nextElement());}//4.判断System.out.println(vector.contains("草莓"));System.out.println(vector.isEmpty());//5.其他方法:firstElement,lastElement,elementAt}}
LinkedList
-
LinkedList:
-
链表结构实现,双向链表,增删快,查询慢
-
package com.collection.demo02;import java.util.Iterator;import java.util.LinkedList;import java.util.ListIterator;public class Demo05 {public static void main(String[] args) {//创建集合LinkedList list = new LinkedList();Student s1 = new Student("Tom",1);Student s2 = new Student("Tom",2);Student s3 = new Student("Tom",3);//添加元素list.add(s1);list.add(s2);list.add(s3);//删除元素// list.remove(s1);// list.remove(1);// list.clear();//遍历元素//1.forfor(int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//2.forEachfor (Object o : list) {System.out.println(o);}//3.迭代器Iterator it = list.iterator();while(it.hasNext()) {System.out.println(it.next());}//4.使用列表迭代器//正序ListIterator lit = list.listIterator();while(lit.hasNext()) {System.out.println(lit.next());}//倒序while(lit.hasPrevious()) {System.out.println(lit.previous());}//判断System.out.println(list.contains(s1));System.out.println(list.isEmpty());//查找System.out.println(list.indexOf(s2));}}
ArrayList和LinkedList区别
ArrayList:必须开辟连续空间,查询快,增删慢
LinkedList:无需开辟连续空间,查询慢,增删快
泛型
泛型类
package com.collection.generic; /* * 泛型类 * 语法:类名<T> * T是类型占位符,表示一种引用类型,如果编写多个用","隔开 * * * */ public class MyGeneric<T> {//使用泛型//1.创建变量T t;//2.添加方法 泛型作为方法的参数public void show(T t) {//不能实例化 new T()System.out.println(t);}//3.泛型作为方法的返回值public T getT() {return t;}}
package com.collection.generic;public class TestGeneric {public static void main(String[] args) {//使用泛型类创建对象 占位符T只能是引用类型MyGeneric<String> myGeneric = new MyGeneric<>(); //后面的<>里可写可不写 1.7之前一定要写myGeneric.t = "hello";myGeneric.show("Welcome");String s = myGeneric.getT();MyGeneric<Integer> myGeneric2 = new MyGeneric<>();myGeneric2.t = 100;myGeneric2.show(200);Integer i = myGeneric2.getT();//不同泛型类型对象之间不能相互赋值//MyGeneric<String> myGeneric3 = myGeneric2;MyGeneric<String> myGeneric3 = myGeneric;myGeneric3.show("都是String泛型,就可以直接赋值");} }
泛型接口
package com.collection.generic;public class MyInterfaceImpl implements MyInterface<String> {@Overridepublic String server(String s) {System.out.println(s);return s;} }
package com.collection.generic; //接口的实现类也不确定类型,就将实现类变成泛型 实现类是什么类型 接口就也是这个类型 public class MyInterfaceImpl2<T> implements MyInterface<T> {@Overridepublic T server(T t) {System.out.println(t);return t;} }
package com.collection.generic;public class Test1 {public static void main(String[] args) {MyInterfaceImpl impl = new MyInterfaceImpl();String str = impl.server("接口实现类重写的方法");System.out.println(str);MyInterfaceImpl2<Integer> impl2 = new MyInterfaceImpl2<>();impl2.server(100);} }
泛型方法
package com.collection.generic; /* * 泛型方法 * 语法:<T> 方法的返回值类型 * */ public class MyGenericMethod {//泛型方法public <T> void show(T t) {System.out.println("MyGenericsMethod:"+t.getClass().getName());}}
package com.collection.generic;public class Test2 {public static void main(String[] args) {//泛型方法MyGenericMethod myGenericMethod = new MyGenericMethod();myGenericMethod.show("Welcome"); //T的类型跟你在这行传递的数据而确定myGenericMethod.show(200);myGenericMethod.show(3.14);} }
泛型好处
-
提高代码的重用性,没学泛型之前要方法的重载才能用同一个方法输出不同类型的对象
-
防止类型转换异常,提高代码的安全性
泛型集合
-
概念:参数化类型、类型安全的集合、强制集合元素类型必须一致
-
特点:
-
编译时即可检查,而非运行时抛出异常
-
访问时,不必类型转换(拆箱)
-
不同泛型之间的引用不能相互赋值,泛型不存在多态
-
package com.collection.generic;public class Student {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 boolean equals(Object obj) {if(this == obj){return true;}if(obj == null){return false;}if(obj instanceof Student){Student s = (Student)obj;if(s.getName().equals(this.name)&&s.getAge() == this.age){return true;}}return false;}@Overridepublic String toString() {return "名字:" + name +", 年龄:" + age +"\t";} }
package com.collection.generic;import java.util.ArrayList;import java.util.Iterator;public class Demo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");for (String s : list) {System.out.println(s);}ArrayList<Student> list1 = new ArrayList<>();Student s1 = new Student("Tom", 1);Student s2 = new Student("Jack", 2);Student s3 = new Student("Jane", 3);list1.add(s1);list1.add(s2);list1.add(s3);Iterator<Student> iterator = list1.iterator();while (iterator.hasNext()) {Student student = iterator.next();System.out.println(student);}}}
set集合
-
特点:无序、无下标、元素不可重复
-
方法:全部继承Collection方法
package com.collection.demo04;import java.util.HashSet;import java.util.Iterator;import java.util.Set;/** Set接口的使用*特点:无序、没有下标、不能重复* */public class Demo01 {public static void main(String[] args) {//创建集合Set<String> set = new HashSet<String>();//1.添加数据set.add("iPhone");set.add("iPad");set.add("Mac");set.add("Mac"); //没有添加进来,和上面的重复了System.out.println("元素个数"+set.size());//2.删除数据// set.remove("iPhone"); //不能通过角标删除// System.out.println("删除后元素个数"+set.size());// set.clear();// System.out.println("清除后元素个数"+set.size());//3.遍历【重点】//3.1 增强forfor (String s : set) {System.out.println(s);}//3.2 迭代器Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}//4.判断System.out.println(set.contains("iPhone"));System.out.println(set.isEmpty());}}
Set实现类
HashSet【重点】
-
基于HashCode计算元素存放位置
-
当存入元素的哈希码相同时,会调用equals进行确认,结果为true,则拒绝后者存入
案例1:
package com.collection.demo04;import java.util.HashSet;import java.util.Iterator;/** HashSet集合的使用* 存储结构:哈希表(数组+链表+红黑树(1.8引入))** */public class Demo02 {public static void main(String[] args) {//创建集合HashSet<String> hashSet = new HashSet<String>();//添加元素hashSet.add("米法");hashSet.add("力巴尔");hashSet.add("乌尔波扎");hashSet.add("达尔克尔");hashSet.add("达尔克尔"); //重复的添加不进去System.out.println("英杰个数" + hashSet.size());//删除数据// hashSet.remove("米法");// hashSet.clear();// System.out.println("英杰个数"+hashSet.size());//3.遍历//3.1 增强forfor (String s : hashSet) {System.out.println(s);}//3.2 使用迭代器Iterator<String> iterator = hashSet.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}//4.判断System.out.println(hashSet.contains("林克"));hashSet.clear();System.out.println(hashSet.isEmpty());}}
案例2:
package com.collection.demo04;import com.collection.demo02.Student;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {//重写toString方法不然默认打印哈希值return "名字:"+name+";年龄:"+age;}@Overridepublic int hashCode() {int n1 = this.name.hashCode();int n2 = this.age;return n1 + n2;}@Overridepublic boolean equals(Object obj) {if(this == obj){return true;}if(obj == null){return false;}if(obj instanceof Person){Person p = (Person)obj;if(p.getName().equals(this.name)&&p.getAge() == this.age){return true;}}return false;}}
package com.collection.demo04;import java.util.HashSet;import java.util.Iterator;public class Demo03 {public static void main(String[] args) {//创建对象HashSet<Person> person = new HashSet<>();//1.添加对象Person p1 = new Person("Tom", 1);Person p2 = new Person("Jack", 2);Person p3 = new Person("Jane", 3);person.add(p1);person.add(p2);person.add(p3);person.add(p3); //重复的不能添加person.add(new Person("Tom", 1)); //这样会添加进去 想让它p1是重复的 就重写hashCode() equals()/** 存储过程* 根据hashCode计算保存的位置* 位置为空:保存* 位置不为空->* 执行equals方法* 如果equals方法为true:认为重复* false:形成链表* */System.out.println("元素个数" + person.size());//删除元素person.remove(p1);System.out.println("元素个数" + person.size());//遍历//1.增强forfor (Person person1 : person) {System.out.println(person1);}//2.迭代器Iterator<Person> iterator = person.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}//判断System.out.println(person.contains(p1));System.out.println(person.contains(new Person("Jack", 2))); //true 因为重写了hashCode equals}}
HashSet补充
以前系统重写的hashCode()出现31:
-
31是一个质数,可以生成均匀的数据,减少散列冲突
-
提升执行效率 31*i = (i << 5) - i;位运算快
TreeSet
-
基于排列顺序实现元素不重复 二叉查找树
-
实现了SortedSet接口,对集合自动排序
-
元素对象的类型必须实现Comparable接口,指定排序规则
-
通过CompareTo方法确定是否为重复元素
案例1:
package com.collection.demo04;import java.util.Iterator;import java.util.TreeSet;/**TreeSet的使用*存储结构:红黑树* */public class Demo04 {public static void main(String[] args) {//创建集合TreeSet<String> treeSet = new TreeSet<String>();//1.添加元素treeSet.add("xyz");treeSet.add("abc");treeSet.add("Hello");treeSet.add("xyz"); //重复的添加不来System.out.println("元素个数" + treeSet.size());//2.删除treeSet.remove("xyz");System.out.println("删除后元素个数" + treeSet.size());//3.遍历//3.1增强forfor (String s : treeSet) {System.out.println(s);}//3.2迭代器Iterator<String> iterator = treeSet.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}//4.判断System.out.println(treeSet.contains("abc"));}}
案例2:
package com.collection.demo04;import com.collection.demo02.Student;public class Person implements Comparable<Person> {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {//重写toString方法不然默认打印哈希值return "名字:"+name+";年龄:"+age;}@Overridepublic int hashCode() {int n1 = this.name.hashCode();int n2 = this.age;return n1 + n2;}@Overridepublic boolean equals(Object obj) {if(this == obj){return true;}if(obj == null){return false;}if(obj instanceof Person){Person p = (Person)obj;if(p.getName().equals(this.name)&&p.getAge() == this.age){return true;}}return false;}//先按姓名比,再按年龄比@Overridepublic int compareTo(Person o) {int n1 = this.getName().compareTo(o.getName());int n2 = this.getAge() - o.getAge();return n1 == 0 ? n2: n1;}}
package com.collection.demo04;import java.util.Iterator;import java.util.TreeSet;/** 使用TreeSet保存数据* 存储结构:红黑树*要求:元素必须要实现Comparable接口,重写compareTo方法,compareTo返回值0,认为重复* */public class Demo05 {public static void main(String[] args) {//创建集合TreeSet<Person> treeSet = new TreeSet<Person>();//添加元素Person p1 = new Person("Tom", 1);Person p2 = new Person("Jack", 1);Person p3 = new Person("Jane", 1);treeSet.add(p1);treeSet.add(p2);treeSet.add(p3);treeSet.add(new Person("Jack", 2));System.out.println("元素个数" + treeSet.size());System.out.println(treeSet);//报错:Person cannot be cast to java.lang.Comparable//二叉查找树放元素是小在左、大在右,我们并没有对Person类进行说明怎么比,就报错//删除// treeSet.remove(p1);// System.out.println(treeSet.size());// treeSet.remove(new Person("Jack", 1)); //这样也能删除//遍历//增强forfor (Person person : treeSet) {System.out.println(person);}//迭代器Iterator<Person> iterator = treeSet.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}//判断System.out.println(treeSet.contains(new Person("Tom", 1))); //true}}
Comparator接口
package com.collection.demo04;import java.util.Comparator;import java.util.TreeSet;/** TreeSet的使用* Comparator:实现定制比较(比较器)* Comparable:可比较的* */public class Demo06 {public static void main(String[] args) {//创建集合TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>(){//Comparator是一个接口不能直接new来实例化,这里我们使用匿名内部类@Overridepublic int compare(Person o1, Person o2) {int n1 = o1.getAge() - o2.getAge();int n2 = o1.getName().compareTo(o2.getName());return n1 == 0 ? n2:n1;}});//添加元素Person p1 = new Person("Tom", 1);Person p2 = new Person("Jack", 2);Person p3 = new Person("Jane", 3);persons.add(p1);persons.add(p2);persons.add(p3);System.out.println(persons);}}
案例:
package com.collection.demo04;import java.util.Comparator;import java.util.TreeSet;/** 要求:使用TreeSet集合实现字符串长度进行排序* Comparator接口进行定制比较* */public class Demo07 {public static void main(String[] args) {//创建集合,并指定规则TreeSet<String> set = new TreeSet<String>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int n1 = o1.length() - o2.length();int n2 = o1.compareTo(o2);return n1 == 0 ? n2:n1;}});//添加数据set.add("a");set.add("z");set.add("ab");set.add("bbc");set.add("abc");set.add("b");System.out.println(set);}}
Map体系集合
Map接口的特点:
-
用于存储任意键值对(Key-Value)
-
键:无序、无下标、不允许重复
-
值:无序、无下标、允许重复
package com.collection.map;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;/** Map接口的使用* 特点:存储键值对 键不能重复值可以重复 无序** */public class Demo01 {public static void main(String[] args) {//创建集合Map<String, String> map = new HashMap<>();//1.添加元素map.put("cn","中国");map.put("uk","英国");map.put("usa","美国");map.put("cn","China");System.out.println("元素个数"+map.size()); //还是3个System.out.println(map); //打印出来发现,cn的value是China,把中国替换了//2/删除// map.remove("usa"); //通过key来删除// System.out.println("删除后"+map.size());//3.遍历//3.1使用keySet()Set<String> keySet = map.keySet(); //变成Set集合for (String key : keySet) { //可以和上一行合并for(String key: map.keySet())System.out.println(key+":"+map.get(key)); //通过key获得value}//3.2使用entrySet方法 效率高于keySet()map.entrySet();Set<Map.Entry<String, String>> entrySet = map.entrySet();for (Map.Entry<String, String> entry : entrySet) { //同样可以和上一行合并for(Map.Entry<String,String> entry : Map.entrySet())System.out.println(entry.getKey()+":"+entry.getValue());}//4.判断System.out.println(map.containsKey("cn"));System.out.println(map.containsValue("北京"));}}
Map实现类
HashMap 【重点】
和HashSet的关系,HashSet用的就是HashMap,add调用了put
线程不安全,运行效率快允许null作为key或者value
package com.collection.map;import java.util.HashMap;import java.util.Map;/** HashMap集合的使用* 存储结构:哈希表(数组+链表+红黑树)* 使用key的hashCode和equals作为依据判断重复* */public class Demo02 {public static void main(String[] args) {//创建集合HashMap<Student, String> students = new HashMap<Student, String>();//1.添加元素Student s1 = new Student("孙悟空", 1);Student s2 = new Student("猪八戒",2);Student s3 = new Student("沙和尚", 3);students.put(s1,"花果山");students.put(s2,"高老庄");students.put(s3,"河");students.put(s3,"流沙河"); //不能加进来,key不能重复 ,但是会把之前value替换students.put(new Student("沙和尚", 3),"取经路上"); //可以加进来,new的和s3在堆里面地址不同 除非重写hashCode 和 equals, 可以alt+insert直接生成重写的这里不赘述System.out.println("元素个数"+students.size());System.out.println(students);//2.删除students.remove(s1); //通过key删除//3.遍历//3.1 keySetfor(Student key : students.keySet()) {System.out.println(key+" "+students.get(key));}//3.2 entrySetfor(Map.Entry<Student, String> entry : students.entrySet()) {System.out.println(entry.getKey()+" "+entry.getValue());}//判断System.out.println(students.containsKey(s1));System.out.println(students.containsKey(new Student("猪八戒", 2))); //没重写hashCode equals 堆里面还没有这个 false 如果重写了和s2一样,trueSystem.out.println(students.containsValue("花果山"));}}
HashMap源码总结
-
HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16
-
当元素个数大于阈值(16*0.75)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数
-
jdk1.8当每个链表长度大于8,并且数组元素个数大于等于64,会调整为红黑树,目的是提高执行效率
-
jdk1.8 当链表长度小于6时,调整成链表
-
jdk1.8 以前,链表头插入,1.8以后,尾插入
Hashtable和Properties
线程安全,运行效率慢,不允许null作为key或者是value
Properties:Hashtable的子类,要求key和value都是String,通常用于配置文件的读取
TreeMap
和TreeSet的关系,TreeSet用的就是TreeMap,add调用了put
实现了SortedMap接口,可以对key自动排序
package com.collection.map;import java.util.Map;import java.util.TreeMap;/** TreeMap的使用* 存储结构:红黑树** */public class Demo03 {public static void main(String[] args) {//创建集合TreeMap<Student, String> students = new TreeMap<Student, String>();//添加元素Student s1 = new Student("孙悟空", 1);Student s2 = new Student("猪八戒",2);Student s3 = new Student("沙和尚", 3);students.put(s1,"花果山");students.put(s2,"高老庄");students.put(s3,"流沙河");students.put(new Student("沙和尚", 3),"取经路上"); //不能加进来,但是把value替换了System.out.println("元素个数"+students.size());System.out.println(students); //出现类型转换异常 Student cannot be cast to java.lang.Comparable 去Student类里实现Comparable接口并创建比较规则//2.删除// students.remove(s1);// students.remove(new Student("猪八戒", 2)); //能删除,把他当作s2// System.out.println(students.size());//3.遍历//3.1使用keySetfor (Student key: students.keySet()) {System.out.println(key+":"+students.get(key));}//3.2使用entrySetfor(Map.Entry<Student, String> entry: students.entrySet()) {System.out.println(entry.getKey()+":"+entry.getValue());}//4.判断System.out.println(students.containsKey(new Student("猪八戒", 2))); //true}}
Collections工具类
package com.collection.demo05;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;/** Collections工具类的使用** */public class Demo01 {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(38);list.add(134);list.add(4);list.add(115);list.add(35);System.out.println("排序前"+list);//sort排序Collections.sort(list);System.out.println("排序后"+list);//binarySearch 二分查找int i = Collections.binarySearch(list, 38);// 返回2,第三个元素int j = Collections.binarySearch(list, 0);// 返回负数 表示不存在System.out.println(i +" "+j);//copy 复制// List<Integer> dest= new ArrayList<>();// Collections.copy(dest, list);// System.out.println(dest); //异常:下标越界 copy方法要求两个集合大小相同//解决方式List<Integer> dest = new ArrayList<>();for(int k = 0; k < list.size(); k++) {dest.add(0);} //给dest的元素和list一样多且都初始化为0Collections.copy(dest, list);System.out.println(dest);//reverse 反转Collections.reverse(list);System.out.println(list);//shuffle 打乱Collections.shuffle(list);System.out.println(list);//补充:list 转成 数组Integer[] arr = list.toArray(new Integer[list.size()]);//new Integer[a] a<list.size()就自动把 a = list.size(), a > list.size() a多的就是null null...System.out.println(arr.length);System.out.println(Arrays.toString(arr));//数组转成list 转后的集合是受限集合,不能对集合的元素进行修改String[] names = {"Tom","Jerry","Jack","Mike","Bob"};List<String> list2 = Arrays.asList(names);System.out.println(list2);//把基本类型数组转成集合,需要修改为包装类int[] nums = {1,2,3,4,5};List<int[]> list3 = Arrays.asList(nums); //不好,用下面的System.out.println(list3);Integer[] num = {1,2,3,4,5};List<Integer> list4 = Arrays.asList(num);System.out.println(list4);}}
相关文章:
Java集合框架
集合 概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能 和数组的区别 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 位置:java.util.* Collection体…...
salesforce如何导出所有字段
在 Salesforce 中,导出所有字段信息(包括字段名、API 名、字段类型、是否可报表、是否可搜索等)通常不是一个“一键完成”的操作,但可以通过几种方法实现。以下是常用的几种方法: ✅ 方法一:使用 Salesforc…...
一招解决Tailwindcss4.x与其他库样式冲突问题
当项目中引入tailwindcss,并与其他UI库混用时,可能会出现样式冲突问题,因为tailwindcss重置了一些基础样式,例如:引入tailwindcss后,原生button按钮没有了默认的样式。 在老版本中解决这个问题,…...
[Harmony]封装一个可视化的数据持久化工具
1.添加权限 在module.json5文件中添加权限 // 声明应用需要请求的权限列表 "requestPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC", // 权限名称:分布式数据同步权限"reason": "$string:distrib…...
关于AI人工智能的知识图谱简介
人工智能是计算机科学的一个重要领域,旨在理解和构建智能行为。人工智能可以被划分为多个子领域或分支,包括机器学习、深度学习、自然语言处理(Natural Language Processing,NLP)、计算机视觉(Computer Vis…...
uniapp,小程序中实现文本“展开/收起“功能的最佳实践
文章目录 示例需求分析实现思路代码实现1. HTML结构2. 数据管理3. 展开/收起逻辑4. CSS样式 优化技巧1. 性能优化2. 防止事件冒泡3. 列表更新处理 实际效果总结 在移动端应用开发中,文本内容的"展开/收起"功能是提升用户体验的常见设计。当列表项中包含大…...
RabbitMQ 消息模式实战:从简单队列到复杂路由(一)
RabbitMQ 初相识 在当今分布式系统大行其道的技术领域中,消息队列作为实现系统间异步通信、解耦以及流量削峰的关键组件,发挥着不可或缺的作用。而 RabbitMQ,无疑是消息队列领域中一颗耀眼的明星。自 2007 年诞生以来,RabbitMQ 凭…...
阿里云ECS部署Dify
一:在ECS上面安装Docker 关防火墙 sudo systemctl stop firewalld 检查防火墙状态 systemctl status firewalld sudo yum install -y yum-utils device-mapper-persistent-data lvm2 设置阿里镜像源,安装并启动docker [base] nameCentOS-$releas…...
Missashe考研日记—Day37-Day43
Missashe考研日记—Day37-Day43 写在面前 本系列博客用于记录博主一周的学习进度,具体知识总结在目前已有的笔记中: 1.高数强化学习笔记2.计网复习笔记 本周五到周日有其他安排,所以今天就把这一周的先更新了。 专业课408 这周学了计网的…...
DB-GPT扩展自定义app配置说明
简介 文章主要介绍了如何扩展一个自定义app插件,这里先看下生成效果,生成的内容其实还是有问题的,后续博主会调整提示词看看能不能优化生成效果 修改代码 代码详情 # chat_di是从chat_normal复制过来的,这里只改了提示词 from d…...
2025年11月软考各科目难度及适合人群分析
2025上半年软考考试报名已结束,不少小伙伴已经在咨询下半年的考试科目了,今天就给大家推荐几个好考的科目。 一、2025下半年软考考试科目 2025下半年软考考试时间为11月8日至11日。 根据计考办发布的《关于2025年度计算机技术与软件专业技术资格&…...
vue异步导入
vue的异步导入 大家开发vue的时候或多或少路由的异步导入 component: () >import(“/views/A_centerControl/intelligent-control/access-user-group”),当然这是路由页面,那么组件也是可以异步导入的 使用方式 组件的异步导入非常简单,主要是一个…...
[IMX] 03.时钟树 - Clock Tree
目录 1.PLL 时钟源 2.Clock Tree 时钟树 3.ARM 内核时钟 3.1.频率设置 - CCM_ANALOG_PLL_ARMn 3.2.时钟分频 - CCM_CACRR 3.3.时钟源选择 - CCM_CCSR 3.4.修改 ARM 内核时钟 4.PFD 时钟 4.1.PLL2_PFD 频率 - CCM_ANALOG_PFD_528n 4.2.PLL3_PFD 频率 - CCM_ANALOG_PFD…...
低功耗实现方法思路总结
1.硬件选型最重要,比如stm 8l ,MSP430,瑞萨rl78,lpc11等 2.开发仿真务必使用高精度万用表如fluke 3.在整体规划层面,避免引脚未配置的浮空状态 a)在设计开发层面,对于使用的信号,使用上下拉电阻或者推挽…...
广州SMT贴片技术优势与工艺解析
内容概要 作为电子制造领域的关键技术,广州SMT贴片工艺凭借其高精度与高效性,已成为现代电子装配的核心支撑。本文通过系统性梳理表面贴装技术(SMT)的全流程,重点聚焦广州地区在该领域的独特技术优势。内容涵盖从焊膏…...
乡村地区无人机医药配送路径规划与优化仿真
本代码意在通过对无人机路径规划和载具选择进一步帮助乡村振兴,提高农村卫生条件,让患者足不出户就可享受到医疗服务,旨在完善乡村基础设施建设,积极响应国家“十四五”规划的号召。 先选择适合在该地区配送医药物资环境下的载具材…...
AWS Elastic Beanstalk部署极简Spring工程(EB CLI失败版)
弃用 这里我没有走通EB CLI方式部署。 问题 最近又加入了AWS项目组,又要再次在AWS云上面部署Spring服务,我这里使用的使用AWS中国云。需要使用AWS Elastic Beanstalk部署一个极简Spring工程。 EB CLI安装 安装EB CLI之前需要先在本地安装好Git&…...
[训练和优化] 3. 模型优化
👋 你好!这里有实用干货与深度分享✨✨ 若有帮助,欢迎: 👍 点赞 | ⭐ 收藏 | 💬 评论 | ➕ 关注 ,解锁更多精彩! 📁 收藏专栏即可第一时间获取最新推送🔔…...
element-ui的el-cascader增加全选按钮实现(附源码)
最近遇到了在级联选择器上添加全选框的需求 ,但是项目使用的是Vue2 Element UI的架构,而我们都知道Element UI提供的级联选择器el-cascader是不支持全选框的,而我又没有在网上找到适合我项目的实现,索性自己实现一个组件…...
OpenCV人脸识别EigenFace算法、案例解析
文章目录 前言一、EigenFace 核心原理二、Python 实战:手把手搭建 EigenFace 识别系统1. 环境准备2. 代码实现与步骤详解3. 加载数据集函数4. 训练EigenFace模型函数5. 预测函数6.主程序部分7. 可视化结果8. 代码分步解读 三、优化技巧四、总结 前言 在人脸识别领域…...
Python模块化编程
Python模块化编程 记得我刚学Python那会儿,特别喜欢把所有代码都写在一个文件里。直到有一天,我的项目膨胀到了2000多行代码,每次修改都要翻半天…这才痛定思痛,开始研究模块化编程。今天就跟大家聊聊这个让代码变得优雅的魔法。…...
Java对象的GC回收年龄的研究
目录 1、介绍 2、内存结构 2.1、普通对象 2.2、数组对象 2.3、数组长度作用 2.4、为什么 age 用 4 位? 3、对象头组成 3.1、Mark Word(标记字段) 3.2、Class Pointer(类指针) 4、GC 发生的位置 4.1、新生代…...
IT系统的基础设施:流量治理、服务治理、资源治理,还有数据治理。
文章目录 引言I IT系统的基础设施流量治理、服务治理、资源治理,还有数据治理。开发语言的选择数据治理(监控系统):整体运维的数据其他II 基础知识的重要性第一,知道原理第二,当遇到一些比较难解的问题时,基础知识就会派上用场。例子III 快速学会一门编程语言把语言照着…...
SpringBoot应用启动过程
Spring 应用抽象 Springboot 是一个用来快速创建 Spring 应用的微服务框架,启动引导器是org.springframework.boot.SpringApplication 这个类,每个 SpringApplication 实例就表示一个 Spring 应用的启动类;Spring 应用生命周期包括创建、启动…...
傻子学编程之——Java并发编程的问题与挑战
傻子学编程之——Java并发编程的问题与挑战 Java并发编程能让程序跑得更快,但也像走钢丝一样充满风险。本文用最直白的语言和代码示例,带你直面并发编程的四大「致命陷阱」,并给出解决方案。 一、资源竞争:多个线程打架怎么办&am…...
groovy 如何遍历 postgresql 所有的用户表 ?
在 Groovy 中遍历 PostgreSQL 所有用户表,你可以使用 JDBC 连接数据库并执行 SQL 查询。以下是一个完整的示例: Groovy 代码示例 import groovy.sql.Sqldef config [url: jdbc:postgresql://localhost:5432/your_database,user: your_username,passwo…...
CPU cache基本原理
CPU cache基本原理 存储器层次结构存储器层次结构中的缓存高速缓存存储器直接映射高速缓存组相联高速缓存全相联高速缓存 多核 CPU 下缓存问题内存的读写操作流程数据一致性与并发控制 高速缓存(cache)是一个小而快速地存储设备,它作为存储在…...
【Java学习笔记】【第一阶段项目实践】零钱通(面向过程版本)
零钱通(面向过程版本) 需求分析 1. 需要实现的功能 (1) 收益入账 (2) 消费 (3 )查看明细 (4 )退出系统 2. 代码优化部分 (1) 对用户输入 4 退出时,给出提示 “你确定要退出吗?y/n”,必须输入正确的 y/n,…...
Cursor无法使用C/C++调试的解决办法
背景 这几天在二开ffmpeg,发现用cursor无法使用cppdbg进行调试,只能上机gdb,比较麻烦。 配置文件 // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// Fo…...
VSTO(C#)Excel开发进阶2:操作图片 改变大小 滚动到可视区
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 入…...
嵌入式自学第二十二天(5.15)
顺序表和链表 优缺点 存储方式: 顺序表是一段连续的存储单元 链表是逻辑结构连续物理结构(在内存中的表现形式)不连续 时间性能, 查找顺序表O(1):下标直接查找 链表 O(n):从头指针往后遍历才能找到 插入和…...
高云FPGA-新增输出管脚约束
module led (input sys_clk, // clk inputinput sys_rst_n, // reset inputoutput reg [5:0] led, // 6 LEDS pinoutput reg gpio // 1 GPIO pin 25 ); 在原来的代码基础上新增加一个gpio输出,绑定到25管脚上 打开工程文件夹中的cts文件…...
Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查
Nginx 返回 504 状态码表示 网关超时(Gateway Timeout),这意味着 Nginx 作为反向代理服务器,在等待上游服务器(如后端应用服务器、数据库服务器等)响应时,超过了预设的时间限制,最终…...
单片机 | 基于STM32的智能马桶设计
基于STM32的智能马桶设计结合了传感器技术、嵌入式控制及物联网功能,旨在提升用户体验并实现健康监测。以下是其设计原理、功能模块及代码框架的详细解析: 一、系统架构与核心功能 智能马桶的系统架构通常分为主控模块、传感器模块、执行器模块、通信模块及用户交互模块,主…...
2900. 最长相邻不相等子序列 I
2900. 最长相邻不相等子序列 I class Solution:def getLongestSubsequence(self, words: List[str], groups: List[int]) -> List[str]:n len(groups) # 获取 groups 列表的长度ans [] # 初始化一个空列表,用于存储结果for i, g in enumerate(groups): # 遍…...
欧姆龙 CJ/CP 系列 PLC 串口转网口模块:工业通信升级的智能之选
在工业自动化领域,欧姆龙 CJ/CP 系列 PLC 凭借高可靠性和灵活扩展性,广泛应用于汽车制造、食品加工、能源化工等关键行业。然而,传统串口通信的局限性(如距离受限、协议兼容性差、难以实现远程监控)却成为企业智能化升…...
BGP选路实验
一.需求 1.使用PreVal策略,确保R4通过R2到达192.168.10.0/24 2.使用As_Path策略,确保R4通过R3到达192.168.11.0/24 3.配置MED策略,确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略,确保R1通过R2到达192.168.1.0/2…...
Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析
目录 一.LVSKeepAlived高可用负载均衡集群的部署 二.NginxKeepAlived高可用负载均衡集群的部署 一.LVSKeepAlived高可用负载均衡集群的部署 实验环境 主keepalived:192.168.181.10 lvs (7-1) 备keepalived:192.168.181.10…...
idea整合maven环境配置
idea整合maven 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个知识点,都是写出代码…...
pytest框架 - 第二集 allure报告
一、断言assert 二、Pytest 结合 allure-pytest 插件生成美观的 Allure 报告 (1) 安装 allure 环境 安装 allure-pytest 插件:pip install allure-pytest在 github 下载 allure 报告文件 地址:Releases allure-framework/allure2 GitHub下载&#x…...
互联网大厂Java求职面试:构建高并发直播平台的架构设计与优化
标题:互联网大厂Java求职面试:构建高并发直播平台的架构设计与优化 引言 在互联网大厂的Java求职面试中,技术总监级别的面试官通常会提出一系列复杂且前沿的技术问题,以评估候选人的真实技术水平。本篇文章将围绕构建一个千万级…...
Ruby 循环与迭代器
Ruby 循环与迭代器 循环迭代器timesuptostep 循环 。。。。 迭代器 迭代器本质上可以理解为是循环的一种类型 times 3.times do print "Ho! " end begin Ho! Ho! Ho! end上述代码表示我们对当前 block 部分中的内容循环三次。最终,我们打印出了三个…...
pyenv简单的Python版本管理器(macOS版)
问题 python版本是真的多,需要用一个版本管理器管理Python多版本安装在同一台机器的问题。接下来,我们就尝试使用pyenv来管理。 安装pyenv brew update brew install pyenv配置Zsh echo export PYENV_ROOT"$HOME/.pyenv" >> ~/.zshr…...
Automatic Recovery of the Atmospheric Light in Hazy Images论文阅读
Automatic Recovery of the Atmospheric Light in Hazy Images 1. 论文的研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法、模型与公式2.1 方法框架2.1.1 方向估计(Orientation Estimation)2.1.2 幅值估计(Magnitude Estimation)2.2 与传统方法的对…...
Vuex和Vue的区别
Vue和Vuex有着不同的功能和定位,主要区别如下: 概念与功能 - Vue:是一个构建用户界面的JavaScript框架,专注于视图层的开发,采用组件化的方式构建应用程序,通过数据绑定和指令系统,能方便地…...
全国青少年信息素养大赛 Python编程挑战赛初赛 内部集训模拟试卷八及详细答案解析
信息素养大赛初赛Python编程模拟试卷八 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解...
RabbitMQ 消息模式实战:从简单队列到复杂路由(二)
进阶探索:工作队列模式 工作队列模式剖析 工作队列模式,也被称为任务队列模式,是对简单队列模式的一种扩展和优化,旨在解决当任务量较大时,单个消费者无法快速处理所有任务的问题 。在工作队列模式中,依然…...
崩坏星穹铁道风堇前瞻养成攻略 崩坏星穹铁道风堇配队推荐
风堇是崩坏星穹铁道3.3上半版本即将登场的一名全新五星角色,她的机制和强度都还不错,今天就给大家一些养成攻略。 一、突破材料准备 1.基础材料:旅情见闻 3 个冒险记录 3 个漫游指南 289 个命运的足迹 8 个 2.特供材料:思量的种…...
如何利用 Python 爬虫按关键字搜索京东商品:实战指南
在电商领域,京东作为国内知名的电商平台,拥有海量的商品数据。通过 Python 爬虫技术,我们可以高效地按关键字搜索京东商品,并获取其详细信息。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。本文将…...
阿里云的网络有哪些
阿里云的网络类型丰富,主要包括以下几种: 专有网络 VPC(Virtual Private Cloud)1:是用户基于阿里云创建的自定义私有网络。不同的专有网络之间二层逻辑隔离,用户可在自己创建的专有网络内创建和管理云产品…...