Java的字符串详解
字符串是最重要的引用类型
- 互联网基本上只干一件事:处理字符串
- 能处理好字符串是Web服务器的基本要求
- PHP
- Python
- Ruby
- Perl
- Java
不可变性
- 为什么字符串是不可变的?
- 安全:线程安全,存储安全
- Object的hashCode() 约定
- 只要是一个对象,整个Java生命周期中必须返回一样的hashCode值
- 如果两个对象相同,那么这两个对象的 hash 值一定相等
- 怎么不可变
- String 是final的,不可继承
private final char value[];
不能改变指向- String公开的API中都没有可以修改String的值的东西
- 缺点,每当修改的时候都需要重复创建新的对象
怎么修改
- StringBuilder
- 优先使用,线程不安全,速度快
- StringBuffer
- 线程安全,速度相对较慢
- 不能当做hash桶的key
内部构造和常用API
- 不可变性是如何保证的?
- hash值是如何存储的?
private int hash;
- 把当前的hash值缓存起来,因为字符串不可变,hash值也是不可变;
- hash默认是0
public int hashCode()
- 如何使用字符串随心所欲地完成工作?
- 还不够的,StringUtils补上
编码与解码
- 一个人类世界中的字符如何转换成计算机世界中的字节?
- —定存在一种映射关系
- 我们称这种映射关系为字符集
- 将人类能看懂的字符变成字节,叫做编码
- 将字节变成人类能看懂的字符,叫做解码
字符集:Unicode
- 每个数字代表一个字符,叫做“码点”(code point)
- 那我能不能直接拿来变成字节啊?
- 可以......但是没必要。
- 最常见的两种编码方案:
- UTF-16
- Java程序内部的存储方法
- UTF-8
- Mac/Linux默认编码是UTF-8
- Windows默认的中文编码是GBK
- 如果没有意外,把你所有的编码方案都改成UTF-8
- UTF-16
主要区别
- String是不可变字符序列,StringBuilder和StringBuffer是可变字符序列
- 执行速度StringBuilder > StringBuffer > String
- StringBuilder是非线程安全的,StringBuffer是线程安全的
练习
「资料来源:饥人谷」