1.数据类型和运算
1.1.基本数据类型
每种基本类型都有对应包装类型,包装类型有对应的xxValue方法,不同包装类型可以转换成同样的类型进行比较。
new Integer会新建对象,Integer.valueOf会使用缓存池中对象,多次调用会取得同一个对象引用。
缓冲池范围如下
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F
Integer的缓冲池可以调整,启动jvm时通过-XX:AutoBoxCacheMax=<size>来指定缓冲池大小。会根据JVM的java.lang.IntegerCache.high 实现。
1.2.String
1.2.1.不可变
内部用char数组存储数据,J8和J9不太一样。声明为final,所以不可变。
不可变会有四种好处
- 可以缓存 hash 值
- String Pool的需要
- 安全性,因为String经常作为参数,不可变保证安全性
- 线程安全
1.2.2.String,StringBuffer和StringBuilder
1. 可变性
- String 不可变
- StringBuffer 和 StringBuilder 可变
2. 线程安全
- String 不可变,因此是线程安全的
- StringBuilder 不是线程安全的
- StringBuffer 是线程安全的,内部使用 synchronized 进行同步
String Pool为String类型的缓冲池,使用new会创建新的,使用intern()会使用缓冲,如果直接="xxx"默认是使用缓存。Java7之后String Pool被放在堆中。
new String("abc")在String Pool没有"abc"的时候创建两个字符串对象,否则创建一个字符串对象。
1.2.3.字符串拼接
- 两个都是常量,直接用"+"
- 都是常量直接编译器优化为完成字符串
- 包含变量编译器用StringBuilder优化,但是如果是循环中,每次都会创建SB实例,效率会很低
- 有变量,不要求线程安全,使用StringBuilder
- 缓冲区默认为16,过大会扩容,建议一次指定最终长度
- 有变量,要求线程安全,使用StringBuffer
- 只对两个字符串拼接,包含变量,使用concat
- 先创建足够容纳最终字符串的字节数组,然后把字符串拼接到数组中,转化为字符串
- 只有两个字符串的时候拼接效率高于StringBuilder
1.3.运算
Java参数以值传递到方法中,如果传入对象,本质上是传入了地址。
++和+=会进行隐式类型转换。
switch支持string,int等简单类型,但是不支持其他复杂类型。
1.4.成员变量和局部变量
- 成员变量在类范围定义,拥有初始值,可以是static或者非static
- 局部变量是在方法里定义的变量,没有默认初始值,存储栈内存,过期释放
2.关键字
2.1.final
- 修饰基本数据类型 不可变
- 修饰引用对象 指向不可变,但是引用值可改
- 修饰方法 不可被子类重写,重写会报错(private方法隐式被指定为final,如果有相同方法本质是定义新方法)
- 修饰类 不允许被继承
2.2.static
- 修饰变量 成为类变量,可以用
类名.xxx访问,内存中只有一份。static修饰的类可以被集成。 - 修饰方法 只能访问静态字段和静态方法 不能为抽象方法,不能this和super
- 语句块 在类初始化时运行一次
- 内部类 不需要依赖外部类实例,不能访问外部类非静态变量和方法
- 修饰导包语句 使用不用指明Class代码,简化代码,可读性降低
import static com.xxx.ClassName.*
和static相关的初始化顺序为
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)
3.Object方法
3.1.equals()
表示等价关系,需要满足5个条件
- 自反性
- 对称性
- 传递性
- 一致性 多次调用结果不变
- 与null比较永远为false
==代表相等,对于对象,==比较地址,equals则判断是否等价。
- 检查是否为同一个对象的引用,如果是直接返回 true;
- 检查是否是同一个类型,如果不是,直接返回 false;
- 将 Object 对象进行转型;
- 判断每个关键域是否相等。
3.2.hashCode()
hashCode返回哈希值,等价的两个对象散列值一定相同,但散列值相同却不一定等价。HashSet和HashMap等存入的对象需要实现hashCode方法。
理想的hash函数应该具有均匀性,最好将每个域放到R进制的某一位,R一般取31避免乘法溢出信息丢失。
@Override
public int hashCode() {
int re

最低0.47元/天 解锁文章
1577

被折叠的 条评论
为什么被折叠?



