重学Java之核心类

重学Java核心类

一、String

Java字符串的特点:

字符串常用操作:

编码

最早的字符编码是ASCII码,一个字符占一个字节,最多表示128个字符。字符'A'的编码是0x41

中文编码:GB2132,GBK,GB 18030。一个中文字符占2个字节,第一个字节最高位是1。其它语言编码:Shift_ JIS, Euc-kr ,
......

全球统一编码: Unicode。全球所有文字都有唯一编码。一个Unicode字符通常占2个字节。Java使用Unicode编码。

有了Unicode为什么还需要UTF-8?
英文Unicode编码和ASCII不一致,同时包含大量英文的文本会浪费空间。

UTF-8编码是变长编码
- 英文UTF-8编码和ASCII一致
- 其它Unicode字符需2~6字节不等
- UTF-8编码容错能力强:

OxXXXXxx
11 OxxxXX 10xXXXXX
111 OxXxx 10xXXxXx 10xXXXXX

编码最佳实践

总结

二、StringBuilder

String可以用"+"拼接

StringBuilder可以高效拼接字符串

StringBuilder可以进行链式操作

原理是append方法返回了this

不需要特别改写字符串"+"操作

编译器在内部自动把多个连续的+操作优化为StringBuilder操作

StringBuilder和StringBuffer

总结

三、包装类型

原理

定义一个Integer类,包含一个实例
字段int。可以把Integer视为int的包装类型
(wrapper)

转换

int、Integer和String的相互转换

特别注意Integer.getlInteger(String)
是从系统环境中读取系统变量

整数和浮点数包装类型继承自Number
可以利用Number下面的方法相互转换

装箱拆箱

编译器可以自动在int和Integer之间转型:

自动装箱:int -> Integer

自动拆箱:Interge -> int

静态变量

总结

JDK的包装类型可以把基本类型包装为class

自动装箱和自动拆箱是编译器完成的(JDK>=1.5)

装箱和拆箱会影响执行效率

注意拆箱时可能发生NullPointerException

四、JavaBean

定义

许多class的定义都符合:
- 若干private实例字段
- 通过public方法读写实例字段

符合命名规范的class被称为JavaBean
- private Type field
- public Type getField()
- public void setField(Type value)

注意方法名称的大小写

Boolean字段的读方法命名为isXXX():

通常把一组对应的getter和setter称为属性(Property)
name属性:
- 对应读方法getName()
- 对应写方法setName()

总结

JavaBean是一种符合命名规范的class

JavaBean通过: getter/setter来定义属性

属性是一种通用的叫法,并非Java语法规定

可以利用IDE快速生成getter/setter

使用Introspector.getBeanlnfo()获取属性列表

五、枚举

普通定义常量方法

编译器不能检测或检查常量的修改

用enum定义常量

enum定义的类型实际上是class
- 继承自java.lang.Enum
- 不能通过new创建实例
- 所有常量都是唯一实例(引用类型)
- 可以用于switch语句

例子

总结

enum可以定义常量类型,它被编译器编译为:

final class Xxx extends Enum { ... }

name()获取常量定义的字符串,注意不要使用toString()

ordinal()返回常量定义的顺序(无实质意义)

可以为enum类编写构造方法、字段和方法

构造方法申明为private

六、常用工具类

Math:数学计算

Math提供了数学计算的静态方法:
- abs/min/max
- pow / sqrt / exp / log / log10
- sin / cos / tan / asin / acos

常量:
- PI = 3.14159...
- E = 2.71828...

Random:生成伪随机数

Math.random()生成一个随机数
- 0<=随机数<1
- 可用于生成某个区间的随机数

Random()生成一个伪随机数
- nextInt / nextLong / nextFloat...
- nextlnt(N)生成不大于N的随机数

什么是伪随机数
- 给定种子后伪随机数算法会生成完全相同的序列
- 不给定种子时Random使用系统当前时间戳作为种子

SecureRandom用来创建安全的随机

BigInteger:表示任意大小的整数

BigDecimal:表示任意精度的浮点数

总结

Math:数学计算

Random:生成伪随机数

SecureRandom:生成安全的随机数

BigInteger:表示任意大小的整数

BigDecimal:表示任意精度的浮点数

BigInteger和BigDecimal都继承自Number