Collections类
Comparable
1 2 3 4 5
| Collections: public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。 public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。 public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。 public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
|
注意:
sort排序使用前提:
- 被排序的集合里面存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
Comparable接口的排序规则:
Person类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package com.tipdm.Demo02;
public class Person implements Comparable<Person>{ private String name; private int age;
public String getName() { return name; }
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public Person(String name, int age) { this.name = name; this.age = age; }
public Person() { }
@Override public int compareTo(Person o) {
return this.getAge() - o.getAge();
} }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| package com.tipdm.Demo02;
import java.util.ArrayList; import java.util.Collections;
public class demo1 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); System.out.println(list);
Collections.addAll(list, "aa", "bb", "cc"); System.out.println(list);
Collections.shuffle(list); System.out.println(list);
Collections.sort(list); System.out.println(list);
ArrayList<Person> list02 = new ArrayList<>(); list02.add(new Person("张三", 15)); list02.add(new Person("李四", 20)); list02.add(new Person("王五", 26)); list02.add(new Person("赵六", 18)); System.out.println(list02); System.out.println("====================="); Collections.sort(list02); System.out.println(list02);
} }
|
1 2 3 4 5 6 7 8 9
| [a, b, c, d, e] [a, b, c, d, e, aa, bb, cc] [b, bb, aa, cc, e, c, d, a] [a, aa, b, bb, c, cc, d, e] [Person{name='张三', age=15}, Person{name='李四', age=20}, Person{name='王五', age=26}, Person{name='赵六', age=18}] ===================== [Person{name='张三', age=15}, Person{name='赵六', age=18}, Person{name='李四', age=20}, Person{name='王五', age=26}]
进程已结束,退出代码0
|
Comparator
public static <T> void sort(List<T> list,Comparator<? super T> ):
将集合中元素按照指定规则排序。
Comparator
和Comparable
的区别:
Comparator的排序规则:
o1 - o2 : 升序
o2 - o1 : 降序
Student类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package com.tipdm.Demo02;
public class Student { private String name; private int age;
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; }
public Student(String name, int age) { this.name = name; this.age = age; }
public Student() { }
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; } }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| package com.tipdm.Demo02;
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;
public class demo2 { public static void main(String[] args) { ArrayList<Integer> list01 = new ArrayList<>(); list01.add(1); list01.add(3); list01.add(2); System.out.println(list01);
Collections.sort(list01, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2;
} }); System.out.println(list01);
ArrayList<Student> list02 = new ArrayList<>(); list02.add(new Student("迪丽热巴", 18)); list02.add(new Student("古力娜扎", 20)); list02.add(new Student("杨幂", 17)); list02.add(new Student("杨幂", 18)); System.out.println(list02);
Collections.sort(list02, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int res = o1.getAge() - o2.getAge(); if(res == 0){ res = o1.getName().charAt(0) - o2.getName().charAt(0); } return res; } }); System.out.println(list02); } }
|
1 2 3 4 5 6
| [1, 3, 2] [1, 2, 3] [Student{name='迪丽热巴', age=18}, Student{name='古力娜扎', age=20}, Student{name='杨幂', age=17}, Student{name='杨幂', age=18}] [Student{name='杨幂', age=17}, Student{name='杨幂', age=18}, Student{name='迪丽热巴', age=18}, Student{name='古力娜扎', age=20}]
进程已结束,退出代码0
|
Map集合
java.util.Map<K, V>集合
Map集合的特点:
Map集合是一个双列集合,一个元素包含两个值 (一个key,一个value)
Map集合中的元素,key和value的数据类型可以相同,也可以不同
Map集合中的元素,key是不允许重复的,value是可以重复的。
Map集合中的元素,key和value是一一对应
java.util.HashMap<k, v>集合 implements Map<k, v>接口
HashMap集合的特点:
- HashMap集合底层是哈希表:查询的速度特别快
JDK1.8之前:数组+单向列表
JDK1.8之后:数组+单向列表/红黑树(链表的长度超过8):提高查询速度
- hashMap集合是一个无序集合,存储元素和取出元素的顺序有可能不一致
Java.util.LinkedHashMap<k, v>集合 extends HashMap<k, v>集合
linkedHashMao的特点:
LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
public V put(K key, V value):
把指定的键与指定的值添加到Map集合中。
public V remove(Object key):
把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key):
根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key):
判断集合中是否包含指定的键。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| package com.tipdm.Demo01;
import java.util.HashMap; import java.util.Map;
public class demo1 { public static void main(String[] args) { show01(); System.out.println("================="); show02(); System.out.println("================="); show03(); System.out.println("================="); show04(); }
private static void show04() { Map<String, Integer> map = new HashMap<>(); map.put("赵丽颖", 168); map.put("杨颖", 165); map.put("林志玲", 178);
boolean b1 = map.containsKey("赵丽颖"); System.out.println(b1);
boolean b2 = map.containsKey("赵颖"); System.out.println(b2); }
private static void show03() { Map<String, Integer> map = new HashMap<>(); map.put("赵丽颖", 168); map.put("杨颖", 165); map.put("林志玲", 178);
Integer v1 = map.get("杨颖"); System.out.println(v1);
Integer v2 = map.get("迪丽热巴"); System.out.println(v2); }
private static void show02() { Map<String, Integer> map = new HashMap<>(); map.put("赵丽颖", 168); map.put("杨颖", 165); map.put("林志玲", 178); System.out.println(map);
Integer v1 = map.remove("林志玲"); System.out.println(v1); System.out.println(map);
Integer v2 = map.remove("林志颖"); System.out.println(v2); }
private static void show01() { Map<String, String> map = new HashMap<>();
String v1 = map.put("李晨", "范冰冰1"); System.out.println("v1:" + v1);
String v2 = map.put("李晨", "范冰冰2"); System.out.println("v2:" + v2);
System.out.println(map);
map.put("冷风", "龙小云"); map.put("杨过", "小龙女"); map.put("尹志平", "小龙女"); System.out.println(map); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| v1:null v2:范冰冰1 {李晨=范冰冰2} {杨过=小龙女, 尹志平=小龙女, 李晨=范冰冰2, 冷风=龙小云} ================= {林志玲=178, 赵丽颖=168, 杨颖=165} 178 {赵丽颖=168, 杨颖=165} null ================= 165 null ================= true false
进程已结束,退出代码0
|
遍历Map集合
public Set<K> keySet():
获取Map集合中所有的键,存储到Set集合中。
37.1.1 Map
集合的第一种遍历方式:通过键找值的方式
Map
集合中的方法:
Set<K> keySet()
返回此映射中包含的键的 Set 视图。
实现步骤:
使用Map集合中的方法keySet()
,把Map
集合所有的key
取出来,存储到一个Set集合中
遍历set
集合,获取Map集合中的每一个key
通过Map
集合中的方法get(key)
,通过key
找到value
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package com.tipdm.Demo01;
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;
public class demo2 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("赵丽颖", 168); map.put("杨颖", 165); map.put("林志玲", 178);
Set<String> set = map.keySet();
Iterator<String> it = set.iterator(); while(it.hasNext()){ String key = it.next(); Integer value = map.get(key); System.out.println(key + "=" + value); } System.out.println("==============================="); for (String s : set) { Integer value = map.get(s); System.out.println(s+"="+value); } System.out.println("========================"); for (String s : map.keySet()) { Integer value = map.get(s); System.out.println(s+"="+value); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| 林志玲=178 赵丽颖=168 杨颖=165 =============================== 林志玲=178 赵丽颖=168 杨颖=165 ======================== 林志玲=178 赵丽颖=168 杨颖=165
进程已结束,退出代码0
|
Map集合遍历的第二种方式:使用Entry对象遍历
Map
集合遍历的第二种方式:使用Entry
对象遍历
Map
集合中的方法:
public Set<Map.Entry<K,V>> entrySet():
获取到Map集合中所有的键值对对象的集合(Set集合)。
实现步骤:
使用Map
集合中的方法entrySet
,把Map
集合中多个Entry
对象取出来,存储到一个Set
集合中
遍历Set
集合,获取每一个Entry
对象
使用Entry
对象中的方法getKey()
和getValue()
获取键与值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.tipdm.Demo01;
import java.util.HashMap; import java.util.Map; import java.util.Set;
public class demo3Entry { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("赵丽颖", 168); map.put("杨颖", 165); map.put("林志玲", 178);
Set<Map.Entry<String, Integer>> set = map.entrySet(); for (Map.Entry<String, Integer> stringIntegerEntry : set) { String key = stringIntegerEntry.getKey(); Integer value = stringIntegerEntry.getValue(); System.out.println(key + "=" + value); }
} }
|
1 2 3 4 5
| 林志玲=178 赵丽颖=168 杨颖=165
进程已结束,退出代码0
|
HashMap存储自定义类型键值
HashMap存储自定义类型键值
Map集合保证key是唯一的:
- 作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
Person类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package com.tipdm.Demo01;
public class Person { private String name; private int age;
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", 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; }
public Person(String name, int age) { this.name = name; this.age = age; }
public Person() { } }
|
Student类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package com.tipdm.Demo01;
import java.util.Objects;
public class Student { private String name; private int code;
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return code == student.code && Objects.equals(name, student.name); }
@Override public int hashCode() { return Objects.hash(name, code); }
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", code=" + code + '}'; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getCode() { return code; }
public void setCode(int code) { this.code = code; }
public Student(String name, int code) { this.name = name; this.code = code; }
public Student() { } }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| package com.tipdm.Demo01;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.util.HashMap; import java.util.Map; import java.util.Set;
public class demo4 { public static void main(String[] args) { show01(); System.out.println("==================="); show02(); }
private static void show02() { Map<Student, Person> map = new HashMap<>(); map.put(new Student("A同学", 1001), new Person("张三", 18)); map.put(new Student("B同学", 1002), new Person("李四", 19)); map.put(new Student("A同学", 1001), new Person("王五", 16)); map.put(new Student("D同学", 1004), new Person("赵六", 20)); map.put(new Student("E同学", 1005), new Person("钱七", 21)); for (Map.Entry<Student, Person> studentPersonEntry : map.entrySet()) { System.out.println(studentPersonEntry); } }
private static void show01() { HashMap<String, Person> map = new HashMap<>(); map.put("北京", new Person("张三", 18)); map.put("上海", new Person("李四", 19)); map.put("广州", new Person("王五", 18)); map.put("北京", new Person("赵六", 18));
Set<String> strings = map.keySet(); for (String string : strings) { Person value = map.get(string); System.out.println(string+"-->"+value);
} } }
|
1 2 3 4 5 6 7 8 9 10
| 上海-->Person{name='李四', age=19} 广州-->Person{name='王五', age=18} 北京-->Person{name='赵六', age=18} =================== Student{name='D同学', code=1004}=Person{name='赵六', age=20} Student{name='E同学', code=1005}=Person{name='钱七', age=21} Student{name='A同学', code=1001}=Person{name='王五', age=16} Student{name='B同学', code=1002}=Person{name='李四', age=19}
进程已结束,退出代码0
|
LinkedHashMap类
java.util.LinkedHashMap<K,V> extends HashMap<>K, V>
Map
接口的哈希表和链接列表实现,具有可预知的迭代顺序。
底层原理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package com.tipdm.Demo01;
import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map;
public class demo5LinkedHashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.put("a", "a"); map.put("d", "d"); map.put("c", "c"); map.put("b", "b"); map.put("b", "e"); System.out.println(map);
LinkedHashMap<String, String> linkedMap = new LinkedHashMap<>(); linkedMap.put("a", "a"); linkedMap.put("d", "d"); linkedMap.put("c", "c"); linkedMap.put("b", "b"); linkedMap.put("b", "e"); System.out.println(linkedMap); } }
|
1 2 3 4
| {a=a, b=e, c=c, d=d} {a=a, d=d, c=c, b=e}
进程已结束,退出代码0
|
Hastable类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package com.tipdm.Demo01;
import java.util.HashMap; import java.util.Hashtable;
public class demo6HashTable { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.put(null, "a"); map.put("b", null); map.put(null, null); System.out.println(map);
Hashtable<String, String> table = new Hashtable<>();
} }
|
1 2 3
| {null=null, b=null}
进程已结束,退出代码0
|
练习:计算一个字符串中每个字符出现次数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package com.tipdm.Demo01;
import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.Set;
public class demo7Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); HashMap<Character, Integer> map = new HashMap<>(); for (char c : str.toCharArray()) { if (map.containsKey(c)){ Integer value = map.get(c); map.put(c, value+1); }else{ map.put(c, 1); } } Set<Map.Entry<Character, Integer>> entries = map.entrySet(); for (Map.Entry<Character, Integer> entry : entries) { System.out.println(entry); } } }
|
1 2 3 4 5 6 7 8 9
| jscxhhn jnmdsmkflsdjfk s=1 c=1 x=1 h=2 j=1 n=1
进程已结束,退出代码0
|