美文网首页
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