作者简介: zoro-1,目前大二,正在学习Java,数据结构等
作者主页: zoro-1的主页
欢迎大家点赞收藏 ⭐ 加关注哦!
Java之String类
- String的构造
- String底层
- 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);}
String底层
String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类实例变量如下
public static void main(String[] args) {// s1和s2引用的是不同对象 s1和s3引用的是同一对象String s1 = new String("hello");String s2 = new String("world");String s3 = s1;System.out.println(s1.length()); // 获取字符串长度---输出5System.out.println(s1.isEmpty());// 如果字符串长度为0,返回true,否则返回false}
String之间的比较
比较内容
以下是一个例子,比较两个字符串变量的内容是否相等:
str1 = "hello"str2 = "world"if str1 == str2:print("The strings are equal.")else:print("The strings are not equal.")
输出结果为:
The strings are not equal.
这是因为str1
变量包含的字符串与str2
变量包含的字符串不同,因此它们的内容不相等。以下是一个例子,比较两个字符串变量的内容是否相等:
str1 = "hello"str2 = "world"if str1 == str2:print("The strings are equal.")else:print("The strings are not equal.")
输出结果为:
The strings are not equal.
这是因为str1
变量包含的字符串与str2
变量包含的字符串不同,因此它们的内容不相等。以下是一个例子,比较两个字符串变量的内容是否相等:
str1 = "hello"str2 = "world"if str1 == str2:print("The strings are equal.")else:print("The strings are not equal.")
输出结果为:
The strings are not equal.
这是因为str1
变量包含的字符串与str2
变量包含的字符串不同,因此它们的内容不相等。
比较地址
假设有两个String对象,分别为str1和str2,它们的值都为”Hello”。
当我们使用”==”运算符比较这两个字符串时,实际上比较的是它们在内存中的地址。
例如:
String str1 = "Hello";String str2 = "Hello";if (str1 == str2) {System.out.println("str1和str2的地址相同");} else {System.out.println("str1和str2的地址不同");}
输出结果为”str1和str2的地址相同”,因为在Java中,如果两个字符串的值相同,则它们会被存储在同一个字符串常量池中,因此它们的地址是相同的。但是,如果我们使用new关键字创建字符串对象,则它们的地址是不同的,例如:
String str1 = new String("Hello");String str2 = new String("Hello");if (str1 == str2) {System.out.println("str1和str2的地址相同");} else {System.out.println("str1和str2的地址不同");}
输出结果为”str1和str2的地址不同”,因为每个字符串对象都有自己的地址空间,它们并不指向同一个地址。
字符串查找相关方法
代码演示
String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3)); //'bSystem.out.println(s.indexOf('c')); // 6System.out.println(s.indexOf('c', 10));// 15System.out.println(s.indexOf("bbb")); //3System.out.println(s.indexOf("bbb", 10)); // 12System.out.println(s.lastIndexOf('c'));// 17System.out.println(s.lastIndexOf('c', 10)); // 8System.out.println(s.lastIndexOf("bbb"));// 12System.out.println(s.lastIndexOf("bbb", 10)); // 3
代码执行结果:
字符串转化
数值类和字符串转化
public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3)); // 'b'System.out.println(s.indexOf('c'));// 6System.out.println(s.indexOf('c', 10));// 15System.out.println(s.indexOf("bbb"));// 3System.out.println(s.indexOf("bbb", 10));// 12System.out.println(s.lastIndexOf('c'));// 17System.out.println(s.lastIndexOf('c', 10));// 8System.out.println(s.lastIndexOf("bbb"));// 12System.out.println(s.lastIndexOf("bbb", 10));// 3public static void main(String[] args) {// 数字转字符串String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);String s3 = String.valueOf(true);String s4 = String.valueOf(new Student("Hanmeimei", 18));System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4); 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 s1 = "hello";String s2 = "HELLO";// 小写转大写System.out.println(s1.toUpperCase());// 大写转小写System.out.println(s2.toLowerCase()); }
字符串转数组
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();// 数组转字符串 String s2 = new String(ch); System.out.println(s2); }
字符串格式化
public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9,14);System.out.println(s); }
字符串替换
代码演示:
public class Demo {public static void main(String[] args) {String str="abca";System.out.println(str.replaceAll("a","b"));System.out.println(str.replaceFirst("a","b"));}}
代码运行结果:
字符串拆分
代码演示:
public class Demo {public static void main(String[] args) { String str="aa aa bb"; String[] strs=str.split(" "); for(int i=0;i<strs.length;i++){ System.out.println(strs[i]); }}}
运行结果:
字符串截取
代码演示:
public class Demo {public static void main(String[] args) { String str="aaaabb";System.out.println(str.substring(5));System.out.println(str.substring(2,5));}}
代码运行结果:
字符串的其他操作方法
public class Demo {public static void main(String[] args) { String str=" aaaabb ";System.out.println(str.trim());}}
public class Demo {public static void main(String[] args) {//这两个方法只针对字符串中的字母String str = "hello%$$%@#$%world 哈哈哈 " ;System.out.println(str.toUpperCase());System.out.println(str.toLowerCase());}}
重点:为什么字符串是不可变的
字符串的中的字符实际上存储在value数组中,大多数认为是因为final修饰了value数组,实际上final修饰的数组是说明这个数组不能指向其他引用,但其中的值是可以改变的,fianl修饰的String类说明这个类不能被继承
字符串的修改
注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。
public static void main(String[] args) {String s = "hello";s += " world";System.out.println(s);// 输出:hello world}
可以看待在对String类进行修改时,效率是非常慢的,因此:尽量避免对String的直接需要,如果要修改建议尽量使用StringBuffer或StringBuilder。
今天的介绍到这里就结束了下一篇我会介绍StringBuffer和StringBuilder的区别,,希望大家支持一下