集合框架详解之Set、Map接口与实现类
2022/7/23 23:26:41
本文主要是介绍集合框架详解之Set、Map接口与实现类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
集合框架
1.Set集合
1.1Set集合概述
-
Set实现类:HashSet类、TreeSet类
-
特点:无序、无下标、元素不可重复
-
方法:全部继承自Collection中的方法
1.11 Set接口的使用简单代码演示
package collection.demo03; import java.util.HashSet; import java.util.Iterator; /** * 测试Set接口的使用 * 特点:1.无序,没有下标;2.不能重复 * 1.添加数据 * 2.删除数据 * 3.遍历【重点】 * 4.判断 */ public class SetTest1 { public static void main(String[] args) { //新建集合 HashSet<String> stringHashSet = new HashSet<>(); //添加数据 stringHashSet.add("许巍"); stringHashSet.add("赵雷"); stringHashSet.add("郑钧"); stringHashSet.add("赵照"); System.out.println(stringHashSet.size()); System.out.println(stringHashSet.toString());//无序输出 System.out.println(stringHashSet.add("赵照"));//false,这个重复数没有放入到集合中 System.out.println(stringHashSet.size()); //删除数据 stringHashSet.remove("郑钧"); System.out.println(stringHashSet.size()); System.out.println(stringHashSet.toString()); //遍历数据 //3.1 使用增强for for (String s : stringHashSet) { System.out.println(s); } //3.2 使用迭代器 Iterator<String> iterator = stringHashSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //判断数据 System.out.println(stringHashSet.isEmpty()); System.out.println(stringHashSet.contains("赵雷")); } }
运行结果
4 [赵雷, 赵照, 许巍, 郑钧] false 4 3 [赵雷, 赵照, 许巍] 赵雷 赵照 许巍 赵雷 赵照 许巍 false true
1.2 Set实现类->HashSet
-
HashSet:
- 存储结构:哈希表(数组+链表+红黑树)
-
存储过程(重复依据):
-
(1).根据hashCode计算保存的位置,如果位置为空,直接保存,若不为空,进行第二步
-
(2).再执行equals方法,如果equals为true,则认为是重复,否则形成链表
-
HashSet底层就是利用HashMap来完成的。
-
1.21 HashSet集合的使用代码演示:
package collection.demo03; import java.util.Objects; /** * 人类 */ 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 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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { //底层是31原因 //(1)31是质数,可以减少散列冲突(使得计算的哈希值尽量不一样); //(2)可以提高执行效率(31*i = (i << 5) - i); return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } //比较规则:先按姓名比再按年龄比 @Override public int compareTo(Person o) { int n1=this.getName().compareTo(o.getName()); int n2=this.age-o.getAge(); return n1==0?n2:n1; } }
package collection.demo03; import java.util.HashSet; import java.util.Iterator; /** * HashSet集合的使用 * 存储结构:哈希表(数组+链表+红黑树) * 1.添加元素 * 2.删除元素 * 3.遍历 * 4.判断 * *存储过程(重复依据) *(1)基于HashCode计算元素存放位置。如果此位置为空,则直接保存,如果不为空执行第二步 * 2)再执行equals方法,如果equals方法为true,则认为是重复,拒绝后者存入,否则,形成链表 * * */ public class HashSetTest1 { public static void main(String[] args) { //创建集合 HashSet<Person> personHashSet = new HashSet<>(); //1.添加元素 Person p1 = new Person("张无忌", 21); Person p2 = new Person("郭靖", 21); Person p3 = new Person(";令狐冲", 21); Person p4 = new Person("胡斐", 21); personHashSet.add(p1); personHashSet.add(p2); personHashSet.add(p3); personHashSet.add(p4); System.out.println(personHashSet.size()); System.out.println(personHashSet.toString()); //重复 不再添加 System.out.println(personHashSet.add(p1));//false //直接new一个相同属性的对象,依然会被添加,相当于内存中开辟了新的内存地址。 //这样添加的元素可以添加进去 为了避免这种情况 可以重写 hashcode方法来避免这种情况 //重写后 由name age决定hashcode System.out.println(personHashSet.add(new Person("胡斐", 21)));//false System.out.println(personHashSet.toString()); //2.删除 //personHashSet.remove(p4); personHashSet.remove(new Person("胡斐", 21)); System.out.println(personHashSet.toString()); //3.遍历 //增强for System.out.println("============================"); for (Person person : personHashSet) { System.out.println(person); } //使用迭代器 System.out.println("----------------------------"); Iterator<Person> iterator = personHashSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //4.判断 System.out.println(personHashSet.isEmpty()); //注:假如相同属性便认为是同一个对象,该怎么做? System.out.println(personHashSet.contains(new Person("郭靖", 21)));//true 因为重写了hashcode和equals } }
运行结果
4 [Person{name=';令狐冲', age=21}, Person{name='胡斐', age=21}, Person{name='张无忌', age=21}, Person{name='郭靖', age=21}] false false [Person{name=';令狐冲', age=21}, Person{name='胡斐', age=21}, Person{name='张无忌', age=21}, Person{name='郭靖', age=21}] [Person{name=';令狐冲', age=21}, Person{name='张无忌', age=21}, Person{name='郭靖', age=21}] ============================ Person{name=';令狐冲', age=21} Person{name='张无忌', age=21} Person{name='郭靖', age=21} ---------------------------- Person{name=';令狐冲', age=21} Person{name='张无忌', age=21} Person{name='郭靖', age=21} false true
1.3 List实现类->TreeSet
- TreeSet:
-
基于排序顺序实现不重复
-
实现了SortedSet接口,对集合元素自动排序
-
元素对象的类型必须实现Comparable接口,指定排序规则。
-
通过CompareTo方法确定是否为重复元素
-
1.31 TreeSet的基本使用代码演示:
package collection.demo03; import java.util.Iterator; import java.util.TreeSet; /** * TreeSet的基本使用:默认按照字典表排序 * 存储结构:红黑树 * */ public class TreeSetTest1 { public static void main(String[] args) { //创建集合 TreeSet<String > stringTreeSet = new TreeSet<String >(); //1.添加元素 stringTreeSet.add("hello"); stringTreeSet.add("abcd"); stringTreeSet.add("world"); stringTreeSet.add("xyz"); System.out.println(stringTreeSet.size()); System.out.println(stringTreeSet.toString()); //2.删除 stringTreeSet.remove("hello"); System.out.println(stringTreeSet.size()); System.out.println(stringTreeSet.toString()); //3.遍历 //增强for for (String s : stringTreeSet) { System.out.println(s); } //使用迭代器 Iterator<String> iterator = stringTreeSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //4.判断 System.out.println(stringTreeSet.contains("abc")); System.out.println(stringTreeSet.isEmpty()); } }
运行结果
4 [abcd, hello, world, xyz] 3 [abcd, world, xyz] abcd world xyz abcd world xyz false false
1.32 TreeSet保存对象数据comparator实现定制比较代码演示:
package collection.demo03; import java.util.Objects; /** * 人类 */ 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 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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { //底层是31原因 //(1)31是质数,可以减少散列冲突(使得计算的哈希值尽量不一样); //(2)可以提高执行效率(31*i = (i << 5) - i); return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } //比较规则:先按姓名比再按年龄比 @Override public int compareTo(Person o) { int n1=this.getName().compareTo(o.getName()); int n2=this.age-o.getAge(); return n1==0?n2:n1; } }
package collection.demo03; import java.util.Iterator; import java.util.TreeSet; /** * * * TreeSet保存数据:添加元素为对象操作 * * 存储结构:红黑树 * * 元素必须实现Comparable接口 自定义比较方式 * * CompareTo方法返回值为 0 则认为是重复元素 * *comparator 实现定制比较 */ public class TreeSetTest2 { public static void main(String[] args) { //创建集合 TreeSet<Person> personTreeSet = new TreeSet<>(); //1.添加元素 Person p1 = new Person("刘德华", 22); Person p2 = new Person("郭富城", 23); Person p3 = new Person("古天乐", 24); Person p4 = new Person("古天乐", 25); personTreeSet.add(p1); personTreeSet.add(p2); personTreeSet.add(p3); personTreeSet.add(p3); personTreeSet.add(p4); System.out.println(personTreeSet.size()); System.out.println(personTreeSet.toString()); //2.删除 personTreeSet.remove(p4); System.out.println(personTreeSet.toString()); //3.遍历 //增强for for (Person person : personTreeSet) { System.out.println(person); } //使用迭代器Iterator Iterator<Person> iterator = personTreeSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //4.判断 System.out.println(personTreeSet.contains(new Person("古天乐", 24))); } }
运行结果
4 [Person{name='刘德华', age=22}, Person{name='古天乐', age=24}, Person{name='古天乐', age=25}, Person{name='郭富城', age=23}] [Person{name='刘德华', age=22}, Person{name='古天乐', age=24}, Person{name='郭富城', age=23}] Person{name='刘德华', age=22} Person{name='古天乐', age=24} Person{name='郭富城', age=23} Person{name='刘德华', age=22} Person{name='古天乐', age=24} Person{name='郭富城', age=23} true
1.33 TreeSet的集合使用定制比较器Comparator代码演示:
package collection.demo03; import java.util.Comparator; import java.util.TreeSet; /** * 还有一种定制比较器Comparator 不需要对对象类实现Comparable * TreeSet集合的实现定制比较 * Comparator:实现定制比较(比较器) * Comparable:可比较的 * */ public class ComparatorTest { public static void main(String[] args) { //创建集合 并指定比较规则 TreeSet<Person> people = new TreeSet<>(new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { int n1=o1.getAge()-o2.getAge(); int n2=o1.getName().compareTo(o2.getName()); return n1==0?n2:n1; } }); //1.添加元素 Person p1 = new Person("hello", 21); Person p2 = new Person("lisi", 20); Person p3 = new Person("zhangsan", 20); Person p4 = new Person("hello", 22); people.add(p1); people.add(p2); people.add(p3); people.add(p4); System.out.println(people.toString()); //people.remove(p4); people.remove(new Person("hello",22));//也可以删除 我们重写的compareTo方法比较的是name和age*/ System.out.println(people.size()); System.out.println(people.toString()); } }
运行结果
[Person{name='lisi', age=20}, Person{name='zhangsan', age=20}, Person{name='hello', age=21}, Person{name='hello', age=22}] 3 [Person{name='lisi', age=20}, Person{name='zhangsan', age=20}, Person{name='hello', age=21}]
1.34 用TreeSet实现字符串长度的比较案例代码演示:
package collection.demo03; import java.util.Comparator; import java.util.TreeSet; /** * treeSet的使用 * comparator自制 * 使用treeSet 实现字符串长度的比较,若字符串的长相同,则按照默认字典排序 * comparator 实现定制比较 */ public class Demo { public static void main(String[] args) { //创建集合 并指定比较规则 TreeSet<String> stringTreeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { int n1=o1.length()-o2.length(); int n2=o1.compareTo(o2); return n1==0?n2:n1; } }); //添加元素 stringTreeSet.add("xian"); stringTreeSet.add("nanjing"); stringTreeSet.add("beijing"); stringTreeSet.add("shijiazhuang"); stringTreeSet.add("huludao"); stringTreeSet.add("sanya"); stringTreeSet.add("xiamen"); System.out.println(stringTreeSet.toString()); } }
运行结果
[xian, sanya, xiamen, beijing, huludao, nanjing, shijiazhuang]
2. Map集合
2.1 Map集合概述
- 实现类:Hashtable类、HashMap类、TreeMap类
- Map接口的特点
- (1)用于存储任意键值对(key - value)
- (2)键:无序、无下标、不允许重复(唯一)
- (3)值:无序、无下标、允许重复
- 总结特点:存储一堆数据(Key-value),无序,无下标,键不可重复,值可重复。
- 方法:
-
增加:
put(K key, V value)
-
删除:
clear() remove(Object key) remove(Object key, Object value)
-
修改:
replace(K key, V value)
-
查看:
entry(K k, V v) entrySet() get(Object key) keySet() size() values()
-
判断:
containsKey(Object key) containsValue(Object value) equals(Object o) isEmpty()
-
V put(K key,V value)
//将对象存放到集合中,关联键值。key重复则覆盖原有值 -
Object get(Obeject key)
//根据键获取对应的值 -
KeySet()
//返回所有key; -
Set<Map.Entry<K,V>> entrySet()
//键值匹配的set集合 -
Collection<V> values()
//返回包含所有值的Collection集合
-
2.11 ** Map接口的使用简单代码演示**
package collection.demo04; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * Map接口的使用 * 特点:使用的键值对,key 无序、无下标、不可以重复 value 无序、无下标、可以重复 无序 * */ public class MapTest { public static void main(String[] args) { //创建Map集合 Map<String ,String> stringHashMap = new HashMap<>(); //1.添加元素 stringHashMap.put("CHN","中国"); stringHashMap.put("AUS"," 澳大利亚"); stringHashMap.put("JP","日本"); stringHashMap.put("KR","韩国"); System.out.println(stringHashMap.size()); System.out.println(stringHashMap.toString()); //2.删除元素 stringHashMap.remove("KR"); System.out.println(stringHashMap.size()); System.out.println(stringHashMap.toString()); //遍历 //使用keySet System.out.println("======================"); //Set<String> strings = stringHashMap.keySet();//可以省略,不需要引用 for (String string : stringHashMap.keySet()) { System.out.println(string+"......."+stringHashMap.get(string)); } //使用entrySet()方法 System.out.println("======================"); Set<Map.Entry<String, String>> entries = stringHashMap.entrySet(); for (Map.Entry<String, String> entry : entries) { System.out.println(entry.getKey()+":"+entry.getValue()); } //使用迭代器 System.out.println("======================"); Iterator<Map.Entry<String, String>> iterator = stringHashMap.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, String> next = iterator.next(); System.out.println(next.getKey()+":"+next.getValue()); } //判断 System.out.println(stringHashMap.containsKey("CHN")); System.out.println(stringHashMap.containsValue("中国")); } }
运行结果
4 {JP=日本, KR=韩国, CHN=中国, AUS= 澳大利亚} 3 {JP=日本, CHN=中国, AUS= 澳大利亚} ====================== JP.......日本 CHN.......中国 AUS....... 澳大利亚 ====================== JP:日本 CHN:中国 AUS: 澳大利亚 ====================== JP:日本 CHN:中国 AUS: 澳大利亚 true true
2.2 Map实现类->HashMap
-
HashMap:
- JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value。
-
特点:无序、唯一,按照key进行总结的,因为底层key遵照哈希表的结构(数组+链表)
- 哈希表原理:比如放入这个集合的数据对应的那个类:必须重写hasCode方法和equals方法。
2.21 HashMap的使用代码演示
package collection.demo04; public class Student implements Comparable<Student>{ private String name; private int stuNo; public Student() { } public Student(String name, int stuNo) { this.name = name; this.stuNo = stuNo; } public String getName() { return name; } public int getStuNo() { return stuNo; } public void setName(String name) { this.name = name; } public void setStuNo(int stuNo) { this.stuNo = stuNo; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", stuNo=" + stuNo + '}'; } @Override public int compareTo(Student o) { /* int num1 = this.name.compareTo(o.name); int num2 = this.stuNo - o.stuNo; return num2 == 0 ? num1 : num2; */ int n1=this.stuNo-o.getStuNo(); return n1; } }
package collection.demo04; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * HashMap的使用 * 存储结构:哈希表(数组+链表+红黑树) * 使用key的hashcode和equals作为重复依据 */ public class HashMapTest { public static void main(String[] args) { //创建集合 HashMap<Student,String> studentHashMap = new HashMap<>(); //1.添加元素 Student s1 = new Student("孙悟空",01); Student s2 = new Student("金蝉子",02); Student s3 = new Student("猪八戒",03); Student s4 = new Student("沙悟净",04); studentHashMap.put(s1,"北京"); studentHashMap.put(s2,"南京"); studentHashMap.put(s3,"东京"); studentHashMap.put(s4,"西京"); //studentHashMap.put(s4,"中京");//添加失败,西京被中京覆盖 studentHashMap.put(new Student("沙悟净",04),"西湖");//可以添加成功 //从写hashcode与equals方法就会添加失败 System.out.println(studentHashMap.size()); System.out.println(studentHashMap.toString()); //2.删除 studentHashMap.remove(s3); System.out.println(studentHashMap.size()); System.out.println(studentHashMap.toString()); //3.遍历 //使用keySet System.out.println("================"); Set<Student> students = studentHashMap.keySet(); for (Student student : students) { System.out.println(student+":"+studentHashMap.get(student)); } //使用entrySet System.out.println("================"); Set<Map.Entry<Student, String>> entries = studentHashMap.entrySet(); for (Map.Entry<Student, String> entry : entries) { System.out.println(entry.getKey()+"="+entry.getValue()); } //判断 System.out.println(studentHashMap.containsKey(s1)); System.out.println(studentHashMap.containsKey(new Student("张三", 21))); System.out.println(studentHashMap.containsValue("北京")); } }
运行结果
5 {Student{name='孙悟空', stuNo=1}=北京, Student{name='猪八戒', stuNo=3}=东京, Student{name='沙悟净', stuNo=4}=西湖, Student{name='金蝉子', stuNo=2}=南京, Student{name='沙悟净', stuNo=4}=西京} 4 {Student{name='孙悟空', stuNo=1}=北京, Student{name='沙悟净', stuNo=4}=西湖, Student{name='金蝉子', stuNo=2}=南京, Student{name='沙悟净', stuNo=4}=西京} ================ Student{name='孙悟空', stuNo=1}:北京 Student{name='沙悟净', stuNo=4}:西湖 Student{name='金蝉子', stuNo=2}:南京 Student{name='沙悟净', stuNo=4}:西京 ================ Student{name='孙悟空', stuNo=1}=北京 Student{name='沙悟净', stuNo=4}=西湖 Student{name='金蝉子', stuNo=2}=南京 Student{name='沙悟净', stuNo=4}=西京 true false true
2.3 Map实现类->TreeMap
-
TreeMap:
- 实现了SortedMap接口(是Map的子接口),可以对key自动排序
-
特点:唯一、有序(按照升序或降序)
- 原理:二叉树,key遵循二叉树的特点,放入集合的key的数据对应的类型内部一定要实现比较器(内部比较器与外部比较器,二选一)
2.31 TreeMap的使用实现Comparable接口代码演示
package collection.demo04; public class Student implements Comparable<Student>{ private String name; private int stuNo; public Student() { } public Student(String name, int stuNo) { this.name = name; this.stuNo = stuNo; } public String getName() { return name; } public int getStuNo() { return stuNo; } public void setName(String name) { this.name = name; } public void setStuNo(int stuNo) { this.stuNo = stuNo; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", stuNo=" + stuNo + '}'; } @Override public int compareTo(Student o) { /* int num1 = this.name.compareTo(o.name); int num2 = this.stuNo - o.stuNo; return num2 == 0 ? num1 : num2; */ int n1=this.stuNo-o.getStuNo(); return n1; } }
package collection.demo04; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * TreeMap的使用 * 存储结构:红黑树 * 需要有比较规则实现Comparable接口 */ public class TreeMapTest { public static void main(String[] args) { //新建集合 TreeMap<Student,String> treeMap = new TreeMap<>(); //1.添加元素 Student s1 = new Student("孙悟空",01); Student s2 = new Student("金蝉子",02); Student s3 = new Student("猪八戒",03); Student s4 = new Student("沙悟净",04); treeMap.put(s1,"北京"); treeMap.put(s2,"上海"); treeMap.put(s3,"广东"); treeMap.put(s4,"深圳"); System.out.println(treeMap.size()); System.out.println(treeMap.toString());//Exception in thread "main" java.lang.ClassCastException: //由于是红黑树,需要有比较规则,实现comparable接口 //删除 //treeMap.remove(s1); treeMap.remove(new Student("沙悟净",04)); System.out.println(treeMap.size()); System.out.println(treeMap.toString()); //3.遍历 //使用keySet System.out.println("================"); Set<Student> students = treeMap.keySet(); for (Student student : students) { System.out.println(student+":"+treeMap.get(student)); } //使用entrySet System.out.println("================"); Set<Map.Entry<Student, String>> entries = treeMap.entrySet(); for (Map.Entry<Student, String> entry : entries) { System.out.println(entry.getKey()+"="+entry.getValue()); } //判断 System.out.println(treeMap.containsKey(s1)); System.out.println(treeMap.containsKey(new Student("张三", 21))); System.out.println(treeMap.containsValue("北京")); } }
运行结果
4 {Student{name='孙悟空', stuNo=1}=北京, Student{name='金蝉子', stuNo=2}=上海, Student{name='猪八戒', stuNo=3}=广东, Student{name='沙悟净', stuNo=4}=深圳} 3 {Student{name='孙悟空', stuNo=1}=北京, Student{name='金蝉子', stuNo=2}=上海, Student{name='猪八戒', stuNo=3}=广东} ================ Student{name='孙悟空', stuNo=1}:北京 Student{name='金蝉子', stuNo=2}:上海 Student{name='猪八戒', stuNo=3}:广东 ================ Student{name='孙悟空', stuNo=1}=北京 Student{name='金蝉子', stuNo=2}=上海 Student{name='猪八戒', stuNo=3}=广东 true false true
2.32 TreeMap的使用匿名内部类实现comparator实现定制比较代码演示
package collection.demo04; import java.util.Comparator; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * TreeMap的使用 * comparator 实现定制比较 */ public class TreeMapTest2 { public static void main(String[] args) { //新建集合 TreeMap<Student,String> treeMap = new TreeMap<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int num1 = o1.getName().compareTo(o2.getName()); int num2 = o1.getStuNo() - o2.getStuNo(); return num2 == 0 ? num1 : num2; } }); //1.添加元素 Student s1 = new Student("孙悟空",01); Student s2 = new Student("金蝉子",02); Student s3 = new Student("猪八戒",03); Student s4 = new Student("沙悟净",04); treeMap.put(s1,"北京"); treeMap.put(s2,"上海"); treeMap.put(s3,"广东"); treeMap.put(s4,"深圳"); System.out.println(treeMap.size()); System.out.println(treeMap.toString());//Exception in thread "main" java.lang.ClassCastException: //由于是红黑树,需要有比较规则,实现comparable接口 //删除 //treeMap.remove(s1); treeMap.remove(new Student("沙悟净",04)); System.out.println(treeMap.size()); System.out.println(treeMap.toString()); //3.遍历 //使用keySet System.out.println("================"); Set<Student> students = treeMap.keySet(); for (Student student : students) { System.out.println(student+":"+treeMap.get(student)); } //使用entrySet System.out.println("================"); Set<Map.Entry<Student, String>> entries = treeMap.entrySet(); for (Map.Entry<Student, String> entry : entries) { System.out.println(entry.getKey()+"="+entry.getValue()); } //判断 System.out.println(treeMap.containsKey(s1)); System.out.println(treeMap.containsKey(new Student("张三", 21))); System.out.println(treeMap.containsValue("北京")); } }
运行结果
4 {Student{name='孙悟空', stuNo=1}=北京, Student{name='金蝉子', stuNo=2}=上海, Student{name='猪八戒', stuNo=3}=广东, Student{name='沙悟净', stuNo=4}=深圳} 3 {Student{name='孙悟空', stuNo=1}=北京, Student{name='金蝉子', stuNo=2}=上海, Student{name='猪八戒', stuNo=3}=广东} ================ Student{name='孙悟空', stuNo=1}:北京 Student{name='金蝉子', stuNo=2}:上海 Student{name='猪八戒', stuNo=3}:广东 ================ Student{name='孙悟空', stuNo=1}=北京 Student{name='金蝉子', stuNo=2}=上海 Student{name='猪八戒', stuNo=3}=广东 true false true
3.Collection工具类与Properties集合
3.1.Collection工具类
-
概念:集合工具类,定义了除了存取以外的集合常用方法。
-
方法:copy复制、reverse反转、shuffle打乱、sort排序
- 反转集合中元素的顺序:
public static void reverse(List<?> list)
- 随机重置集合元素的顺序:
public static void shuffle(List<?> list)
- 升序排序(元素类型必须实现Comparable接口):
public static void sort(List<T> list)
- 反转集合中元素的顺序:
3.11 Colletion工具类的使用代码演示:
package collection.demo04; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * Colletion工具类的使用 */ public class CollectionsTest { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(12); arrayList.add(54); arrayList.add(108); arrayList.add(36); arrayList.add(72); arrayList.add(5); // sort 排序 System.out.println("排序之前"+arrayList.toString()); Collections.sort(arrayList); System.out.println("排序之后 " +arrayList.toString()); // binarySearch 二分查找 int i = Collections.binarySearch(arrayList,12); System.out.println(i);// 存在返回下标 int i1 = Collections.binarySearch(arrayList, 102); System.out.println(i1);// 没有返回负数 // copy 复制 ArrayList<Integer> arrayList1 = new ArrayList<>(); //*需要注意的是 dest 和 list 大小必须一致 才能复制成功 for (int i2 = 0; i2 < arrayList.size(); i2++) { arrayList1.add(0); } Collections.copy(arrayList1,arrayList); System.out.println(arrayList1.toString()); // reverse 反转 System.out.println("反转之前 " +arrayList.toString()); Collections.reverse(arrayList); System.out.println("反转之后 " +arrayList.toString()); // shuffle 打乱 Collections.shuffle(arrayList); System.out.println("打乱之后 " + arrayList.toString()); //补充:list集合 转成数组 Integer[] integers = arrayList.toArray(new Integer[2]); System.out.println(integers.toString()); //补充: 数组转成集合 String[] arr={"张三","李四","王二","麻子","赵六"}; List<String> strings = Arrays.asList(arr); System.out.println(strings.toString()); // 集合是一个受限集合,不能添加和删除,因为数组长度固定 //strings.add("钱七");//java.lang.UnsupportedOperationException //strings.remove(0); // 基本类型数组转集合时,需要变成包装类 int[] arr1={1,5,7,8,15,24}; List<int[]> ints = Arrays.asList(arr1); System.out.println("被认为数组对象,仅一个元素 "+ints); Integer[] arr2={3,6,9,18,36}; List<Integer> integers1 = Arrays.asList(arr2); System.out.println("基本类型包装类多个对象 " + integers1); } }
运行结果
排序之前[12, 54, 108, 36, 72, 5] 排序之后 [5, 12, 36, 54, 72, 108] 1 -6 [5, 12, 36, 54, 72, 108] 反转之前 [5, 12, 36, 54, 72, 108] 反转之后 [108, 72, 54, 36, 12, 5] 打乱之后 [36, 108, 54, 12, 5, 72] [Ljava.lang.Integer;@1540e19d [张三, 李四, 王二, 麻子, 赵六] 被认为数组对象,仅一个元素 [[I@677327b6] 基本类型包装类多个对象 [3, 6, 9, 18, 36]
3.2 Properties集合
-
Properties:属性集合,Hashtable的子类,要求Key和Value都是String。通常用于配置文件的读取
-
特点:
-
1.存储属性名和属性值
-
2.属性名和属性值都是字符串类型
-
3.没有泛型
-
4.和流有关
-
3.21 集合properties的使用代码演示:
package collection.demo04; import java.io.*; import java.util.Map; import java.util.Properties; import java.util.Set; /** * 演示集合properties的使用 * Properties文件操作 * properties可以用来做配置文件 * * javaweb javaee开发中通常会用到 */ public class PropertiesTest { public static void main(String[] args) throws IOException { Properties properties = new Properties(); //添加数据 properties.setProperty("username","zhangsan"); properties.setProperty("age","20"); properties.setProperty("sex","man"); properties.setProperty("Nationality","Chinese"); System.out.println(properties.toString()); //遍历 //3.1 keySet System.out.println("--------------------------------"); Set<Object> objects = properties.keySet(); for (Object object : objects) { System.out.println(object+"---"+properties.getProperty((String) object)); } //3.2 entrySet System.out.println("--------------------------------"); Set<Map.Entry<Object, Object>> entries = properties.entrySet(); for (Map.Entry<Object, Object> entry : entries) { System.out.println(entry.getKey()+":"+entry.getValue()); } //3.3 stringPropertyNames() System.out.println("--------------------------------"); Set<String> strings = properties.stringPropertyNames();//返回键集 for (String string : strings) { System.out.println(string+"=="+properties.getProperty(string)); } //和流有关的方法 //list:将属性列表输出到指定的输出流 PrintWriter printWriter = new PrintWriter("D:\\printing.txt"); properties.list(printWriter); printWriter.close(); System.out.println("list方法完成"); //store保存:将此Properties表中的属性列表(键和元素对)写入输出流 FileOutputStream fileOutputStream = new FileOutputStream("D:\\Store.properties"); properties.store(fileOutputStream,"注释"); fileOutputStream.close(); System.out.println("store方法完成"); //load加载:从输入流中读取属性列表(键和元素对) Properties properties1 = new Properties(); FileInputStream fileInputStream = new FileInputStream("D:\\Store.properties"); properties1.load(fileInputStream); System.out.println(properties1.toString()); System.out.println("load方法完成"); } }
运行结果
{age=20, sex=man, Nationality=Chinese, username=zhangsan} -------------------------------- age---20 sex---man Nationality---Chinese username---zhangsan -------------------------------- age:20 sex:man Nationality:Chinese username:zhangsan -------------------------------- age==20 sex==man username==zhangsan Nationality==Chinese list方法完成 store方法完成 {age=20, sex=man, username=zhangsan, Nationality=Chinese} load方法完成
更多参考
千峰教育-集合框架详解
这篇关于集合框架详解之Set、Map接口与实现类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?