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
的字符。
拼接
与绝大多数语言一样,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"
在 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+0041
System.out.println(c1);
// 非BMP字符需要两个char表示(代理项)
String emoji = "
标签:讲清楚,返回,JAVA,String,int,这篇,码点,str,字符串
From: https://www.cnblogs.com/ivanlee717/p/18429920