20201223.刘佳昊

完整更新地址

  • Github
  • Gitee
    (本仓库强制同步自Github, 建议浏览Github原版)

知识点

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} 等这种被称为数组常量

数组初始化

  1. 静态初始化

    1. 声明数组变量 和 数组中各元素初始化赋值是在一起的

      int[] array = {1, 3, 5, 7, 9}; 
      
    2. 数组声明过程

      1. 堆内存开辟内存空间
      2. 数组常量对数组进行初始化
      3. 堆内存中数组首地址赋值给变量
  2. 动态初始化

    1. 声明数组 创建数组 为数组个元素赋值 是分开的
      使用 new 关键字
      显式创建数组后再用 数组常量 对数组各位置进行初始化

      int[] array;
      array = new int[] {1, 3, 5, 7, 9};
      
    2. 数组声明过程

      1. 声明一个 int[] 类型的 array 变量
      2. 在 堆内存中 创建 int 数组 并为各位置赋予默认值0
      3. 将堆内存中的数组首地址赋值给 array 变量
  3. 注意
    但如果声明数组后没有立即初始化赋值,则不能使用静态初始化,只能使用动态初始化

    String[] strings;
    // Array initializer is not allowed here, Array constants can only be used in initializers
    // strings = {"1", "2"};
    strings = new String[]{""};

    stackoverflow

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);
  1. 创建一个长度为 newLength 的新数组后,
  2. 调用 System.arraycopy(original, 0, copy, 0, Math.min(original.length,
    newLength));
  3. 返回新数组

Arrays.copyOfRange();

 // [fromIndex, toIndex)
Arrays.copyOfRange(T[] original, int from, int to);
  1. 如果 (to - from < 0) throw IllegalArgumentException
  2. 创建新数组 长度 newLength = to - from
  3. 调用 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 是个接口

  • 该接口定义了以下抽象方法:

    1. int length()
    2. char charAt(int index)
    3. CharSequence subSequence(int start, int end)
    4. String toString() // 从Object继承
  • 以下类实现了该接口

    1. java.lang.String
    2. java.lang.StringBuffer // TODO 完善
    3. java.lang.StringBuilder // TODO 完善

字符编码

java.nio.charset.Charset 类的实例表示字符编码

  1. Charset.defaultCharset() 返回 JVM 的默认 charset 实例
  2. Charset.forName( String charsetName ) 返回 指定名称的 Charset 实例
  3. Charset.isSupported( String charsetName ) 判断当前JVM是否支持指定的

  • 字符序列(char sequence) 转换为 字节序列(byte sequence) 的过程被称作
    编码(encode)
  • 编码时 必须指定 相应的 字符集(charset),若未显式设置则使用 平台默认字符集
  • 字节序列(byte sequence) 转换为 字符序列(char sequence) 的过程被称作
    解码(decode)

String类的构造方法

  1. 通过使用平台的默认字符集 解码 指定的 byte数组,构造一个新的 String实例
String(byte[] bytes);
String(byte bytes[], int offset, int length);
  1. 通过使用指定的 charset 解码指定的 byte数组,构造一个新的 String实例
String(byte bytes[], Charset charset);
String(byte bytes[], int offset, int length, Charset charset);
  1. 通过使用指定的 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));

_(:з」∠)_

  • 正在重建目录结构...
  • 最近的工作量有点大...

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1