Lazy loaded image
编程
📙Day13-内置类(String,StringBuilder,StringBuffer)
字数 4180阅读时长 11 分钟
2019-1-25
2025-8-13
type
status
date
slug
summary
tags
category
icon
password

字符串的使用

使用双引号包裹的内容我们称之为字符串,一个被双引号包裹的内容我们都可以认为是一个String类型的实例对象,String是引用数据类型。

String的构造方法

String(): 空参构造方法 String(String str): 传入一个字符串类型的参数 String(char[] chars): 传入一个字符类型的数组 String(char[] chars,int offset,int count): offset偏移 count个数 String(int[] codePoints,int offset,int count): 传入一个int类型的数组,保存的是码点(Unicode编码) String(byte[] bytes): 传入一个byte类型的数组,byte里需要的数字不是码点,而是根据默认字符集编码后的二进制 String(byte[] bytes,String charset): 传入一个byte类型的数组,byte里存储的是按照指定的字符集编码后的二进制 String(byte[] bytes,Charset charset): String(byte[] bytes,int offset,int count): String(byte[] bytes,int offset,int count,String charset): String(byte[] bytes,int offset,int count,Charset charset):
简言之,bytes方法最多,int常用方法很少 ,char方法比较多,没有int类型的数组

数字、字符、字符串的三方关系

数字和字符的关系: 一 一对应 'a' --> 97 '你'-->20320 '好'-->22909
字符和字符串的关系: 多个字符拼接在一起组成了字符串 new char[]{'你','好'} ==> "你好"
数字和字符串的关系: 1. 每个字符对应的Unicode编码(码点,codePoint) 调用的是 new String(int[] codePoints,int offset,int length)构造方法 new String(new int[]{97, 98},0, 2) --> ab new String(new int[]{20320, 22909},0, 2) --> 你好 2. 将字符串转换成为二进制以后,获取字符串和二进制之间的关系 调用的是 new String(byte[] bytes) 构造方法 常见的字符串编码集有 UTF8,GBK,BIG5
💡
有了unicode码表就能够表示绝大多数的文字,为什么还要有 UTF8等编码集? 思考: '你'的unicode编码是20320,int类型二进制表示 00000000 00000000 01001111 01100000 转换成为二进制以后 01001111 01100000 'a'的unicode编码是97, 使用int类型二进制表示 00000000 00000000 00000000 01100001 转换成为二进制以后 01100001 "你a" 如果转换成为二进制以后 01001111 01100000 01100001 a b c / ab c / a bc 解决方案: 1. 对齐,找位数最多的数字,位数少的数字使用0补齐 01001111 01100000 00000000 01100001 2. 根据 二进制的范围再进行一次转换计算得到一个新的二进制(UTF8).UTF8编码是基于Unicode码表的 01001111 01100000 --> 经过UTF8编码以后得到 11100100 10111101 10100000 01100001 --> 经过 UTF8编码以后得到的结果还是 01100001
UTF8编码以后,一个汉字占用三个字节,GBK编码以后,一个汉字占用两个字节。纯文本乱码就是编解码的方式不一致 Unicode码点是 0~127编译以后的结果是一个字节,码点是128~2047编译以后得到的结果是2个字节,码点是2048~65536编译以后得到的结果是3个字节

字符串的源码分析

成员变量: private final char[] value 这个char类型的数组value就保存了字符串里的所有字符 JDK9以后,String底层的源码发生了变化,不再使用 char类型的数组,而是使用 private final byte[] value 来保存所有的数据,字符串类型的变量是不能被修改的!因为内部维护的数组是被 final 修饰的,只能赋值一次!

字符串的哈希计算

String常见方法总结

  1. length():获取到字符串的长度,其实就是 value数组的长度
  1. equals(): 比较两个字符串的内容是否相同
  1. hashCode(): 获取到字符串的哈希值
  1. toCharArray(): 将字符串转换成为char类型的数组
  1. isEmpty(): 判断字符串是否是空, value.length == 0
  1. charAt(int index): 查找字符串里指定位置上的字符,下标从0开始
  1. codePointAt(int index): 查找字符串指定位置上的字符,转成int类型的
  1. indexOf(char c)/indexOf(String s): 获取指定字符(串)在字符串里第一次出现的下标,如果不存在,返回-1
  1. lastIndexOf(char c)/lastIndexOf(String s):
  1. getBytes(String charset): 根据指定的编码集将字符串转换成为二进制
  1. equalsIgnoreCase(): 不区分大小写比较
  1. startsWith(String x)/endsWith(String x): 判断是否已自定的字符串开始/结束
  1. subString(): 从字符串上复制一部分子字符串
  1. toLowerCase() / toUpperCase():变小写和变大写
  1. concat():用来合并多个字符串

字符串其他方法

  1. replace(char oldChar,char newChar): 用新的字符替换旧字符
  1. replace(CharSequence target,CharSequence replacement): 使用新字符串替换旧字符串
  1. replaceFirst(String regex,String replacement): 使用字符串替换第一次出现的旧字符串
  1. replaceAll(String regex,String replacement):使用字符串替换旧字符串
  1. split(String regex):根据指定的字符对字符串进行分割
  1. matches(String regex):判断字符串是否复合某个正则规则
  1. 在Java里,如果看到形参是 String regex表示参数需要的是 正则表达式
正则表达式: 用户名验证,邮箱验证,身份证验证, 爬虫

正则表达式中标点符号的含义:

. 用来表示除了 换行\n 以外的其他任意字符 + 表示前面的字符至少出现一次,一次及以上,等价于 {1,} ? 表示前面的字符最多出现一次,等价于 {0,1} * 表示前面的字符出现任意次数,等价于 {0,} {n} 表示前面的字符只能出现n次 {n,m} 表示前面的字符出现 [n,m] 次 {n,} 表示前面的字符至少出现 n 次 [] 表示单个值的可选范围 [0-9a-mx] | 用来表示可选值,通常和()来配合使用 ^ 表示以指定的字符开始,放在[]里,表示取反 $ 表示以指定的字符结束

正则表达式中字母前面加 \\ 特殊含义

\\d 表示数字,等价于[0-9] \\D 表示非数字,等价于[^0-9] \\w 表示数字,字母和下划线,等价于 [0-9a-zA-Z_] \\W 表示非数字,字母和下划线,等价于 [^0-9a-zA-Z_] \\t 表示一个制表符 \\n 表示换行 \\s 表示非打印字符,看不见的字符,比如制表符,空格以及换行等 \\S 表示打印字符,除了 制表符,空格及换行以外的字符

Scanner常见方法介绍

  1. next():接收用户输入的字符串,不允许用户只输入空格以及回车,必须要输入内容以后,再回车才会停止接收。如果输入的字符串里有空格,会认为这次输入结束,空格后面的内容是下一次输入的内容
  1. nextLine(): 允许输入空格
  1. nextInt(): 接收用户输入的数字

String练习题1

String练习题2

String练习题3

字符串里的静态方法

valueOf(int i):将数字转换成为字符串,不经常使用,直接使用 +
join(CharSequence delimiter,CharSequence[] arr): 把字符串数组转换成为字符串 format(String formatString,Object...args):格式化一个字符串

String静态方法之format

String里有一个静态方法format,可以用来对字符串进行格式化,常用的如下 在字符串里使用 %d %s %f 等格式化占位符来表示,通过参数来设置值
占位符
含义
%d
整数的占位符
%nd
如果整数不够n位,左边使用空格补齐
%0nd
如果整数不够n位,左边使用0补齐
%-nd
如果整数不够n位,右边使用空格补齐
%s
字符串的占位符
%f
浮点数的占位符
%.nf
表示四舍五入保留到小数点后n位
%o
将数字转换成为八进制输出
%x %X
将数字转换成为十六进制输出

StringBuilder

String是不可变的,内部维护了一个被 final修饰的char[] value StringBuilder是可变的,内部维护的 char[]value没有被 final修饰
StringBuilder(): 内部维护的数组长度默认是16 StringBuilder(String s): 数组的长度是 s.length + 16
调用append方法,StringBuilder会自动将数据添加到value数组里,当添加的字符串长度大于value的长度以后, value数组长度会自动扩容为原来长度 << 1 + 2 如果扩充以后还不够,直接使用添加字符后(最小)的长度

StringBuilder里的常见方法

  1. append(String str): 添加字符串
  1. deleteCharAt(int index):删除指定下标上的字符
  1. delete(int start,int end): 删除指定范围的字符
  1. insert(int offset,String str):在指定的位置上插入元素
  1. reverse():翻转内容

String、StringBuilder、StringBuffer区别

表示字符串类: String 不可变的字符串,大部分情况下使用String StringBuilder 可变的字符串 StringBuffer 可变的字符串
StringBuilder和StringBuffer它们的原理相同,区别在于: StringBuilder是线程不安全的,效率高,推荐使用 StringBuffer是线程安全的,效率低,不常用
上一篇
Day12-面向对象6(枚举、包装类)
下一篇
Day14-内置类(System,BigInteger,BigDecimal,日期时间类)