2-Java核心类总结-String
目录
String
字符串广泛应用 在 Java 编程中,在 Java 中 字符串属于对象 ,Java 提供了 String 类来创建和操作字符串。String类表示字符串, Java程序中的所有字符串文字(例如“abc" )都实现为此类的实例。
1)java中字符串的不变性
java中字符串是不变的,它们的值在创建后 无法更改 。 字符串缓冲区(StringBuffer类)支持可变字符串。 因为String对象是不可变的,所以可以共享它们。
不变性原理:不可变即不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个新的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。
要理解String的不可变性,首先看一下String类中都有哪些成员变量。 在JDK1.6中,String类有value,offset和count这三个变量,且都是private的,并且没有提供setValue, setOffset和setCount等公共方法来修改这些值,所以在String类的外部无法修改String,也就是说 一旦初始化就不能修改 , 并且在String类的外部不能访问这三个成员。此外,value,offset和count这三个变量都是final的, 也就是说在String类内部,一旦这三个值初始化了, 也不能被改变。所以可以认为String对象是不可变的了。
2)字符串的创建
直接赋值:如 String s = "abc";
使用关键字和构造方法来创建对象:如 String s = new String("abc")
附:String类的构造方法有以下
3)字符串长度(及限制)
使用 length() 方法,如:String s = new String("abc"); System.out.println( s.length() ); //打印结果为3
String的长度限制:
根据public String(char value[], int offset, int count)的定义,count是int类型的, char value[] 中最多可以保存 Integer.MAX_VALUE 个,即2147483647字符(jdk1.8.0_73);但String s = ""; 中,最多可以有65534个字符。如果超过这个个数,就会在 编译期 报错。
长度限制原理:当我们使用字符串字面量直接定义String的时候,是会把字符串在常量池中存储一份的。那么上面提到的65534其实是 常量池的限制 。常量池中的每一种数据项也有自己的类型。Java中的 UTF-8 编码的 Unicode 字符串,在常量池中以CONSTANT_Utf8 类型表示。CONSTANT_Utf8_info 是一个CONSTANT_Utf8类型的常量池数据项,它存储的是一个常量字符串。常量池中的所有字面量几乎都是通过CONSTANT_Utf8_info描述的。而CONSTANT_Utf8_info中有 "u2 length" ,表明了该类型存储数据的长度。u2是无符号的16位整数,因此理论上允许的最大长度是2^16=65536。而 java class 文件是使用一种变体UTF-8格式来存放字符的,null 值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。
上面提到的这种String长度的限制是编译期的限制,也就是使用 String s= ""; 这种 字面值方式定义 的时候才会有的限制。String在运行期也有长度限制的,就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在 运行期 ,如果String的长度超过这个范围,就可能会抛出异常。(在jdk 1.9之前)int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有有近 4G 的容量。
4)连接字符串
String 类提供了连接两个字符串的方法
(1)public String concat(String str):
将指定的字符串连接到此字符串的末尾。如果参数字符串的长度为0 ,则返回使用concat方法的 String对象;否则,返回一个是由此 String 对象表示的字符序列 和 由参数字符串表示的字符序列的串联的 String 对象。也可以对字符串常量使用 concat() 方法,如:"cares".concat("s") //返回 "caress"。
如:
(2)使用'+'操作符
更常用的是使用'+'操作符来连接字符串。如:"Hello," + " runoob" + "!" ;//返回 "Hello, runoob!"。
5)格式化字符串
输出格式化数字可以使用 printf() 和 format() 方法。String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象, 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
如:
System.out.printf("浮点型变量的值为 " +"%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + "is %s", floatVar, intVar, stringVar);
也可以写成:
String fs; fs = String.format("浮点型变量的值为 " +"%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + " %s", floatVar, intVar, stringVar);
附:String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。与C语言的sprintf()方法有类似之处。format()方法有两种重载形式:
(1)format(String format, Object... args)
该方法使用指定的字符串格式和参数生成格式化的新字符串。新字符串始终使用本地语言环境。
语法: String.format(format,args...) 。format:字符串格式;args...:字符串格式中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。参数的数目是可变的,可以为0。
(2)format(Locale locale, String format, Object... args)
该方法使用指定的语言环境、字符串格式和参数生成一个格式化的新字符串。新字符串始终使用指定的语言环境。
语法:String.format(locale,format,args...) 。locale:指定的语言环境;format:字符串格式;args...:字符串格式中由格式说明符引用的参数。
(3)常用的日期格式化转换符
示例:
(4)时间格式化转换符
(5)常见的日期和时间组合的格式
(6)常规类型格式化
使用转换符,还可以配合转换符标识来控制输出的格式
6)方法
(1)部分方法
方法(返回值 方法名(参数列表)) | 作用 | 备注 |
---|---|---|
char charAt(int index) | 返回指定索引处的char值, 指数范围为0至length() - 1。 序列的第一个char值位于索引0 | |
int compareTo(String anotherString) | 按字典顺序比较两个字符串中每个字符的Unicode值。如果结果此String对象排在参数字符串之前,(小于参数)为负整数;反之(大于参数)为正整数;如果(等于参数)字符串相等,结果为零。 | 在某个索引处具有不同的字符,返回该位置字符差值(Unicode码差值);索引位置字符都一样,返回字符串长度的差值。 |
int compareToIgnoreCase(String str) | 同上,忽略大小写差异 | 在每个字符上先调用了Character的toUpperCase()再调用了Character.toLowerCase()消除了大小写差异。 |
boolean contains(CharSequence s) | 当且仅当此字符串包含指定的char值序列时,才返回true | |
boolean contentEquals(CharSequence cs)//参数还可是(StringBuffer sb) | 将此字符串与指定的CharSequence(StringBuffer)比较。 当且仅当此String表示与指定序列相同的char值序列时,结果为true | |
boolean equals(Object anObject) | 将此字符串与指定的对象进行比较。当且仅当参数不是null,且表示与此String对象相同的字符序列时,结果为true | |
boolean equalsIgnoreCase(String anotherString) | 同上,忽略大小写 | |
byte[] getBytes()//参数可为:空、(String charsetName) | 参数对应:使用(平台默认的/指定的)字符集将此String编码为字节序列,并将结果存储到新的字节数组中 | |
byte[] getBytes(Charset charset) | 使用给定的charset将此String编码为字节序列,将结果存储到新的字节数组中 | |
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将此字符串中的字符复制到目标字符数组中 | |
int hashCode() | 返回此字符串的哈希码 | |
int indexOf(参数列表) | 返回指定字符(字符串)第一次在字符串中出现的索引 | 参数可为:1.(int ch)//指定字符;2.(int ch,int fromIndex)//从指定索引开始搜索指定字符;3.(String str)//指定字符串;4.(String str,int fromIndex)//同2 |
int lastIndexOf(参数列表) | 返回指定字符(字符串)在此字符串中最后一次出现处的索引 | 参数可为:1.(int ch)//指定字符;2.(int ch,int fromIndex)//从指定索引反向搜索指定字符;3.(String str)//指定字符串;4.(String str,int fromIndex)//同2 |
String intern() | 返回字符串对象的规范化表示形式。如果字符串池已包含等于String对象的字符串,则返回池中的字符串。 否则,将此String对象添加到池中,并返回对此String对象的引用 | 对于任何两个字符串s和t,有s.intern() == t.intern()是true,当且仅当s.equals(t)为true;即与字符串具有相同内容的字符串,但保证来自唯一字符串池 |
boolean isBlank() | 如果字符串为空或仅包含 white space代码点,则返回 true,否则false | |
boolean isEmpty() | 判断字符串是否为空,为空返回true,否则返回false | |
boolean matches(String regex) | 告知此字符串是否匹配给定的正则表达式 | |
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) | 测试两个字符串区域是否相等。toffset为调用者的起始偏移量,ooffset为参数other的起始偏移量,len为要比较的字符数 | 第一个参数为true时忽略大小写;也可以没有第一个参数,但不忽略大小写 |
(2)替换
(3)拆分
(4)指定前缀后缀
(5)子序列(subxxxxx)
(6)将字符串转化(toxxxxx)
(7)去空格
(8)将参数转化为字符串(valueOf)
参考汇总
参考链接:
Java的String类:https://www.runoob.com/java/java-string.html
Java String常用构造方法:https://blog.csdn.net/weixin_43441790/article/details/100353368
Java String长度限制:https://blog.csdn.net/qq_36761831/article/details/99943600
Java String创建格式化字符串:https://www.cnblogs.com/mrxy/p/8041836.html
参考:Java 11 API