概述
字符串是不可变的 => 字符串每当修改时都需要重复创建新的对象
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 程序内部的存储方法
- 基本语言平面 => 2 byte => 面临字节序的问题
- 辅助平面 => 4 byte
-
UTF-8
- 000000 - 00007F => 前 128 保持不变 => 1 byte
- 000080 - 0007FF => 1920 个代码 => 2 byte
// TODO
- BMP => Basic Multilingual Plane => 基本多语言平面
-
字节序 => Endianness
- 大端序 big-endian
- 小端序 little-endian
- BOM => byte-order mark
GBK
知识点
- 字符串是如何保证不可变性?
答:String
类是final
的,不能被继承,内部保存char
数组的value
是final
的,不能改变指向,所有的公开 API 中都不能修改value
值
private final char value[];
-
为什么字符串是不可变的?
答:不可变的东西是线程安全的 + 存储安全。能够在哈希桶中安全的使用 String,String 必须不可变。String 作为哈希桶的 key
反证法:如果 String 可变,那么 String 改变的时候,String 的hashCode
是否改变- 如果改变,那么违反了
hashCode
第一条约定 - 如果不改变,那么违反了
hashCode
第二条约定 => "a" -> "ab" <- "abc"
- 如果改变,那么违反了
-
Object.hashCode()
约定- 无论什么时候在相同的对象上调用,在整个 Java 应用执行中,
hashCode
方法保持返回相同的值,如果在对象上的equals
比较中使用的信息没有被修改 - 如果两个对象根据
equals
方法是相等的,那么这两个对象的hashCode
的返回值也相同 - 如果两个对象根据
equals
方法是不相等的,那么在两个对象上调用hashCode
方法不一定产生不同的结果
- 无论什么时候在相同的对象上调用,在整个 Java 应用执行中,
-
hash 值是如何存储的?
hashCode
String 将 hash code 值缓存起来,因为 String 不可变,所以不需要重复计算,所以可以缓存起来,默认值是 0,通过hashCode
方法进行计算
-
如果没有意外,将所有的编码方案都改为 UTF-8
-
Mac | Linux 默认编码是 UTF-8, Windows 默认的中文编码是 GBK 汉字内码扩展规范,国标扩展字符集
-
乱码问题 == 编码与解码所用字符集不同
-
Google search
- Java -csdn => 不查找 csdn 的
- xxx filetype:pdf => 查找可下载的 pdf
-
读取文件
Files.readAllLines(file.toPath(), Charset.forName("GBK")).stream().collect(Collectors.join(System.lineSeparator()))
- 判断字符串相等使用
equals()
=>String
是Object
网友评论