Set集合:
-
特点:
- 不包含重复元素的集合;
- 没有带索引的方法,所以不能使用普通for循环遍历,可以使用迭代器和增强for循环;
-
example
import java.util.HashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { //创建集合对象 //set是一个接口,不能直接实例化,需要找其实现类 Set<String> set = new HashSet<>(); //添加元素 set.add("Hello"); set.add("world"); set.add("Java"); //不包含重复元素 set.add("Java"); //遍历:迭代器或增强for for(String s: set){ System.out.println(s); //HashSet对集合的迭代顺序不作任何保证 } } }
Hash值:
-
哈希值:是jdk根据对象的地址或字符串或者数字算出来的int类型的数字
-
哈希值不是地址;
-
哈希值是int类型的数值;
注:Object类中有一个方法可以获得对象的哈希值,public int hashCode()
-
example
public class HashDemo { public static void main(String[] args) { //创建学生对象 Student s1 = new Student("张三", 23); //同一个对象多次调用hashCode方法,返回的哈希值是相同的 System.out.println(s1.hashCode()); //1163157884 System.out.println(s1.hashCode());//1163157884 System.out.println("-----------------"); Student s2 = new Student("张三", 23); //默认情况下(使用Object类),不同对象的哈希值是不同的 //通过方法重写是可以实现不同对象的哈希值是相同的 System.out.println(s2.hashCode()); //1956725890 System.out.println("重地".hashCode()); System.out.println("通话".hashCode()); } }
public class Student implements Comparable<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; } }
HashSet集合
-
特点:
- 底层数据结构是哈希表;
- 不保证存储和取出的元素顺一致;
- 不能用普通for循环,是因为没有带索引的方法;
- 由于是set集合,所以是不包含重复元素的集合;
-
example
/*需求: 1.创建一个存储学生对象的集合,存储三个学生对象,实用程序实现控制台遍历该集合; 2.要求:学生对象的的成员变量值相同,我们就认为是同一个对象; 思路: 1.定义学生类; 2.创建HashSet集合对象; 3.创建学生对象; 4.把学生添加到集合; 5.遍历集合(增强for) 6.在学生类中重写equals和hashCode */ public class HashSetDemo1 { public static void main(String[] args) { //创建集合对象 HashSet<Student> hs = new HashSet<>(); //创建学生对象 //Student student = new Student(); hs.add(new Student("张三", 23)); hs.add(new Student("李四", 24)); hs.add(new Student("王五", 25)); //不将equals和hashCode重写将不会去除重复元素; //重写是在Student类中自动生成重写方法 hs.add(new Student("王五", 25)); for (Student h : hs) { System.out.println(h.getName()+" "+h.getAge()); } } }
public class Student implements Comparable<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; } //alt+insert 系统自动重写 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } //alt+insert 系统自动重写 @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }
-
HashSet集合保证元素的唯一性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21tmbYi5-1573311894883)(H:\2019Java-西开\笔记\HashSet元素唯一的原因.jpg)]
LinkedHashSet集合
-
特点:
- 哈希表和链表实现的set接口,具有可预测的迭代次序;
- 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的;
- 由哈希表保证元素的唯一性;
-
example:
import java.util.LinkedHashSet; public class LinkedHashSetDemo { public static void main(String[] args) { //创建集合对象 LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); //添加元素 linkedHashSet.add("Hello"); linkedHashSet.add("World"); linkedHashSet.add("Java"); //遍历集合 for (String s : linkedHashSet) { System.out.println(s); } } }
TreeSet集合
-
特点:
- 元素有序,这里的顺序不是指存储和取出的有序,而是按照一定的规则进行排序,具体方式取决于构造方法;
- TreeSet(); 无参构造方法根据其元素的自然排序进行排序,比如26字母顺序,0-9大小顺序等;
- TreeSet(Comparator comparator);有参构造方法根据经指定的比较器进行排序;
- 不能使用for循环遍历;
- 不包含重复的元素;
- 元素有序,这里的顺序不是指存储和取出的有序,而是按照一定的规则进行排序,具体方式取决于构造方法;
-
example:
-
import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { //创建集合对象 TreeSet<Integer> ts = new TreeSet<>(); //添加元素 ts.add(10); ts.add(40); ts.add(30); ts.add(50); ts.add(20); //遍历元素 for (Integer t : ts) { System.out.println(t); } } }
-
无参构造:Comparable
/*存储学生对象并遍历,创建集合使用无参构造方法; 要求:按照年龄从小到大排序,年龄相同,按照 姓名的字母顺序排序*/ import java.util.TreeSet; public class TreeSet_Comparable { public static void main(String[] args) { //创建集合对象 TreeSet<Student> ts = new TreeSet<>(); //创建学生对象: Student s1 = new Student("zhangsan", 13); Student s2 = new Student("lisi", 12); Student s3 = new Student("wangwu", 19); Student s4 = new Student("laoliu", 13); //添加元素 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); //遍历 for (Student t : ts) { System.out.println(t.getName() + "," + t.getAge()); } } }
public class Student implements Comparable<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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } @Override public int compareTo(Student s) { /* return 0; //表示输入元素重复 return 1; //输入正序排列 return -1; //输入逆序排列*/ //按照年龄从小到大排序, //自然排序:this代表 s1 s代表s2 int num = this.age - s.age; //年龄相同,按照 姓名的字母顺序排序 int num2 = num == 0 ? this.name.compareTo(s.name) : num; return num2; } }
-
有参构造:Comparator
/*存储学生对象并遍历,创建TreeSet集合使用带参构造方法; 要求:按照年龄从小到大排序,年龄相同,按照 姓名的字母顺序排序*/ import java.util.Comparator; import java.util.TreeSet; public class TreeSet_Comparator { public static void main(String[] args) { //创建结合对象 //需要一个Comparator接口,使用匿名内部类 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //自然排序法: //this.age - s.age //s1 s2 //此处的this代替的是TreeSet_Comparator //因为Student里边的age name均是私有,故而只能调用方法来获取 int num = s1.getAge() - s2.getAge(); int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; return num2; } }); //创建学生对象: Student s1 = new Student("zhangsan", 13); Student s2 = new Student("lis", 14); Student s3 = new Student("wangwu", 11); Student s4 = new Student("woai", 11); //添加元素 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); //遍历: for (Student t : ts) { System.out.println(t.getName() + "," + t.getAge()); } } }
-
Map集合
-
Interface Map<K,V> K:键的类型; V:值的类型
-
将映射到值的对象:不能包含重复的键;每个键最多有一个对应的值;
-
创建Map集合的对象:多态实现方式(具体实现类:HashMap)
-
example:
/* 举例:学生的学号和姓名: Student001 张三 Student002 李四 Student003 王五 */ public class MapDemo { public static void main(String[] args) { //创建结合对象 Map<String, String> map = new HashMap<>(); //添加元素 // V put(K key, V value)将指定的值与该映射中的指定键相关联 map.put("stu001", "张三"); map.put("stu002", "李四"); map.put("stu003", "王五"); //当键重复的时候,后边的值会替换前边的值,输出的时候,刘能会替换王五 map.put("stu003", "刘能"); //输出集合对象,HashMap重写了toString System.out.println(map); } }
-
常用方法:
//创建集合对象 Map<String, String> map = new HashMap<>(); 方法1.V put(K key, V value); 添加元素 map.put("刘能", "牛"); map.put("赵四", "鼠"); map.put("顺子", "虎"); 方法2.V remove(Object key); 根据键删除键值对应的元素 System.out.println(map.remove("刘能")); System.out.println(map.remove("刘u"));//没有该键返回null 方法3.void clear(); 移除所有的键值对应的元素 map.clear(); 方法4.boolean containsKey(Object key); 判断集合是否包含指定的键 System.out.println(map.containsKey("赵四")); 方法5.boolean containsValue(Object value); 判断集合是否包含指定的值 System.out.println(map.containsValue("鼠")); 方法6.int size(); 集合的长度,也就是集合中键值得个数 System.out.println(map.size()); 方法7.V get(Object key); 根据键获取值的方法 System.out.println(map.get("刘能")); System.out.println(map.get("刘9"));//键不存在,返回值为null 方法8.Set<K> KeySet(); 获取所有键的集合 Set<String> keySet = map.keySet(); for (String s : keySet) { System.out.println(s); } 方法9.Collection<V> values(); 获取所有值的集合 Collection<String> values = map.values(); for (String value : values) { System.out.println(value); } 方法 10.set<Map.Entry<K,V>> entrySet() 获取所有键值对 对象的集合 getKey(); 得到键 getValue();得到值 for (Map.Entry<String, String> m : map) { String key = m.getKey(); Student value = m.getValue(); System.out.println(key + "-------" + value); }
-
Map集合遍历方法:
/* Map集合遍历(方式1): 1.获取所有键的集合,用keySet()方法; 2.遍历键的集合,获取到每一个键,增强for循环; 3.根据键取找值,用get(Object key);方法 */ /* Map集合遍历(方式2): 1.获取所有键值对对象的集合 Set<Map.entry<K,V>> entrySet(); 获取所有键值对对象集合 2.遍历键值对对象的集合,得到键值对对象; 用增强for循环,得到每一个Map.entry 3.根据键值对对象获取键和值; 用getKey();方法获取键 用getValue();方法获取值; */ import javafx.scene.control.cell.MapValueFactory; import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapCollectionTraversal { public static void main(String[] args) { //创建集合对象 Map<String, String> map = new HashMap<>(); //添加元素: map.put("刘能", "牛"); map.put("赵四", "鼠"); map.put("顺子", "虎"); //方式1: //1.获取所有键的集合,用keySet()方法 Set<String> keySet = map.keySet(); //2.遍历键的集合,获取到每一个键,增强for循环; for (String key : keySet) { //3.根据键取找值,用get(Object key);方法 String value = map.get(key); System.out.println(key + "," + value); } //方式2: //1.获取所有键值对对象的集合 Set<Map.entry<K,V>> entrySet(); Set<Map.Entry<String, String>> keyValue = map.entrySet(); //2.遍历键值对对象的集合,得到键值对对象;用增强for循环,得到每一个Map.entry for (Map.Entry<String, String> MapEntry : keyValue) { //3.根据键值对对象获取键和值; // 用getKey();方法获取键 // 用getValue();方法获取值; String key = MapEntry.getKey(); String value = MapEntry.getValue(); System.out.println(key + "," + value); } } }
HashMap集合
-
example 1:
/* 需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student)。 存储三个元素,并遍历; 思路: 1.定义学生类; 2.创建HashMap集合对象; 3.创建学生对象; 4.能把学生添加到集合; 5.遍历集合: 方式1:键找值; 方式2:键值对对象找键和值; */ import java.util.HashMap; import java.util.Map; import java.util.Set; public class HashMapExample { public static void main(String[] args) { //创建集合对象 HashMap<String, Student> map = new HashMap<>(); //创建学生对象 Student s1 = new Student("刘能", 34); Student s2 = new Student("赵四", 35); Student s3 = new Student("玉田", 33); //把学生添加到集合 map.put("001", s1); map.put("002", s2); map.put("003", s3); //遍历集合: //方式1:键找值; //1.获取所有键的集合keySet Set<String> keySet = map.keySet(); //2.用增强for循环遍历键集合,得到每一个键 for (String key : keySet) { //3.根据键取值get(); Student value = map.get(key); System.out.println(key + "-------" + value.getName() + "," + value.getAge()); } System.out.println("==============分界线==============="); //方式2:键值对对象找键和值; // 1.Set<Map.entry<K,V>> entrySet(); 获取所有键值对对象集合 Set<Map.Entry<String, Student>> MapEntry = map.entrySet(); //2.用增强for循环,得到每一个Map.entry for (Map.Entry<String, Student> entry : MapEntry) { // 3. 用getKey();方法获取键 // 用getValue();方法获取值; String key = entry.getKey(); Student value = entry.getValue(); System.out.println(key + "-------" + value.getName() + "," + value.getAge()); } } }
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; } }
-
example 2
/* 需求:创建一个HashMap集合,键是学生对象(Student),值是居住地(String). 存储多个键值对元素,并遍历 思路: 1.定义学生类; 2.使用HashMap集合对象; 3.创建学生对象; 4.把学生添加到集合; 5.遍历集合; 6.在学生类重写两个方法: hashCode() equals() 自动生成 */ import java.util.HashMap; import java.util.Map; import java.util.Set; public class HashMapExample2 { public static void main(String[] args) { //使用HashMap集合对象; HashMap<Student, String> hashMap = new HashMap<>(); //创建学生对象; Student s1 = new Student("赵1", 23); Student s2 = new Student("赵2", 22); Student s3 = new Student("赵3", 24); Student s4 = new Student("赵4", 25); Student s5 = new Student("赵5", 26); Student s6 = new Student("赵6", 21); Student s7 = new Student("赵6", 21); //把学生添加到集合; hashMap.put(s1, "陕西"); hashMap.put(s2, "河南"); hashMap.put(s3, "山东"); hashMap.put(s4, "山西"); hashMap.put(s5, "云南"); hashMap.put(s6, "西藏"); hashMap.put(s7, "西藏"); //遍历集合; //方式1: //获取所有键keySet Set<Student> keySet = hashMap.keySet(); //遍历,取出所有键 增强for for (Student key : keySet) { //根据键查找值 get() String value = hashMap.get(key); System.out.println(key.getName() + "---" + key.getAge() + "---" + value); } System.out.println("============分界线==========="); //方式2: //获取键值对对象集合: Set<Map.Entry<Student, String>> entrySet = hashMap.entrySet(); //遍历集合,获得每一个键值对 for (Map.Entry<Student, String> entry : entrySet) { //获取键:getKey() //获取值:getValue(); Student key = entry.getKey(); String value = entry.getValue(); System.out.println(key.getName() + "---" + key.getAge() + "---" + value); } } }
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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }
-
HashMap集合里边含有ArrayList集合
/* 需求:创建一个HashMap集合,存储三个键值对元素,每个键值对元素的键是 String,值是ArrayList,每个ArrayList的元素是String。并遍历 思路: 1.创建Hashmap集合; 2.创建ArrayList集合,并添加元素; 3.把ArrayList作为元素添加到HashMap集合; 4.遍历HashMap集合; 数据: 第一个ArrayList集合的元素:(三国演义)、周公瑾 小乔 第二个ArrayList集合的元素:(西游记)、牛魔王 铁扇公主 第三个ArrayList集合的元素:(红楼梦)、贾宝玉 林黛玉 */ import java.util.ArrayList; import java.util.HashMap; import java.util.Set; public class HashMapIncludeArrayList { public static void main(String[] args) { //创建Hashmap集合; HashMap<String, ArrayList<String>> hashMap = new HashMap<>(); //创建ArrayList集合,并添加元素 ArrayList<String> arrayList1 = new ArrayList<>(); arrayList1.add("周公瑾"); arrayList1.add("小乔"); //创建ArrayList集合,并添加元素 ArrayList<String> arrayList2 = new ArrayList<>(); arrayList2.add("牛魔王"); arrayList2.add("铁扇公主"); //创建ArrayList集合,并添加元素 ArrayList<String> arrayList3 = new ArrayList<>(); arrayList3.add("贾宝玉"); arrayList3.add("林黛玉"); //把ArrayList作为元素添加到HashMap集合 hashMap.put("三国演义", arrayList1); hashMap.put("西游记", arrayList2); hashMap.put("红楼梦", arrayList3); //遍历HashMap集合 Set<String> keySet = hashMap.keySet(); for (String key : keySet) { System.out.println(key); ArrayList<String> valueArray = hashMap.get(key); for (String value : valueArray) { System.out.println("\t"+value); } } } }
-
ArrayList集合元素为HashMap
/* 需求:创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap,每个 HashMap的键和值都是String,并遍历; 思路: 1.创建ArrayList集合; 2.创建HashMap集合,并添加元素; 3.把HashMap作为元素添加到ArrayList集合; 4.遍历ArrayList集合; */ import java.util.ArrayList; import java.util.HashMap; import java.util.Set; public class ArrayListIncludeHashMap { public static void main(String[] args) { //创建ArrayList集合 ArrayList<HashMap<String, String>> arrayList = new ArrayList<>(); //创建HashMap集合,并添加元素 HashMap<String, String> hm1 = new HashMap<>(); //添加元素到HashMap集合 hm1.put("赵1", "1号"); hm1.put("赵2", "2号"); //把HashMap作为元素添加到ArrayList; arrayList.add(hm1); HashMap<String, String> hm2 = new HashMap<>(); //添加元素到HashMap集合 hm2.put("李1", "3号"); hm2.put("李2", "4号"); //把HashMap作为元素添加到ArrayList; arrayList.add(hm2); HashMap<String, String> hm3 = new HashMap<>(); //添加元素到HashMap集合 hm3.put("周1", "5号"); hm3.put("周2", "6号"); //把HashMap作为元素添加到ArrayList; arrayList.add(hm3); //遍历ArrayList集合 for (HashMap<String, String> hm : arrayList) { Set<String> keySet = hm.keySet(); for (String key : keySet) { String value = hm.get(key); System.out.println(key + "---" + value); } } } }