20201223.刘佳昊
完整更新地址
知识点
System.identityHashCode()
hashcode
- Object.hashcode() 会返回对象的 hashCode,为了提高 hashMap
的性能,可以当做是由对象内存地址计算而来 - hashcode()可以为每个元素使用统一的计算方法计算其存储位置
- hashcode() 同时可用于 equals() 判断
identityHashCode()
- 子类继承 Object 类,可能会重写 Object 类中的 hashCode() 方法
- 而为了取得 Object 类 hashcode() 生成的原始 hash code,可以通过
System.identityHashCode() 方法获得 -
System.identityHashCode(); 可以获得任意引用变量所指向的对象对应的类在重写
Object 的 hashCode方法 之前 hashCode方法 返回的值class IdentityHashCode{ @Override
public int hashCode() {
System.out.println("super hash code: " + super.hashCode());
// 在 hashCode(); 重写后,怎么生成 hash code 完全看自己
// null 在 Object 中的 hashcode() 返回值是 0
final int prime = 11;
int result = 1;
result = prime * result + id;
return result;
}
}class IdentityHashCode{ public static void main(String[] args) {
System.out.println(identityHashCode1.hashCode());
System.out.println("identityHashCode: "
+ System.identityHashCode(identityHashCode1));
}
}
Arrays
array constants 数组常量
{1, 2, 3}
等这种被称为数组常量
数组初始化
-
静态初始化
-
声明数组变量 和 数组中各元素初始化赋值是在一起的
int[] array = {1, 3, 5, 7, 9};
-
数组声明过程
- 堆内存开辟内存空间
- 数组常量对数组进行初始化
- 堆内存中数组首地址赋值给变量
-
-
动态初始化
-
声明数组 创建数组 为数组个元素赋值 是分开的
使用 new 关键字
显式创建数组后再用 数组常量 对数组各位置进行初始化int[] array; array = new int[] {1, 3, 5, 7, 9};
-
数组声明过程
- 声明一个 int[] 类型的 array 变量
- 在 堆内存中 创建 int 数组 并为各位置赋予默认值0
- 将堆内存中的数组首地址赋值给 array 变量
-
-
注意
但如果声明数组后没有立即初始化赋值,则不能使用静态初始化,只能使用动态初始化String[] strings; // Array initializer is not allowed here, Array constants can only be used in initializers
// strings = {"1", "2"};
strings = new String[]{""};
System.arraycopy(); 数组元素操作调用底层调用该方法
// src源数组, srcPos 源数组开始位置, dest目标数组, destPos目标数组开始位置, length复制长度
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
Arrays.copyOf();
// 范围内截取,超过范围填充默认值
Arrays.copyOf(T[] original, int newLength);
- 创建一个长度为 newLength 的新数组后,
- 调用 System.arraycopy(original, 0, copy, 0, Math.min(original.length,
newLength)); - 返回新数组
Arrays.copyOfRange();
// [fromIndex, toIndex)
Arrays.copyOfRange(T[] original, int from, int to);
- 如果 (to - from < 0) throw IllegalArgumentException
- 创建新数组 长度 newLength = to - from
- 调用 System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
字符序列 char sequence 与字节序列 byte sequence
字符序列 char sequence
// char数组就是有序存放的字符,即 字符序列 ( char sequence )
char[] chars = {'一', '二', '三', '四'};
字节序列 byte sequence
// byte数组就是有序存放的字节,即 字节序列 ( byte sequence )
byte[] bytes = {-128, 100, 40, 126, 65, 80};
java.lang.CharSequence
java.lang.CharSequence
是个接口
-
该接口定义了以下抽象方法:
- int length()
- char charAt(int index)
- CharSequence subSequence(int start, int end)
- String toString() // 从Object继承
-
以下类实现了该接口
- java.lang.String
- java.lang.StringBuffer // TODO 完善
- java.lang.StringBuilder // TODO 完善
字符编码
java.nio.charset.Charset
类的实例表示字符编码
- Charset.defaultCharset() 返回 JVM 的默认 charset 实例
- Charset.forName( String charsetName ) 返回 指定名称的 Charset 实例
-
Charset.isSupported( String charsetName ) 判断当前JVM是否支持指定的
- 字符序列(char sequence) 转换为 字节序列(byte sequence) 的过程被称作
编码(encode) - 编码时 必须指定 相应的 字符集(charset),若未显式设置则使用 平台默认字符集
- 字节序列(byte sequence) 转换为 字符序列(char sequence) 的过程被称作
解码(decode)
String类的构造方法
- 通过使用平台的默认字符集 解码 指定的 byte数组,构造一个新的 String实例
String(byte[] bytes);
String(byte bytes[], int offset, int length);
- 通过使用指定的 charset 解码指定的 byte数组,构造一个新的 String实例
String(byte bytes[], Charset charset);
String(byte bytes[], int offset, int length, Charset charset);
- 通过使用指定的 charsetName 解码指定的 byte数组,构造一个新的 String实例
String(byte bytes[], String charsetName);
String(byte bytes[], int offset, int length, String charsetName)
通过使用 Charset.defaultCharset() 创建 charset 实例
// The default charset is determined during virtual-machine startup
// and typically depends upon the locale and charset of the underlying operating system.
Charset charset = Charset.defaultCharset();
// UTF-8 可变长度1-4字节 中文一般3字节
Charset utf8CharSet = Charset.forName("UTF-8");
// GBK 2字节
Charset gbkCharSet = Charset.forName("GBK");
字符序列编码为字节序列, 字节序列解码为字符序列
final String STRING = new String("兔兔: _(:з」∠)_");
byte[] bytes1 = STRING.getBytes();
System.out.println(Arrays.toString(bytes1));
bytes1 = STRING.getBytes(utf8CharSet);
System.out.println(Arrays.toString(bytes1));
bytes1 = STRING.getBytes(gbkCharSet);
System.out.println(Arrays.toString(bytes1));
// STRING-GBK
byte[] bytes2 = new byte[]{-51, -61, -51, -61, 58, 32, 95, 40, 58, -89, -39, -95, -71, -95, -49, 41, 95};
System.out.println(new String(bytes2));
System.out.println(new String(bytes2,utf8CharSet));
System.out.println(new String(bytes2,gbkCharSet));
_(:з」∠)_
- 正在重建目录结构...
- 最近的工作量有点大...
近期评论