Java技术之字符串
Java字符串就是Unicode字符序列
子串
public class Note {
public static void main(String[] args) {
//substring方法可以从一个较大的字符串提取出一个子串
String greeting = "Hello";
System.out.println(greeting.substring(0, 3));
//输出结果
//Hel
//substring方法第二个参数是指不包含的位置,也就是,0,1,2但不包括3,所以输出结果是"Hel"
//换个方式表达就是数学中的前开后闭区间 即 [a,b)
}
}
拼接
public class Note {
public static void main(String[] args) {
//可以使用"+"拼接字符串
String expletive = "Expletive";
String PC13 = "deleted";
String message = expletive + PC13;
System.out.println(message);
//输出结果
//Expletivedeleted
//任何一个Java对象都可以转换为字符串
int age = 13;
String rating = "PC" + age;
System.out.println(rating);
//输出结果
//PC13
//可以使用定界符,注意jdk1.8版本以上支持String.join
String all = String.join(" / ", "S", "M", "L", "XL"); // all is the string "S / H / L / XL"
System.out.println(all);
//输出结果
//S / M / L / XL
}
}
不可变字符串
public class Note {
public static void main(String[] args) {
//字符串的内容无法修改,但能重新赋值
String greeting = "Hello";//定义后,值无法修改,可以截取重新赋值,也可以直接重新赋值//
greeting = "Howdy";//Java回收机制会垃圾回收掉之前的值,不必担心内存遗漏
System.out.println(greeting);
//输出结果
//Howdy
}
}
检测字符串是否相等
public class Note {
public static void main(String[] args) {
//equals是常用检测字符串是否一致,而==会判断是否同一位置上,尽量不要使用这个去判断,通过+等都会影响位置,避免间歇性错误
String hello = "Hello";
String howdy = "Howdy";
String hello2 = "hello";
System.out.println(hello.equals(howdy));
System.out.println(hello.equals(hello2));//值是否相等,但区分大小写
System.out.println(hello.equalsIgnoreCase(hello2));//值是否相等,但不区分大小写
//输出结果
//false
//false
//true
}
}
空串与NUll串
public class Note {
public static void main(String[] args) {
//空串是长度为0的字符串,即 "" 是一个Java对象,长度为0和内容为空
String hello = "Hello";
String hello2 = "";
System.out.println(hello.length() == 0);//值是否是空串
System.out.println(hello2.length() == 0);//值是否是空串
//输出结果
//false
//true
//null表名没有任何对象与该变量关联
hello = "Hello";
hello2 = "";
System.out.println(hello == null);//值是否是null
System.out.println(hello.length() != 0 && hello != null);//值不是空串也不是null
//输出结果
//false
//true
}
}
码点与代码单元
public class Note {
public static void main(String[] args) {
//Java字符串由char值序列组成
//char数据类型由UTF-16编码表示Unicode的代码单元
//大多数的常用Unicode字符使用一个代码单元就可以表示
//辅助字符需要一对代码单元表示
//length方法将放回采用UTF-16编码表示的给定字符串所需要的代码单元数量
String greeting = "Hello";
int n = greeting.length();
System.out.println(n);
//输出结果
//5
//码点数量
int cpCount = greeting.codePointCount(0, greeting.length());
System.out.println(cpCount);
//输出结果
//5
//charAt(n)将返回位置n的代码单元,n介于0~length()-1之间
char first = greeting.charAt(0);
char last = greeting.charAt(4);
System.out.println(first);
System.out.println(last);
//输出结果
//H
//o
//得到第i个码点
int index = greeting.offsetByCodePoints(0, 3);
int cp = greeting.codePointAt(index);
System.out.println(index);
System.out.println(cp);
//输出结果
//3
//108
//代码单元和码点从0开始计数
String sentence = "? is set of octonions";
char ch = sentence.charAt(1);
System.out.println(ch);
//返回结果
//? 返回了?的第二个代码单元,而不是空格
//为了避免上面的问题,应当如下遍历字符串,从而得到?的16位表示为0x1d546
for (int i = 0; i < sentence.length(); i++) {
int codePointAt = sentence.codePointAt(i);
if (Character.isSupplementaryCodePoint(codePointAt)) {
System.out.println(Integer.toHexString(codePointAt));
} else {
System.out.println(Integer.toHexString(codePointAt));
}
}
//输出结果
// 1d546
// dd46
// 20
// 69
// 73
// 20
// 73
// 65
// 74
// 20
// 6f
// 66
// 20
// 6f
// 63
// 74
// 6f
// 6e
// 69
// 6f
// 6e
// 73
//十六位转字符串,即可知𝕆是辅助字符
char[] chars = Character.toChars(0x1d546);
String str = new String(chars,0,chars.length);
System.out.println(str);
//输出结果
//𝕆
//以下codePoints方法返回一个流也可以遍历,需要jdk1.8及其以上支持
int[] stream = sentence.codePoints().toArray();
for (int s : stream) {
System.out.println(Integer.toHexString(s));
}
}
}
构建字符串
public class Note {
public static void main(String[] args) {
//使用构建的方式更加方便和灵活
StringBuilder builder = new StringBuilder();
//当每次需要添加一部分内容时, 就调用 append 方法。
builder.append("1"); // appends a single character
builder.append("23"); // appends a string
System.out.println(builder.toString());
//输出结果
//123
}
}