JAVA的字符串这篇讲清楚了
JAVA_String从概念上讲,JAVA字符串就是Unicode序列。比方"Java\u2122"由5个UNICODE字符J,a,v,a和™组成。Java没有内置和字符串类型,而是试用java标准库中提供的一个预定义类,很自然地叫做了string。
子串substring
String subStr = str.substring(beginIndex);这里 beginIndex 指的是子字符串开始位置的索引(包括该位置的字符),结束位置是字符串的末尾。
String str = "hello";
System.out.println(str.substring(0,3)); //'hel'重载版本:
String subStr = str.substring(beginIndex, endIndex);在这个版本中,beginIndex 和 endIndex 分别指定了子字符串开始和结束的位置。留意 endIndex 不包含在子字符串内,即子字符串包含索引为 beginIndex 到 endIndex - 1 的字符。
https://img2023.cnblogs.com/blog/2862884/202409/2862884-20240924201245996-116764251.png
拼接
与绝大多数语言一样,Java答应使用+号连接两个字符串
String str = "ivanlee";
String str1 = "regina";
System.out.println(str+str1);//ivanleeregina当将一个字符串与一个非字符串的值进行拼接时,后者回转换成字符串,且任何一个java对象都可以转换成字符串。
String str = "ivanlee";
int no = 7;
System.out.println(str+no);//ivanlee7在java11当中,还提供了repeat方法
String str = "ivanlee".repeat(3);//ivanleeivanleeivanlee字符串不可变
String类没有提供任何方法来修改字符串的某个字符。如果希望将字符串内容修改,不能直接对字符串进行修改,只能对字符串进行读取和拼接,比如'ivanlee'把末了的ee改成aa只能是
String str = "ivanlee";
String newstr = str.substring(0,5) + "aa";如许不能修改字符串有一个很大的长处就是编译器可以让字符串共享。
想象各个字符串存放在一个公共存储池里,字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串和复制的字符串共享雷同的字符。
字符串相等
equals()和equalsIgnoreCase()函数分别比力区分大小写的字符串以及忽视大小写的字符串。
String str = "ivanlee";
String newstr = "iVanlee";
System.out.println(newstr.equals(str)); //false
System.out.println(str.equalsIgnoreCase(newstr)); //true不要使用运算符检测两个字符串,这个运算符只可以或许确定两个字符串是否存放在同一个位置。所以雷同的字符串副本可能会放在差别的位置上。如果虚拟机总是共享相等的字符串,则可以使用运算符检测字符串是否相等。但现实上只有字符串字面量会共享。而+大概substring等操作得到的字符串并不共享。因此,万万不要使用==来测试是否相等。
String s1 = "abc"; // 字符串字面量,s1 指向字符串池中的 "abc"
String s2 = "abc"; // s2 也指向字符串池中的 "abc",s1 == s2 返回 true
String s3 = new String("abc"); // 创建了一个新的对象,不在字符串池中
String s4 = "abc"; // s4 指向字符串池中的 "abc"
// s3 和 s4 内容相同,但不是同一个对象,因此 s3 == s4 返回 false
String s5 = "ab" + "c"; // 字符串连接,结果仍然会在字符串池中查找或创建 "abc"
String s6 = "abc"; // s6 指向字符串池中的 "abc"
// s5 和 s6 都指向字符串池中的 "abc",因此 s5 == s6 返回 true
String s7 = "abc".substring(0, 3); // 使用 substring 方法,结果不在字符串池中
String s8 = "abc"; // s8 指向字符串池中的 "abc"https://img2023.cnblogs.com/blog/2862884/202409/2862884-20240924201245052-1944911397.png
在 Java 8 及之前的版本中,substring 方法返回的字符串不会自动放入字符串池中,因此 s7 和 s8 尽管内容雷同,但它们不是同一个对象。因此 s7 == s8 将返回 false。从 Java 9 开始,JEP 282(String Concatenation Optimization)引入了优化,使得某些字符串操作(包括 substring 方法)的效果在某些情况下可能会被放入字符串池中,但这取决于 JVM 的实现细节。
码点和代码单元
在Java中,“码点”(code point)和“代码单元”(code unit)是与Unicode字符编码相关的术语。它们之间的关系主要表现在Java如何处理Unicode字符上。
码点指的是Unicode标准中定义的唯一标识符,用于唯一地标识一个字符。Unicode标准覆盖了所有的字符集,从ASCII到各种语言的笔墨符号,甚至到数学符号和表情符号。每一个字符都有一个唯一的码点,这个码点是一个整数值。Unicode码点范围从U+0000到U+10FFFF,共包含了凌驾110万个可能的字符。
代码单元是指在特定编码方案中表示一个字符所需的位数。在Java中,字符是以16位(两个字节)的Unicode代码单元存储的,这是因为Java的 char 类型是16位的无符号整数。
Java中的字符表示:
根本多文种平面(BMP)字符:这些字符的码点范围是从U+0000到U+FFFF,可以直接用一个 char 类型表示。Java中的大多数字符都属于这一类。
代理项(Surrogate Pairs):对于超出BMP范围的字符(即码点大于U+FFFF),需要使用一对代理项来表示。这对代理项由一个高位代理项(high surrogate)和一个低位代理项(low surrogate)组成,每个代理项也是一个 char 类型。
高位代理项的码点范围是U+D800到U+DBFF。
低位代理项的码点范围是U+DC00到U+DFFF。
// BMP字符可以直接用一个char表示char c1 = 'A'; // 码点 U+0041System.out.println(c1);// 非BMP字符需要两个char表示(代理项)String emoji = "
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]