集合框架

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 使用增强forfor (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;}@Overridepublic 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);}@Overridepublic int hashCode() {//底层是31原因//(1)31是质数,可以减少散列冲突(使得计算的哈希值尽量不一样);//(2)可以提高执行效率(31*i = (i << 5) - i);return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}//比较规则:先按姓名比再按年龄比@Overridepublic 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决定hashcodeSystem.out.println(personHashSet.add(new Person("胡斐", 21)));//falseSystem.out.println(personHashSet.toString());//2.删除//personHashSet.remove(p4);personHashSet.remove(new Person("胡斐", 21));System.out.println(personHashSet.toString());//3.遍历//增强forSystem.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 Set实现类->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.遍历//增强forfor (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;}@Overridepublic 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);}@Overridepublic int hashCode() {//底层是31原因//(1)31是质数,可以减少散列冲突(使得计算的哈希值尽量不一样);//(2)可以提高执行效率(31*i = (i << 5) - i);return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}//比较规则:先按姓名比再按年龄比@Overridepublic 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.遍历//增强forfor (Person person : personTreeSet) {System.out.println(person);}//使用迭代器IteratorIterator<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>() {@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;}});//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>() {@Overridepublic 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());//遍历//使用keySetSystem.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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", stuNo=" + stuNo +'}';}@Overridepublic 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.遍历//使用keySetSystem.out.println("================");Set<Student> students = studentHashMap.keySet();for (Student student : students) {System.out.println(student+":"+studentHashMap.get(student));}//使用entrySetSystem.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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", stuNo=" + stuNo +'}';}@Overridepublic 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.遍历//使用keySetSystem.out.println("================");Set<Student> students = treeMap.keySet();for (Student student : students) {System.out.println(student+":"+treeMap.get(student));}//使用entrySetSystem.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>() {@Overridepublic 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.遍历//使用keySetSystem.out.println("================");Set<Student> students = treeMap.keySet();for (Student student : students) {System.out.println(student+":"+treeMap.get(student));}//使用entrySetSystem.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 keySetSystem.out.println("--------------------------------");Set<Object> objects = properties.keySet();for (Object object : objects) {System.out.println(object+"---"+properties.getProperty((String) object));}//3.2 entrySetSystem.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接口与实现类相关推荐

  1. Java 集合框架 详解

    一.Java 集合框架概述 集合框架是一个用来代表和操纵集合的统一架构(java集合框架位于java.util包中).所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.例如 Collec ...

  2. Java集合框架总结(5)——Map接口的使用

    Java集合框架总结(5)--Map接口的使用 Map用于保存具有映射关系的数据(key-vlaue).Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回fa ...

  3. 双目视觉集合框架详解

    双目视觉几何框架详解 一.图像坐标:我想和世界坐标谈谈(A) 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题.希望这样的方式让大家以一个轻松的心态阅读玉米的<计算机视觉学习笔记> ...

  4. Java集合框架详解

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  5. Java 集合框架详解

    1.集合框架的设计目标 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性. 对一个集合的扩展和适应必须 ...

  6. java面向对象编程集合边框_Java学习系列(七)Java面向对象之集合框架详解(上)

    Java集合 有时也将集合称为容器类,它的作用就是用来"装对象"的.这里要注意的是集合也可以是对象.下面先看一张图: HashSet:底层用一个数组存元素 --而且这个数组的长度永 ...

  7. java集合详解_「软帝学院」Java进阶者专栏:集合框架详解3

    软帝学院笔记Day14 集合框架(HashSet存储字符串并遍历) A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 HashSet hs = new Has ...

  8. list集合下标从几开始_Java基础进阶 集合框架详解

    今日任务 1.List接口介绍(掌握常用List特有方法) 2.练习 3.ArrayList介绍(必须清楚集合的特征.掌握集合中的方法) 4.LinkedList介绍(必须清楚集合的特征.掌握集合中的 ...

  9. Java--集合框架详解

    文章目录 1.集合概念 2.Collection接口 2.1.Collection父接口 2.2.**Collection的使用** 3.List接口与实现类 3.1.List子接口 3.2.List ...

最新文章

  1. arm linux 启动之一:汇编启动到start_kernel
  2. Strategy_Level3
  3. Java集合---LinkedList源码解析
  4. 比较常用的几个正则表达式
  5. Jenkins - Extended E-mail配置教程
  6. [NOI2012(bzoj2879)(vijos1726)]美食节 (费用流)
  7. 桁架工业机器人编程_工业机器人之桁架机器人
  8. Asp.NetCore轻松学-部署到 IIS 进行托管
  9. YOLOX目标检测模型Keras实现,超越Yolov5
  10. 交互原型案例Axure50套
  11. ATmega16 单片机 AVR单片机 智能风扇控制器
  12. 【电子设计大赛】2017 年全国大学生电子设计竞赛 仪器和主要元器件清单
  13. No.44-VulnHub-Pegasus: 1-Walkthrough渗透学习
  14. TIPC Cluster5
  15. 如何选择值得深入学习的技术方向
  16. Win7 设置防火墙开放特定端口
  17. 从《雪白血红》说起(1)
  18. 元素和小于等于阈值的正方形的最大边长(来源:力扣(LeetCode))
  19. 忘掉Mirai吧,新型“变砖”病毒让你的物联网设备彻底完犊子!
  20. 干支纪年java_天干地支纪年法 - osc_xcg0s5cw的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. 手机裂脑纪:中国式审美还有救吗?
  2. JZOJ 2018.07.15【2018提高组】模拟C组
  3. 洪荒:不周山上的绝世大能(三)
  4. 前端工作总结199-对ref的理解
  5. 计算机毕业设计 SpringBoot+Vue线上素菜超市平台蔬菜商城管理系统 蔬菜超市平台系统
  6. c语言:购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。...
  7. 茹立云:推荐未来的价值要比搜索引擎大
  8. 测试成长小说5 这个锅我不背
  9. 交换机的基本原理(特别是动态ARP、静态ARP、代理ARP)
  10. 炫龙毁灭者P6-581S1NR笔记本重装win10系统教程