字符串是最重要的引用类型

  • 互联网基本上只干一件事:处理字符串
  • 能处理好字符串是Web Server的基本要求

    • 所以能很好处理字符串的语言容易做WebServer
    • Java、PHP、Python、Ruby、Perl

      字符串的不可变性

  • 为什么:

    • 线程安全
    • 存储安全:
      • 如果可变的话,内容相同的String,hashCode会不一样
        • 比如原来有个”ab”, “abc”两个hashCode不一样,将”abc“改为”ab“,但是hashCode没变
        • 造成两个“ab”的hashCode不同,违反了Object的hashCode约定
  • 缺点:
    • 每次修改的时候,都需要重复创建新对象

需要修改怎么办

1. StringBuilder

  • 优先使用,线程不安全,但速度快

    2. StringBuffer

  • 线程安全,速度相对较慢

字符串的内部构造和常用API

1. 不可变性是如何保证的

  • String类是final类,不可继承
  • 所有公开接口都是精心设计的,都不能修改里面的字符数组value
    image.png

    2. hash值是如何存储的

  • 字符串是不可变的,所以hash值也会缓存,不会每次重新调用hashCode方法计算

    • String的hashCode实现只有在hash为0时才会重新计算
    • 虽然有线程安全问题,但是每次计算出来的结果都是一样的,可以忽略这个问题,结果是安全的
    • image.png
      image.png

      3. 如何使用字符串随心所欲地完成工作

  • StringBuilder API

  • StringBuffer API
  • String API

    4. 还不够的,StringUtils补上

字符串与编码

  • 字符如何转换成计算机世界的编码
    • 通过【映射关系】
    • 这种映射关系为【字符集】
    • 字符(人能够看懂) -> 字节:编码
    • 字节 -> 字符:解码

字符集:Unicode

1. 每个数字代表一个字符

  • 叫做【码点】(code point)

    2. 最常见的两种编码方案:

  • UTF-16:Java程序内部的存储方法

  • UTF-8(最好的多语言解决方案):

    • Mac/Linux默认编码
    • Windows默认的中文编码是GBK
    • 如果没有意外情况,最好把你的编码方案都换成UTF-8

      3. 各种单位能存的字符量

  • byte:0~255,256个,英文足够了

  • short:2bytes,256^2 = 65536个
  • int: 4bytes,256 ^ 4 = 约42.9亿个
  • unicode存的是世界大一统的文字(所有文字),所以码表用的int(目前刚用了差不多10w个)

    4. 多字节字符编码传输时顺序问题

  • 文件头加BOM(byte order mark)

  • 中文大多3个字节

    5 GBK,前身是GB2312

  • 与unicode用的完全不同的编码表,不能按同张码表查