美文网首页
Java String

Java String

作者: bowen_wu | 来源:发表于2021-07-29 17:33 被阅读0次

    概述

    字符串是不可变的 => 字符串每当修改时都需要重复创建新的对象

    java.lang.String

    • charAt() | length()
    • compareTo()
    • concat() | | join() | replace() | trim() | subString()
    • contains() | matches() | endsWith() | startsWith() | isEmpty()
    • indexOf() | lastIndexOf()
    • split()
    • toLowerCase() | toUpperCase()

    java.lang.StringBuilder

    A mutable sequence of characters. but with no guarantee of synchronization.
    优先使用,线程不安全,速度快

    java.lang.StringBuffer

    A thread-safe, mutable sequence of characters.
    线程安全,速度相对较慢

    字符串与编码

    字符集 => 映射关系,字符转化成计算机中的字节的映射关系
    编码 => 自然语言的字符变成字节
    解码 => 字节变成自然语言的字符

    字符集 Unicode

    使用 int 代表字符,4 bytes,数字称为 Code Point(码点)
    Unicode 的前 127 位就是 ASCII 表
    A -> 65 -> 0x41 -> Code Point == \u0x41
    \u0x41 => A => u == unicode

    编码方案

    Unicode 的 4 byte 太大了,小的数字是常用的,但是常用的总是空着前面3个字节

    最常见的两种编码方案

    • UTF-16 => Java 程序内部的存储方法
      1. 基本语言平面 => 2 byte => 面临字节序的问题
      2. 辅助平面 => 4 byte
    • UTF-8
      1. 000000 - 00007F => 前 128 保持不变 => 1 byte
      2. 000080 - 0007FF => 1920 个代码 => 2 byte

    // TODO

    1. BMP => Basic Multilingual Plane => 基本多语言平面
    2. 字节序 => Endianness
      • 大端序 big-endian
      • 小端序 little-endian
    3. BOM => byte-order mark

    GBK

    知识点

    1. 字符串是如何保证不可变性?
      答:String 类是 final 的,不能被继承,内部保存 char 数组的 valuefinal 的,不能改变指向,所有的公开 API 中都不能修改 value
    private final char value[];
    
    1. 为什么字符串是不可变的?
      答:不可变的东西是线程安全的 + 存储安全。能够在哈希桶中安全的使用 String,String 必须不可变。String 作为哈希桶的 key
      反证法:如果 String 可变,那么 String 改变的时候,String 的 hashCode 是否改变

      • 如果改变,那么违反了 hashCode 第一条约定
      • 如果不改变,那么违反了 hashCode 第二条约定 => "a" -> "ab" <- "abc"
    2. Object.hashCode() 约定

      • 无论什么时候在相同的对象上调用,在整个 Java 应用执行中, hashCode 方法保持返回相同的值,如果在对象上的 equals 比较中使用的信息没有被修改
      • 如果两个对象根据 equals 方法是相等的,那么这两个对象的 hashCode 的返回值也相同
      • 如果两个对象根据 equals 方法是不相等的,那么在两个对象上调用 hashCode 方法不一定产生不同的结果
    3. hash 值是如何存储的?
      String 将 hash code 值缓存起来,因为 String 不可变,所以不需要重复计算,所以可以缓存起来,默认值是 0,通过 hashCode 方法进行计算

      hashCode
    4. 如果没有意外,将所有的编码方案都改为 UTF-8

    5. Mac | Linux 默认编码是 UTF-8, Windows 默认的中文编码是 GBK 汉字内码扩展规范,国标扩展字符集

    6. 乱码问题 == 编码与解码所用字符集不同

    7. Google search

      • Java -csdn => 不查找 csdn 的
      • xxx filetype:pdf => 查找可下载的 pdf
    8. 读取文件

    Files.readAllLines(file.toPath(), Charset.forName("GBK")).stream().collect(Collectors.join(System.lineSeparator()))
    
    1. 判断字符串相等使用 equals() => StringObject

    相关文章

      网友评论

          本文标题:Java String

          本文链接:https://www.haomeiwen.com/subject/otoomltx.html