note-java-stream
Stream
Stream::max(int 和 Integer的不同)
12345int intArr[] = new int[]{1, 2, 3};Arrays.stream(intArr).max().getAsInt(); Integer integerArr[] = new Integer[]{1, 2, 3};Arrays.stream(integerArr).max(Integer::compareTo).get();
Stream中 int 和 Integer 互相转换
mapToObj: int -> Integer
三种方式:mapToObj(Integer::valueOf), mapToObj(i->Integer.valueOf(i)), mapToObj(i->i)
123// int数组转换成Integer列表int nums = new int[]{1, 2, 3};List<Integer> list = Arrays.stream(nums).mapT ...
note-java-vm
Java内存区域与内存溢出异常
运行时数据区域
程序计数器
当前线程所执行的字节码的行号指示器,控制程序的分支、循环、跳转、异常处理和线程恢复等功能
每条线程都需要有个独立的程序计数器,线程之间计数器互不影响(线程私有)
执行Java方法时,计数器记录的时正在执行的虚拟机字节码指令地址;执行本地方法时,计数器值为空
Java虚拟机栈
线程私有
执行方法时,vm都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
方法被调用的过程对应一个栈帧从入栈到出栈的过程
如果线程请求的栈深度超出vm所允许的深度,则会抛出StackOverflowError异常。如果vm可以动态分配栈容量(深度),当栈扩展到无法申请到足够的内存时,则会抛出OutOfMemoryError异常。(HotSpot vm时不可以动态扩展的,以前的Classic vm倒是可以)
局部变量表
存放编译期可知的各种vm基本数据类型、对象引用和returnAddress类型
这些数据类型的存储空间以局部变量槽来表示,64位的long和double占用两个变量槽。局部变量表需要分配的空间在编译期间 ...
note-java
关于Java的一些笔记
tips-java
Java刷题技巧
数组相关操作
常见
1234567int arr[] = new int[size], n = arr.length; // 简化定义方式Arrays.equals(T[], T[]); // 比较System.arraycopy(src, 0, dst, 0, len); // 复制Arrays.copyOf(src, len); // 复制Arrays.copyOfRange(src, from, to); // 复制cnt[nxt] = cnt[cur].clone(); // 复制(克隆)
sort
12345Arrays.sort(T[], Comparator); int arr[][] = {{1, 3}, {3, 1}};Arrays.sort(arr, (a,b)->b[1]-a[1]);int arr2[] = {1,3,2};Arrays.sort(arr2, (a,b)->b-a); // 报错,当放入Comparator参数时, ...