异常

RuntimeException及其子类可以不被Catch

类前面不加修饰符,默认 default 访问权限。该类仅可在同一个包下可访问(父包、子包皆无法访问)。
无参数构造函数会给属性赋值类型默认值。

内部类

成员内部类、局部内部类、匿名内部类、静态内部类。

1.成员内部类

无条件访问所有外部类的属性和方法。内部类和外部类有相同属性或方法会出现隐藏现象,要用this访问外部类。

  1. OutClass.this.do()

成员内部类必须通过外部类的实例出的对象创建。成员内部类不加修饰则同一个包下可以访问。

2.局部内部类

定义在方法或者作用域中。相当于方法中的局部变量,没有访问权限修饰。

3.匿名内部类

一般用于对继承方法的实现或重写。

  1. new Foo() {
  2. @Override
  3. public void onClick(View v) {
  4. // xxxx
  5. }
  6. }

4.静态内部类

不能使用外部类的非静态成员和方法。
SimpleDateFormat线程不安全,Spark用的时候要小心,最好是换成线程安全的类。LocalDateTime,DateTimeFormatter两个类都没有线程问题,只要你自己不把它们创建为共享变量就没有线程问题。
可以使用Instant代替 Date,LocalDateTime代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat。
参考资料
https://blog.csdn.net/wangdong5678999/article/details/81159690#LocalDateLocalTime_48

泛型

本质是本质是参数化类型。

类型推到

在 Java SE 7 及以后的版本中, 构造函数中可以省略泛型类型:

  1. ArrayList<String> foo = new ArrayList<String>();
  2. ArrayList<String> bar = new ArrayList<>();

省略的类型可以从变量的类型推断得出。

泛型类

  1. class Box<T>{
  2. private T item1;
  3. private T item2;
  4. }

泛型方法

  1. class Fn {
  2. private T item1;
  3. private T item2;
  4. }

无界通配符”<?>”

  1. List<?> list = new ArrayList<String>();
  2. list.add("hello"); //ERROR
  3. 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

修饰的字段不会被Serializable序列化。

volatile

告诉编译器定义后随时可能被修改。一个线程拥有自己的一个高速缓存区——线程工作内存。
2696671285@qq.com
Oracle123

集合

ArrayList不够会自动扩容1.5倍。所以初始可以设置个合适的值减少扩容次数。

HashMap默认:

  • 初始大小16。
  • 最大装载因子是0.75。达到则扩容两倍。
  • 链表长度超过8则改为红黑树。(JDK1.8)
  1. int hash(Object key) {
  2. int h = key.hashCode();
  3. return (h ^ (h >>> 16)) & (capicity -1); //capicity表示散列表的大小
  4. }

资料

《Java编程思想》
https://lingcoder.github.io/OnJava8/#/sidebar

高阶函数

参数类被@FunctionalInterface修饰,则可以替换为匿名函数。

类型信息

ArrayList 这种泛型容器的读原理是,把元素当Object读出来再转换成String类型。(参考Java编程思想)