Java-String各种功能以及用法
String☯
- 前言
- ❤ 构造方法
- 🧡对象的比较
- 0️⃣compare和equals
- 1️⃣==的比较
- 💛字符串查找
- 💚转化
- 0️⃣数值和字符串转化
- 1️⃣大小写转换
- 3️⃣字符串和数组转化
- 4️⃣格式化
- 💙字符串拆分
- 0️⃣多次拆分
- 1️⃣按照空格拆分
- 2️⃣字符串部分拆分
- 💜字符串截取
- 0️⃣截取
- 1️⃣删除空格
- 🤎字符串的不可变性
- 🖤StringBuilder
- 0️⃣字符串逆置
- 1️⃣字符串拼接
- 2️⃣StringBuilder方法
- 3️⃣Builder和Buffer区别
- 🤍总结
前言
我们在C语言中已经学习了字符串的各种用法,在JAVA这种将数据和操作数据方法分离的方式不符合面向对象的思想,而字符串又很广泛,因此JAVA语言专门提供了String类。
❤ 构造方法
String提供的否早方法非常多,常用的就三种:
public static void main(String[] args) {
// 使用常量串构造
String s1 = "hello bit";
System.out.println(s1);
// 直接newString对象
String s2 = new String("hello bit");
System.out.println(s1);
// 使用字符数组进行构造
char[] array = {'h','e','l','l','o','b','i','t'};
String s3 = new String(array);
System.out.println(s1);
}
注意
下面这个代码可以看到
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("world");
String s3 = s1;
System.out.println(s1.length()); // 获取字符串长度---输出5
System.out.println(s1.isEmpty()); // 如果字符串长度为0,返回true,否则返回false
}
s1和s2引用的是不同对象 s1和s3引用的是同一对象
🧡对象的比较
0️⃣compare和equals
在JAVA中我们会对两个字符串进行比较
public static void main2(String[] args) {
String str1 = new String("Hello");
String str2 = new String("hello");
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareToIgnoreCase(str2));
System.out.println("=============");
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
}
我们来看看运行结果
总结
equals返回的是boolean类型,而compareTo返回的是int类型
第一种是比较两个字符串字母之间的差,加上IgnoreCase是忽略一些情况比如说大小写等进行比较。
第二种才是字符串之间的比较,相同则为真,相异则为假。
1️⃣==的比较
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
System.out.println(a == b); // false
System.out.println(a == c); // true
System.out.println("========================");
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1 == s2);
System.out.println(s2 == s3);
System.out.println(s1 == s4);
}
我们来看结果
总结
对于基本类型变量,==比较两个变量中存储的值是否相同
对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
💛字符串查找
字符串查找在JAVA中又很多中方法我们举部分例子
比如说:
public static void main(String[] args) {
String str1 = "hello";
char ch = str1.charAt(1);
System.out.println(ch);
}
我们来看结果
这里面charAt(1)查找的就是这个字符串位置为1的那个字符,和数组下标一样,很好理解
各大方法总结在表格中:
代码实验如下:
public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3));
System.out.println(s.indexOf('c'));
System.out.println(s.indexOf('c', 10));
System.out.println(s.indexOf("bbb"));
System.out.println(s.indexOf("bbb", 10));
System.out.println(s.lastIndexOf('c'));
System.out.println(s.lastIndexOf('c', 10));
System.out.println(s.lastIndexOf("bbb"));
System.out.println(s.lastIndexOf("bbb", 10));
}
运行结果:
💚转化
0️⃣数值和字符串转化
public static void main(String[] args) {
// 数字转字符串
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println("=================================");
// 字符串转数字
// 注意:Integer、Double等是Java中的包装类型,这个后面会讲到
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);
System.out.println(data2);
}
运行结果:
再简洁一些:
public static void main(String[] args) {
String str2 = String.valueOf(123);
System.out.println(str2);
String str1 = "234";
String str3 = "456";
int data = Integer.parseInt(str1);
double data2 = Double.parseDouble("678");
System.out.println(data2);
float data4 = Float.parseFloat(str1);
System.out.println(data);
}
这是不同类型之间的写法
1️⃣大小写转换
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());
}
运行结果:
3️⃣字符串和数组转化
public static void main(String[] args) {
String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
System.out.println("===================");
// 数组转字符串
String s2 = new String(ch);
System.out.println(s2);
}
4️⃣格式化
public static void main(String[] args) {
String s = String.format("%d-%d-%d", 2019, 9,14);
System.out.println(s);
}
💙字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。方法如下:
代码示例:
0️⃣多次拆分
public static void main5(String[] args) {
String str1 = "192\\168\\0\\1";
String str2 = "192&168=1";
String[] str = str2.split("&|=");
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}// 不同的符号用|来分割,这样实现两个符号分割字符串
String[] strs = str1.split("\\\\");
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}// 我们在分割的时候需要进行转译,转译的时候必须加两个斜杠也就是\\
}
1️⃣按照空格拆分
public static void main(String[] args) {
String str = "hello world hello x" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
}
运行结果:
2️⃣字符串部分拆分
public static void main(String[] args) {
String str = "hello world hello x";
String[] result = str.split(" ", 2);
for (String s : result) {
System.out.println(s);
}
}
总结
(1) 如果一个字符串中有多个分隔符,可以用"|“作为连字符.
(2) 我们在分割的时候需要进行转译,转译的时候必须加两个斜杠也就是\ \也就是说如果是 \ ,那么就得写成 \ \ \ \
(3) 字符”|“,”*“,”+"都得加上转义字符,前面加上 \ \ .
💜字符串截取
0️⃣截取
即将一个完整的字符串之中截取出部分内容
public static void main(String[] args) {
String str = "helloworld";
System.out.println(str.substring(5));
System.out.println(str.substring(0,5));
}
第一种是从某个位置开始截取后面所有的字符串,第二种是截取一个区间。运行结果如下:
1️⃣删除空格
public static void main(String[] args) {
String str = " heklo world ";
System.out.println(str);
String ret = str.trim();
System.out.println(ret);//消除空格,只能消除左右两个空格
}
结果:
总结
trim只能消除字符串开头和结尾的空白字符,中间的空格不能消除
🤎字符串的不可变性
我们刚刚说得对字符串的修改都是对新的对象进行操作,旧的字符串是不会变的,主要原因是双引号 “ ”内部是一个常量值,储存在堆上,我们举个例子画个图来理解:
我们分四步来分析:
(1)这段代码很显然str1 == str2 结果为false。
(2)所有双引号里面的字面值都会放在常量池里面,假设str1在常量值里面存储的位置是0x7;
(3)str2里面的abcd应当也存储在常量池里面,但是常量池里面已经有了,就不会再存储一份了。new一个假设是0x8;
(4)最后我们再比较str1和str2的时候比较的是0x7和0x8所以并不相等,所以是false
第二种代码我们看:
str1 == str3结果为true。
这是因为str3会分配一块内存,把常量值里面的地址给它,因此是true存的也是0x7。
总结
双引号引起来的值就存在字符串常量池当中,如果有,就不存储,直接返回字符串常量池的对象即可。
(1)字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
(2)final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。
🖤StringBuilder
0️⃣字符串逆置
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("abc");
System.out.println(stringBuilder);
stringBuilder.reverse();
System.out.println(stringBuilder);
}
这样我们可以直接实现字符串的逆置:
1️⃣字符串拼接
字符串的拼接需要创建一个StringBuilder的对象
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("abc");
System.out.println(stringBuilder);
stringBuilder.append("123").append(10);
stringBuilder.append(19.9);
System.out.println(stringBuilder);
此时不会缠身临时变量,所有的方法返回的都是this。因此String的内容不可修改,但是StingBuilder的内容可以修改
2️⃣StringBuilder方法
以下涵盖了所有StringBuilder的方法,具体用可以做为参考:
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
(1)String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
(2)StringBuilder变为String: 调用toString()方法。
即:
String ret = stringBuilder.toString();//将stringBuilder对象变成字符对象
这样就可以把对象变成String。
3️⃣Builder和Buffer区别
⭕StringBuffer与StringBuilder大部分功能是相似的
⭕StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。即多线程用StringBuffer更安全。
🤍总结
以上基本上就是有关String的全部内容了。各种用法以及佛那个功能的总结。希望可以和大家一起学习。最后希望🐏的在日康复。未来可期。
要奥奥不要利利: 写的挺好的呀
HysteriaD: 感谢大佬支持,向大佬学习
魚小飛: 详细好文 学习一波
嘿嘿嘿740: 大佬好棒
HysteriaD: 感谢支持