2019-09-05
JDK8前接口里面所有的方法都是抽象的且不允许有静态方法,抽象类可以有普通、静态方法
JDK8接口可以实现默认方法和静态方法,前面加default、static关键字
分配连续1G空间
ByteBuffer.allocateDirect(1024*1024*1024);
string
String、StringBuffer是线程安全的,StringBuilder不是
String不继承任何类,StringBuffer、StringBuilder继承自AbstractStringBuilder
String s = new String("abc");创建了几个 String Object?
2个,会创建String对象存放在字符串常量池跟堆中。
data
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
float的精度为7~8位有效数字
double的精度为16~17位
1GB=1024MB 1MB=1024KB 1KB=1024B 1B=8b
keyword
final是定义类、方法、字段的修饰符,表示类不可被继承,方法不能被重写,字段值不能被修改
finally是异常处理机制的关键字,表示最后执行
finalize是Object的一个方法,在对象被虚拟机回收时会判断是否执行该方法,当对象没有覆盖finalize方法,或者finalize方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”
error
错误,如StackOverflowError、OutOfMemoryError
exception
运行时异常,如NullPointerException、IndexOutOfBoundsException,都是RuntimeException及其子类
非运行时异常,如IOException、SQLException,都是Exception及其子类,这些异常是一定需要try catch捕获的
集合
Map: HashMap、LinkedHashMap、TreeMap
Set:HashSet、LinkedHashSet、TreeSet
List: ArrayList、LinkedList
Collections.sort(list);
ArrayList:内部使用数组的形式实现了存储,利用数组的下标进行元素的访问,因此对元素的随机访问速度非常快。
因为是数组,所以ArrayList在初始化的时候,有初始大小10,插入新元素的时候,会判断是否需要扩容,扩容的步长是0.5倍原容量,扩容方式是利用数组的复制,因此有一定的开销。
LinkedList:内部使用双向链表的结构实现存储,LinkedList有一个内部类作为存放元素的单元,里面有三个属性,用来存放元素本身以及前后2个单元的引用,另外LinkedList内部还有一个header属性,用来标识起始位置,LinkedList的第一个单元和最后一个单元都会指向header,因此形成了一个双向的链表结构。
ArrayList查找较快,插入、删除较慢,LinkedList查找较慢,插入、删除较快。
memory leak
内存溢出可能的原因:
1、程序中存在死循环
2、静态变量和静态方法太多了
3、内存泄漏,比如说一个静态的list,一直往里放值,又因为静态变量不会被释放,所以迟早是要内存溢出的
4、大对象过多,java中的大对象是直接进入老年代的,然后当多个大对象同时工作时造成程序的可用内存非常小,比如我list中原本最多可以放1000个对象,因为可用内存太小,放了500个就放不下了。
5、还有一种很常见的情况,在把一个很大的程序直接导入,直接就内存溢出了,原因就是内存相对这个程序就是太小了,需要手动增加内存。
网友评论