最早的字符编码是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 sb =new StringBuilder (1024);
String s = sb.append ("Mr ")
.append (name)
.append("!")
.insert(O, "Hello, ")
.toString() ;
原理是append方法返回了this
super.append(str);
return this;
编译器在内部自动把多个连续的+操作优化为StringBuilder操作
String s = "Hel1o," + name + "!";
定义一个Integer类,包含一个实例 字段int。可以把Integer视为int的包装类型 (wrapper)
public class Integer (
private int value;
public Integer (int value) {
this. value = value;
}
}
Integer n = null;
Integer n2 = new Integer(99);
int、Integer和String的相互转换
特别注意Integer.getlInteger(String) 是从系统环境中读取系统变量
int i = 100;
Integer n1 = new Integer(i);
Integer n2 = Integer.valueOf(i);
Integer n3 = Integer.valueOf("100") ;
int x1 = n1.intValue() ;
int x2 = Integer.parseInt("1OO") ;
String s = n1.toString();
整数和浮点数包装类型继承自Number 可以利用Number下面的方法相互转换
Number num = new Integer(999) ;
byte b = num.byteValue(); .
int n = num.intValue();
long ln = num.longValue();
float f = num.floatValue();
double d = num.doubleValue();
编译器可以自动在int和Integer之间转型:
自动装箱:int -> Integer
自动拆箱:Interge -> int
Integer n = 99; // Integer.valueOf (99)
int i = n; // n.intValue()
Object[] arr = new Object[1];
arr[O] = 999; // Integer.valueOf(999)
Integer x = null;
int y = x; // NullPointerException
Boolean t = Boolean.TRUE;
Boolean f = Boolean.FALSE;
int max = Integer.MAX_VALUE; // 2147483647
int min = Integer.MIN_VALUE; // 2147483648
int sizeOfLong = Long.SIZE; // 64 (bits)
int bytesOfLong = Long.BYTES; // 8 (bytes)
JDK的包装类型可以把基本类型包装为class
自动装箱和自动拆箱是编译器完成的(JDK>=1.5)
装箱和拆箱会影响执行效率
注意拆箱时可能发生NullPointerException
许多class的定义都符合: - 若干private实例字段 - 通过public方法读写实例字段
public class Person (
private String name;
private int age;
public String getName() {...}
public void setName (String name) {...}
public int getAge() {...}
public void setAge (int age) {...}
)
符合命名规范的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()获取属性列表
编译器不能检测或检查常量的修改
public class Weekday{
public static final int SUN = 0;
public static final String RED = "r";
}
if(day == Weekday.SUN)
if("r".equals(Color.RED))
enum定义的类型实际上是class - 继承自java.lang.Enum - 不能通过new创建实例 - 所有常量都是唯一实例(引用类型) - 可以用于switch语句
public enum Color{
RED, GREEN, BLUE;
}
//编译器编译出的class:
public final class Color extends Enum{
public static final Color RED = new Color () ;
public static final Color GREEN = new Color () ;
public static final Color BLUE = new Color () ;
private Color() {}
}
public enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
public class Main {
public static void main(String[] args) {
for (Weekday day : Weekday.values()) {
System.out.println(day.name());
}
Weekday fri = Weekday.FRI;
// enum -> String:
System.out.println("FRI.name() = " + fri.name());
// 定义时的序号:
System.out.println("FRI.ordinal() = " + fri.ordinal());
// String -> enum:
System.out.println(Weekday.valueOf("FRI").name());
// 不存在的name:
Weekday.valueOf("ABC");
}
}
enum可以定义常量类型,它被编译器编译为:
final class Xxx extends Enum { ... }
name()获取常量定义的字符串,注意不要使用toString()
ordinal()返回常量定义的顺序(无实质意义)
可以为enum类编写构造方法、字段和方法
构造方法申明为private
Math提供了数学计算的静态方法: - abs/min/max - pow / sqrt / exp / log / log10 - sin / cos / tan / asin / acos
常量: - PI = 3.14159... - E = 2.71828...
Math.random()生成一个随机数 - 0<=随机数<1 - 可用于生成某个区间的随机数
// MIN <= R < MAX
long MIN = 1000;
long MAX = 9000 ;
double x2 = Math.random() * (MAX-MIN) + MIN;
double r = (long)x2;
Random()生成一个伪随机数 - nextInt / nextLong / nextFloat... - nextlnt(N)生成不大于N的随机数
Random r = new Random();
r.nextInt();
r.nextInt(10); //生成0-10之间的随机数,不包括10
什么是伪随机数 - 给定种子后伪随机数算法会生成完全相同的序列 - 不给定种子时Random使用系统当前时间戳作为种子
SecureRandom用来创建安全的随机
BigInteger:表示任意大小的整数
BigDecimal:表示任意精度的浮点数
Math:数学计算
Random:生成伪随机数
SecureRandom:生成安全的随机数
BigInteger:表示任意大小的整数
BigDecimal:表示任意精度的浮点数
BigInteger和BigDecimal都继承自Number