基本数据类型
java中的byte是1字节,8位,最高位是符号位,只有7位用来表示数值
最大值:01111111=127 即2的7次方减去1,减1因为有个0;
最小值:10000000即2的7次前面加个负符号:-128
实例化对象方式
1、new() 创建
2、clone() 创建,需要实现Cloneable 接口
3、反射机制 .newInstance()
4、实例化后进行序列化,再反序列化
5、工厂方法返回对象
序列化和反序列化(对象状态的保存和重建)
1、Java序列化就是指把Java对象转换为字节序列的过程;
在传递和保存对象时.保证对象的完整性和可传递性。
ObjectOutputStream
2、Java反序列化就是指把字节序列恢复为Java对象的过程。
根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
ObjectInputStream
3、静态变量/transient修饰属性不会被序列化。
数组Array 表示存储相同数据类型数据的有序集合
1、数组中存放的数据必须是同一个数据类型,可基本,可引用类型
2、数组在定义时必须给定大小,且大小不可变
3、可通过下标值来获取数据,下标从0开始,元素有默认值,取决于元素类型。
4、插入数组中的数据是有序集合(插入顺序排序)
声明数组---分配空间---赋值---数组操作
ArrayList
1、元素类型不定
2、容量可动态增长,但牺牲效率,插入O(logN)
3、ArrayList 的 交(A.retainAll(B))
并 无重复并集 A.removeAll(B); B.addAll(A); 可重复并 A.addAll(B);
差(A.removeAll(B))
Arrays 数组工具类
1、比较两个数组是否相同---equals()
2、数组排序---Arrays.sort()
3、数组查找---binarySearch()
4、打印数组---toString()
visualgo.net/zh
Queue与List
前者添加了很多对线程友好的API :offer peek poll
BlockingQueue--->生产者消费者模型
put take-->阻塞
String StringBuffer StringBuilder
1、String 是常量(堆中常量池)不可变类,初始可为null;
StringBuffer 线程安全,可变长度和内容的变量;
StringBuilder 线程不安全,可变长度和内容的变量 。
运行速度快慢为:StringBuilder > StringBuffer > String
2、StringBuffer 每次获取toString都直接使用缓存区的toStringCache值来构造一个字符串;
StringBuilder则每次都要复制一次字符数组,再构造个字符串。
Java9改进:
字符串采用char[]保存字符 每个字符2字节 < java9 =< byte[] + encodig-flag字段保存字符,占1字节。省空间。
使用场景:
字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算.
在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,
则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,
则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
重写和重载
1、重写是子类对父类方法的重新定义,方法名、参数列表相同;
返回类型可不同,但必为父类返回值派生类;
final 方法不能被重写;
static 方法不能被重写,可被再次声明;
子、父类在同一包中,可重写非private /final 的所有方法;
子、父类不在同一包中,只可重写public/protected 的非final 方法;
构造方法不能被重写。
2、重载是在一个 类里面,方法名相同,参数(个数/类型)不同;
返回类型可同可不同 ;
被重载方法可改变访问修饰符。
异常及处理
Throwable 类是 Java 语言中所有错误或异常的超类。
1、Error (不可恢复)指示合理的应用程序不应该试图捕获的严重问题
VirtulMachineError
StackOverFlowError
OutOfMemoryError
AWTError
2、Exception (可恢复)
RuntimeException(运行时异常---非检查型异常)
UnkownTypeException
NullPointerException (非检测性异常)空指针异常
ClassCastException 类型转换异常
IllegalArgumentException 非法参数异常
ArrayStoreException 数组存储异常
IndexOutOfBoundException (非检测性异常)数组下标越界异常
ArrayIndexOutOfBoundException (非检测性异常)非法索引访问数组
ArrithmeticException (非检测性异常)异常的运算条件抛异常,eg。除以0
MissingResourceException
BufferOverflowException 缓冲区溢出异常
ClassNotFoundException (检查性异常) 应用程序试图加载时,找不到相应的类抛异常
检查异常
IOException(I/O 输入输出异常)
EOFException
FileNotFoundException
SQLException
InterruptedException
处理
1、try/catch …finally
2、throws/throw
final
1、修饰变量
必须赋予初始值且不能被改变。
常和static关键字一起使用,作为常量。
2、修饰方法
方法不可以被子类的方法重写。
3、修饰类
不能被继承。
4、被final修饰的对象内容是可变的
public final calss FinalData{
int i=5;
public int adds(int i){
this.i=i;
return i;
}
public static void main(String[] args){
System.out.println(new FinalData().adds(6))
}
}
====> 输出 6
static
1、修饰成员变量 -- 属性属于本类 类名调用
2、静态块 --类加载时先实例化,只执行一次,
3、修饰方法 --静态方法访问静态成员,非静态可访问静态和非静态。 类名调用
4、内部类 ---如 单例
抽象类和接口
1、抽象类 继承 extend 一个父类;接口 是实现 implement ,实现多接口 来实现多继承。
2、抽象类里面可以没有抽象方法,方法可声明,可实现;接口方法只能声明。
3、抽象类方法必须全部被子类实现,除非子类也为抽象类;接口方法也要被子类实现,除非抽象类。
sleep()和wait()
调用对应的notify/signal方法(唤醒)
yield 让出一下CPU
java引用类型(强软弱虚)
强:M m = new M(); **不会被回收**
当 m = null 时 表示无引用,会被回收
至于gc 线程先执行还是main 线程先执行,不可控。
软:是一个SoftReference m=new softReference<>[new byte[1024*1024*10]]
m 与SR 间是强,sr 与byte间有个连接,是软
**当空间不够了,软引用对象会被优先回收**。
**适用缓存场景**
弱:WeakReference<M> m = new WeakReference<>(new M());
m 与wk 间是强,sr 与M间有个连接,是弱连接
**gc 直接回收**
**一般用在容器**
弱引用 ===》用到threadlocalmap 的key 是弱引用
虚:PhantomReference<M> pr = new PhantomReference<>(new M(),QUEUE);
形同没有。用来管理堆外内存用的。
当对象被回收(gc能直接回收)时,通过Queue可以检测到,然后清理堆外内存(unsafe 回收)。
弱还能get()到对象值,虚get不到。
**场景:管理直接内存**
如NIO里的DirectByteBuffer----->指向堆外内存
Queue指向buffer
内存泄漏和内存溢出
泄漏:new 申请的内存空间,使用后无法释放。----时间长了会导致OOM 溢出。
hashmap并发;
ThreadLocalMap 的key若果是强引用 就会出现泄漏情况;
弱引用情况下,若key =null 没有被清除(remove),会导致泄漏;
溢出:内存空间不足以提供申请使用。
循环引用会引起;
循环引用(依赖)场景
实质:多个对象相互之间有强引用,不能释放让系统回收。
场景:
多线程并发 操作 hashmap 扩容链表倒置产生的循环引用(死循环)
Spring 的循环依赖