异常
类
类前面不加修饰符,默认 default 访问权限。该类仅可在同一个包下可访问(父包、子包皆无法访问)。
无参数构造函数会给属性赋值类型默认值。
内部类
1.成员内部类
无条件访问所有外部类的属性和方法。内部类和外部类有相同属性或方法会出现隐藏现象,要用this访问外部类。
OutClass.this.do()
成员内部类必须通过外部类的实例出的对象创建。成员内部类不加修饰则同一个包下可以访问。
2.局部内部类
定义在方法或者作用域中。相当于方法中的局部变量,没有访问权限修饰。
3.匿名内部类
一般用于对继承方法的实现或重写。
new Foo() {
@Override
public void onClick(View v) {
// xxxx
}
}
4.静态内部类
不能使用外部类的非静态成员和方法。
SimpleDateFormat线程不安全,Spark用的时候要小心,最好是换成线程安全的类。LocalDateTime,DateTimeFormatter两个类都没有线程问题,只要你自己不把它们创建为共享变量就没有线程问题。
可以使用Instant代替 Date,LocalDateTime代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat。
参考资料
https://blog.csdn.net/wangdong5678999/article/details/81159690#LocalDateLocalTime_48
泛型
类型推到
在 Java SE 7 及以后的版本中, 构造函数中可以省略泛型类型:
ArrayList<String> foo = new ArrayList<String>();
ArrayList<String> bar = new ArrayList<>();
泛型类
class Box<T>{
private T item1;
private T item2;
}
泛型方法
class Fn {
private T item1;
private T item2;
}
无界通配符”<?>”
List<?> list = new ArrayList<String>();
list.add("hello"); //ERROR
list.add(111); //ERROR
List<?>这个写法非常坑。因为,这时候通配符会捕获具体的String类型,但编译器不叫它String,而是起个临时的代号,比如”CAP#1“。所以以后再也不能往list里存任何元素,包括String。唯一能存的就是null。
类型擦除
类型擦除时,第一个限定的类型变量来替换, 如果没有给定限定就用 Object 替换。
JVM
JVM参数
Xms
是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。
Xmx
是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。
HashMap
java8中,HashMap 每个桶中当链表长度超过8之后,会将链表转换成红黑树,从而提升增删改查的速度。
JPS
jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
CLASSPATH
在IDE中运行Java程序,IDE自动传入的-cp
参数是当前工程的bin
目录和引入的jar包。
不要把任何Java核心库添加到classpath中!JVM根本不依赖classpath加载核心库!
更好的做法是,不要设置classpath
!默认的当前目录.
对于绝大多数情况都够用了。
修饰变量关键字
transient
volatile
告诉编译器定义后随时可能被修改。一个线程拥有自己的一个高速缓存区——线程工作内存。
2696671285@qq.com
Oracle123
集合
ArrayList不够会自动扩容1.5倍。所以初始可以设置个合适的值减少扩容次数。
HashMap默认:
- 初始大小16。
- 最大装载因子是0.75。达到则扩容两倍。
- 链表长度超过8则改为红黑树。(JDK1.8)
int hash(Object key) {
int h = key.hashCode();
return (h ^ (h >>> 16)) & (capicity -1); //capicity表示散列表的大小
}
资料
《Java编程思想》
https://lingcoder.github.io/OnJava8/#/sidebar
高阶函数
参数类被@FunctionalInterface修饰,则可以替换为匿名函数。
类型信息
ArrayList