目录
32.1TreeSet使用定制排序。
如果该类class People implements Comparable<People> 之前别人定义好,
但是没有实现自然排序规则的接口Comparable。
例如:
TreeSet中添加字符串类,按照字符串的长度。
这时使用自然排序就不行了。只能使用定制排序。
public class Test01 {
public static void main(String[] args) {
//Comparator<? super E> comparator:定义排序规则接口.
TreeSet<String> set=new TreeSet<>(new MyComparator());
set.add("java01");
set.add("jav3");
set.add("j2");
set.add("j");
set.add("jjava");
System.out.println(set);
}
}
public class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
}
上面定义的排序规则类,只使用了一次。可以不用创建一个排序规则类,使用匿名内部类的。
public class Test01 {
public static void main(String[] args) {
//Comparator<? super E> comparator:定义排序规则接口.
//直接创建接口对象时,并重写接口中的方法这种方式就匿名[内部类]实现类
Comparator<String> comparator=new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
TreeSet<String> set=new TreeSet<>(comparator);
set.add("java01");
set.add("jav3");
set.add("j2");
set.add("j");
set.add("jjava");
System.out.println(set);
}
}
32.2Map键值对集合
里面存放的元素:Entry类型的元素,该元素包含key和value。
它是所有键值对集合的根类。它的子类: HashMap
32.3往hashMap存放元素
Map m=new HashMap();//创建一个Map对象
m.put("name","吴韩煜");//往map中添加元素。
m.put("age",18); //里面的key不能重复。如果出现重复,则后置把前缀替换。
m.put("name","欧炜健"); //里面的key不能重复。如果出现重复,则后置把前缀替换。判断key的重复性:按照hashcode和equals方法判断的。
System.out.println(m);
32.3修改
m.replace("name","刘德华");
建议:使用put替换
32.4查询
Object name = m.get("name");//根据key获取对应的值
System.out.println("name对应的值:"+name);
//如果指定的key存在,则获取对应的value值,否则获取defaultValue值.
Object orDefault = m.getOrDefault("name", "闫克起");
System.out.println("names对应的值:"+orDefault);
Set keySet = m.keySet();//获取map中所有的key
System.out.println("map中所有的key:"+keySet);
Collection values = m.values();//获取map中所有的value值
System.out.println("获取map中所有的value值"+values);
32.5map集合的遍历
-
根据key遍历---阿里巴巴不建议使用
//1.获取map中所有的key
Set keySet1 = m.keySet();
//2.遍历key
for(Object k:keySet1){
//3.根据key获取map对应的value
Object v = m.get(k);
System.out.println(k+"->"+v);
}
2.增强循环↓
System.out.println("===============增强循环==================");
Set<Map.Entry> set = m.entrySet(); //获取map中所有的元素.---
for(Map.Entry entry:set){
System.out.println(entry.getKey()+"======="+entry.getValue()); //key=value
}
32.6HashMap底层原理。
jdk1.7之前 底层使用的是数组+链表。而且链表是头部插入。
jdk1.8之后 底层使用的是数组+链表,数组+红黑树。而且链表是尾部插入。
HashMap通过put(key,value)进行存储数据,通过get(key)来获取数据,在传入key时,会对key进行hash计算,得到一个hash值,如果hash一致且equals不同,这种现象称为hash冲突。HashMap通过链表和红黑树解决hash冲突问题,如果hash冲突少,使用链表。hash冲突多[个数超过8且数组长度大于64位],则使用红黑树。
public V put(K key, V value) {
//hash(key):对key进行hash计算。
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
else {
Node<K,V> e; K k;
//表示key得hash相同,且equals也相同。替换原来的元素。
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
//表示树形节点--把元素放入红黑树中
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
//把节点放入链表后
p.next = newNode(hash, key, value, null);
//hash冲突个数大于TREEIFY_THRESHOLD转化为树形结构 8个
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
//当数组长度大于原本的长度--扩容
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
32.7Collections
它是一个工具类。---里面的方法全部是静态方法。
二分查找List。
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
package demo01;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @program: day1113
* @description:
* @author: 闫克起2
* @create: 2023-11-13 17:30
**/
public class Test03 {
public static void main(String[] args) {
// List<String> list=new ArrayList<>();
// list.add("java05");
// list.add("java06");
// list.add("java02");
// list.add("java03");
// list.add("java04");
// list.add("java01");
//
// int i = Collections.binarySearch(list, "java02");
// System.out.println("位置:"+i);
List<Student> list=new ArrayList<>();
list.add(new Student("吴韩煜",99));
list.add(new Student("赖林龙",199));
list.add(new Student("欧炜健",19));
list.add(new Student("胡荣纯",119));
list.add(new Student("陈政君",11));
int i = Collections.binarySearch(list, new Student("欧炜健", 17), new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
});
System.out.println("位置:"+i);
}
}
class Student{
private String name;
private int 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 Student(String name, int age) {
this.name = name;
this.age = age;
}
}
static void reverse(List<?> list)
List<Student> list=new ArrayList<>();
list.add(new Student("吴韩煜",99));
list.add(new Student("赖林龙",199));
list.add(new Student("欧炜健",19));
list.add(new Student("胡荣纯",119));
list.add(new Student("陈政君",11));
System.out.println(list);
System.out.println("+========================倒置后============================");
Collections.reverse(list);
System.out.println(list);
洗牌功能↓
static void shuffle(List<?> list)
List<Student> list=new ArrayList<>();
list.add(new Student("吴韩煜",99));
list.add(new Student("赖林龙",199));
list.add(new Student("欧炜健",19));
list.add(new Student("胡荣纯",119));
list.add(new Student("陈政君",11));
System.out.println(list);
System.out.println("+========================洗牌后============================");
Collections.shuffle(list);
System.out.println(list);
排序↓
static <T> void sort(List<T> list, Comparator<? super T> c)
List<Student> list=new ArrayList<>();
list.add(new Student("吴韩煜",99));
list.add(new Student("赖林龙",199));
list.add(new Student("欧炜健",19));
list.add(new Student("胡荣纯",119));
list.add(new Student("陈政君",11));
System.out.println(list);
System.out.println("+========================按照年龄排序============================");
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()-o1.getAge();
}
});
System.out.println(list);
把线程不安全的集合转化为线程安全的集合。↓
static <T> List<T> synchronizedList(List<T> list)
List<Student> students = Collections.synchronizedList(list);
System.out.println(students);