Java其他未分类知识点集合

  1. Java中为什么一个char可以保存一个汉字字符?

    • Java中一个char是2个字节,而中文如果用UTF8方式编码则会是可能占用三个字节
    • Java编译器其实使用的是使用UTF16方式对汉字进行编码,而绝大多数的字符使用UTF16编码都只需要两个字节即可
    • 扩展:
      • Unicode编码将绝大多数字符使用0x000000~0x10FFFF映射
      • UTF8占用字符根据Unicode码分别使用1、2、3、4字节,比特位为0的占1字节,1个1占1字节,2个1占2字节,3个1占3字节,4个1占4字节
      • UTF16占用2个或4个字节;UTF32占用4个字节
      • 在转换工具中,只有URL编码工具对汉字进行编码的时候,才会使用UTF8编码;其他的Unicode转换都是UTF32编码
  2. Java如何计算汉字的hashCode?

    • 因为汉字在Java编译器中转码成UTF-16编码格式,这样就可以直接再JVM中运行,所以汉字的hashCode就是汉字十进制的Unicode码值。
    • 验证
      // 虽然声明了一个String类型数据,但是内部其实是char类型的 '我'
      String a = "我";
      // 这里转换的时候一定要转换成UTF-16字符集,否则会使用默认的ISO-8859-1,返回值是有问题的
      byte[] arr = a.getBytes(StandardCharsets.UTF_16);
      // 打印字节值:[-2, -1, 98, 17]
      // 这里开头的-2和-1其实是字节序标志FE FF(这是16进制内存原码值),标志使用的编码格式是UTF-16BE(Java中只用Big Endian)
      Arrays.toString(arr);
      // 忽视开头的标识,98, 17的二进制是:01100010 00010001,组合起来就是十进制的25105
      Integer.toBinaryString(a.hashCode());
      // 而hash值是:25105
      a.hashCode();
      // 十六进制表示是:\u6211
      System.out.printf("\\u%4x", (int) '我');
      // \u6621的十进制值是:25105
      
  3. Java中UTF-16的字节序标识

    • 用处:编译器将UTF-8字符统一转换成UTF-16编码格式数据,因为UTF-16是定长的,方便内部随机访问,字节序标识用来标识UTF-16是编译成了哪种格式
    • 分为两种:
      • Big Endian(大端,简称BE),开头标识符是FE FF
      • Little Endian(小端,简称LE),开头标识符为FF FE
    • 简单理解是:字符串"ABC",对应十六进制内存值为41 42 43,不同的序标识为
      • BE:FE FF 00 41 00 42 00 43
      • LE:FF FE 41 00 42 00 43 00
  4. JVM-变量在内存中的存放

    • 成员变量:不管是基本数据类型还是引用数据类型,变量名和值都存放在"堆"中。
    • 局部变量:调用方法的时候,会生成一个方法"栈";方法结束后,方法"栈"会被释放,同时内部的局部变量也会销毁。
      • 基本类型:变量名和值存放在方法"栈"中。
      • 引用类型:变量名放在方法"栈"中,指向的对象则是放在"堆"中。
  5. JavaSE-变量的声明、初始化、分配内存和默认值

    虽然这确实是SE阶段的最基本知识,但是目前无处可放

    • 声明:指为变量指定它的数据类型,是基本数据类型还是引用数据类型。
    • 初始化:给变量分配内存空间和初始值,在这里基本数据类型和引用数据类型是不同的。
    • 分配内存:
      • 基本数据类型:在声明的时候就已经完成了初始化为值分配了内存空间,并且设置了默认值(见下)。
      • 引用数据类型:只声明的话,是只给变量在方法栈或堆中分配了内存空间,并没给值在堆中分配内存;当给引用类型变量赋null值时,会完成初始化给变量在堆中开辟一个空间大小为0的内存空间;只有给变量赋一个非null的对象的时候,才会指向定量的内存空间。
    • 基本数据类型初始值(都是等价于各自类型中值为0的那个值)
      类型 初始值(默认值)
      boolean false
      char /u0000(空格)
      byte 0
      short 0
      int 0
      long 0L
      float 0.0f
      double 0.0d
    • 注:基本数据类型的默认值在变量为成员变量或者局部变量时并不一致,只有在成员变量时才会如上表所示;而在局部变量时,值则为随机值,但是不用担心,编译器不允许出现不赋初始值的局部变量。
  6. 未整理

posted @ 2022-07-02 10:42  苍凉温暖  阅读(28)  评论(0编辑  收藏  举报