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常见方法总结
- length():获取到字符串的长度,其实就是 value数组的长度
- equals(): 比较两个字符串的内容是否相同
- hashCode(): 获取到字符串的哈希值
- toCharArray(): 将字符串转换成为char类型的数组
- isEmpty(): 判断字符串是否是空, value.length == 0
- charAt(int index): 查找字符串里指定位置上的字符,下标从0开始
- codePointAt(int index): 查找字符串指定位置上的字符,转成int类型的
- indexOf(char c)/indexOf(String s): 获取指定字符(串)在字符串里第一次出现的下标,如果不存在,返回-1
- lastIndexOf(char c)/lastIndexOf(String s):
- getBytes(String charset): 根据指定的编码集将字符串转换成为二进制
- equalsIgnoreCase(): 不区分大小写比较
- startsWith(String x)/endsWith(String x): 判断是否已自定的字符串开始/结束
- subString(): 从字符串上复制一部分子字符串
- toLowerCase() / toUpperCase():变小写和变大写
- concat():用来合并多个字符串
字符串其他方法
- replace(char oldChar,char newChar): 用新的字符替换旧字符
- replace(CharSequence target,CharSequence replacement): 使用新字符串替换旧字符串
- replaceFirst(String regex,String replacement): 使用字符串替换第一次出现的旧字符串
- replaceAll(String regex,String replacement):使用字符串替换旧字符串
- split(String regex):根据指定的字符对字符串进行分割
- matches(String regex):判断字符串是否复合某个正则规则
- 在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常见方法介绍
- next():接收用户输入的字符串,不允许用户只输入空格以及回车,必须要输入内容以后,再回车才会停止接收。如果输入的字符串里有空格,会认为这次输入结束,空格后面的内容是下一次输入的内容
- nextLine(): 允许输入空格
- 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里的常见方法
- append(String str): 添加字符串
- deleteCharAt(int index):删除指定下标上的字符
- delete(int start,int end): 删除指定范围的字符
- insert(int offset,String str):在指定的位置上插入元素
- reverse():翻转内容
String、StringBuilder、StringBuffer区别
表示字符串类:
String 不可变的字符串,大部分情况下使用String
StringBuilder 可变的字符串
StringBuffer 可变的字符串
StringBuilder和StringBuffer它们的原理相同,区别在于:
StringBuilder是线程不安全的,效率高,推荐使用
StringBuffer是线程安全的,效率低,不常用
- 作者:tacjin
- 链接:http://jin.wiki/article/23460393-df5b-4b55-9d8c-c6ec8f6ae255
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。