34Java的字符串详解

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

主要区别

  • String是不可变字符序列,StringBuilder和StringBuffer是可变字符序列
  • 执行速度StringBuilder > StringBuffer > String
  • StringBuilder是非线程安全的,StringBuffer是线程安全的

练习

实现一个MyStringBuilder

读取一个GBK编码的文件

「资料来源:饥人谷」

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注