目录

hymn

忽有故人心头过,回首山河已是秋。

wait 和 notify 有更新!

wait和 notify用于多线程协调运行: 在synchronized内部可以调用wait()使线程进入等待状态;(获得了锁才能释放锁) 必须在已获得的锁对象上调用wait()方法; 在synchronized内部可以调用notify()或notifyAll()唤醒其他等待线程; 必须在已获得的锁对象上调用notify()或notifyAll()方法; 已唤醒的线程还需要重新获得锁后才能继续执行。 在while中调用wait(),如果是if ,在线程被唤醒后继续执行wait()后面得逻辑,不会去重新获得锁; class TaskQueue { Queue<String> queue = new LinkedList<>(); public synchronized String getTask() throws InterruptedException{ while (queue.isEmpty()) { // 释放this锁: this.wait(); // 重新获取this锁 } return queue.remove(); } public sync....

Stream

Stream提供的常用操作有: 转换操作:map(),filter(),sorted(),distinct(); 合并操作:concat(),flatMap(); 并行处理:parallel(); 聚合操作:reduce(),collect(),count(),max(),min(),sum(),average(); 其他操作:allMatch(), anyMatch(), forEach()。

泛型 有更新!

泛型擦除 编译器看到的: public class Pair<T> { private T first; private T last; public Pair(T first, T last) { this.first = first; this.last = last; } public T getFirst() { return first; } public T getLast() { return last; } } 虚拟机看到的: public class Pair { private Object first; private Object last; public Pair(Object first, Object last) { this.first = first; this.last = last; } public Object getFirst() { return first; } public Object getLast() { return last; } } 因此,Java使用擦拭法实现泛型,导致了: 编译器把类型<T>....

BigDecimal

public class BigDecimal extends Number implements Comparable<BigDecimal> { private final BigInteger intVal; private final int scale; } 查看 BigDecimal的源码,可以发现,实际上一个 BigDecimal是通过一个 BigInteger和一个 scale来表示的,即 BigInteger表示一个完整的整数,而 scale表示小数位数: BigDecimal用于表示精确的小数,常用于财务计算; 比较 BigDecimal的值是否相等,必须使用 compareTo()而不能使用 equals()。

考虑实现 Comparable,Comparator 接口 有更新!

Comparator 不推荐:(它可能会导致整数最大长度溢出和 IEEE 754 浮点运算失真的危险) Collections.sort(list2,new Comparator<Person2>(){ @Override public int compare(Person2 o1, Person2 o2) { if(o1 == null || o2 == null) return 0; return o1.getAge()-o2.getAge(); } }); // BROKEN difference-based comparator - violates transitivity! static Comparator<Object> hashCodeOrder = new Comparator<>() { public int compare(Object o1, Object o2) { return o1.hashCode() - o2.hashCode(); } }; 推荐: // Comparator based on static ....

Java clone 深拷贝,浅拷贝

浅拷贝 public class Stack implements Cloneable { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object o) { ensureCapacity(); elements[size++] = o; } public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // 【避免内存泄漏】 return result; } private void ensureCapacity() { if (elements.length =....

单例

package effectiveJava; /** * @author: daixyhymn * @description: * @date: 2020/11/12 10:03 */ /** * 饿汉式 */ public class Singleton { public static final Singleton instance = new Singleton(); private Singleton(){ /** * 防止反射破环单例 */ if (instance != null){ throw new RuntimeException(); } } /** * 防止反序列化破环单例 * @return */ private Object readResolve(){ return instance; } } class Singleton3{ private static final Singleton3 instance = new Singleton3(); private Singleton3(){} public static Singleton3 getInst....

java集合继承关系图 有更新!

该文章已经加密。

动态规划 有更新!

/** * @author: daixyhymn * @description: * @date: 2020/11/9 16:54 */ public class BestGold { public static int bestGold(int w, int n, int[] p, int[] g){ if (w == 0 || n == 0) return 0; if (w < p[n - 1]) { return bestGold(w, n - 1, p, g); } return Math.max(bestGold(w, n - 1, p, g), bestGold(w - p[n - 1], n - 1, p ,g) + g[n - 1]); } public static void main(String[] args) { int w = 10; int[] p = {5, 5, 3, 4, 3}; int[] g = {400, 500, 200, 300, 350}; System.out.println(bestGold(w, p.length, p, g))....

寻找缺失的整数

题目: 假设一个数组中有若干个正整数,范围是1~ 100,其中98个整数出现了偶数次,2个整数出现了奇数次,如何找到这两个数? (如果数组中只有一个出现了奇数次,就直接可以异或运算,结果就是这个数) import java.util.Arrays; /** * @author: daixyhymn * @description: * @date: 2020/11/9 17:58 */ public class FindLostNum { public static int[] findLostNum(int[] array){ // 保存2个奇数整数 int[] res = new int[2]; // 第一次进行异或运算 int xorRes = 0; for (int i = 0; i < array.length; i++) { xorRes ^= array[i]; } if (xorRes == 0) return null; // 确定两个整数的不同位,一次来分组 int separator = 1; while (0 == (xorRes & separ....