Java基础查漏补缺
Java基础查漏补缺
Java基本类型包装类缓存池:
Integer、Byte、Long、Short 均为-128—127
Char为 \u0000 to \u007F(0—127)
Boolean为True False
Float和Double由于数字比较随机,使用缓存池命中率低,意义不大
String 内部使用char数组存储数据,被final修饰且内部没有修改value数组的方法,保证String不可变。
不可变的好处:
- 可以存hash值,hash值只计算一次,String用做HashMap的key
- String Pool(字符串池):如果字符串已经被创建过,则下次引号创建时,直接引用已创建的字符串
- 安全性:保证参数不可变以及线程安全
通常不能进行隐式向下转型,如
short s1 = 1; s1 = s1 + 1;,但是使用+=运算符可以进行隐式类型转换,如s1 += 1;==>s1 = (short)(s1 + 1);++操作符不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。还会存在竞态条件(读取-修改-写入)。
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。
从Java7开始,switch 支持使用String字符串,不支持使用long,因为switch的设计初衷是对那些只有少数的几个值进行等值判断,如果值过于复杂,那么还是用 if 比较合适。
private只能在当前类使用,protected在当前包任意类以及其他包子类使用,public任意包中类都可使用
object通用方法:
equals():对于基本数据类型,==判断值相等,没有equals方法,对于引用类型,==判断是否引用同一个对象,equals判断引用的对象是否等价,通常需要重写(根据属性判断是否等价),String、Integer等不可变类,Java提供了默认的equals()方法hashCode():通常重写equals()就要重写hashcode()方法,因为对于需要对象hash值的情况下,如集合,就需要根据对象的属性等来计算hash值,因为默认的hashcode对于不同对象但是等价的会有不同的值,而此时需要等价的对象具有相同的hash值,就需要重写hashcode(),通常使用Objects.hash()如return Objects.hash(name, age);toString():默认返回ToStringExample@4554617c 形式,其中 @ 后面的数值为散列码的无符号十六进制表示。通常也需要重写。clone():浅拷贝:拷贝对象和原始对象的引用类型引用同一个对象 深拷贝:拷贝对象和原始对象的引用类型引用不同的对象
final:对于基本类型,final使数值不变,对于引用类型,final使引用不变,也不能引用其他对象,但被引用的对象本身是可以被修改的,声明方法不能被子类重写,声明类不允许继承
static:静态变量(属于类,类的所有实例共享),静态方法(类加载时就存在,只能访问类的静态字段和方法),静态语句块(类初始化时运行一次)
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)
反射:每一个类都有一个class 对象,包含类相关信息,编译时会产生class文件,保存着class对象,本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。
Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。
异常:Throwable分为两种:Error和Exception。
Exception分为编译时异常和运行时异常,编译时异常发生在编译阶段,编译器会检查,程序必须对此类异常进行处理(try-catch或抛出throws),运行时异常发生在程序运行期间,编译器不会强制要求处理,通常是程序逻辑错误导致。
finally
- finally不管有没有异常都要处理
- 当try和catch中有return时,finally仍然会执行,finally比return先执行
- 不管有木有异常抛出, finally在return返回前执行
- finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的
注意: finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值
finally不执行的几种情况: 程序提前终止如调用了System.exit, 病毒,断电
java中有三种移位运算符
<<:左移运算符,x << 1,相当于x乘以2(不溢出的情况下),低位补0>>:带符号右移,x >> 1,相当于x除以2,正数高位补0,负数高位补1>>>:无符号右移,忽略符号位,空位都以0补齐
x << n==> x * 2^n


