当前位置: 首页 > news >正文

【Java学习笔记】String类(重点)

String 类(重点

1. 基本介绍

2. 结构关系图

在这里插入图片描述

3. String 类的特点和缺点

(1)String 类 是保存字符串常量的,每次更新都要重新开辟空间,效率较低

(2)后续可以用StringBufferStringBuilder来增强 String 的功能,提高效率


一、String 对象的创建机制

1. 创建方式

2. 两种创建方式的区别重点理解!!!

(1)直接赋值

(2)调用构造器


3. 练习题

(1)第一题

String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); // T
System.out.println(a == b);      // T

代码分析

1. equals 方法被重写,比较的是内容是否相同

2. 使用直接赋值法,直接指向常量池的地址


(2)第二题

String a = new String("abc");
String b = new String("abc");
System.out.println(a.equals(b));  // T
System.out.println(a == b);       // F

代码分析

1. 字符串中重写了equals()方法,比较的是字符串内容是否相同

2. 两个都是new,是两个不同的对象,地址当然不 i 同


(3)第三题

知识点补充:intern()方法

当调用 intern() 方法时

总结:返回的是常量池的地址

String a = "hsp";  // a指向常量池的"hsp"
String b = new String("hsp");  // b指向堆中对象
System.out.println(a.equals(b));  // T
System.out.println(a == b);       // F
System.out.println(a == b.intern());  // T
System.out.println(b == b.intern());  // F

代码分析


(4)第四题

String s1 = "hspedu";  // 指向常量池 "hspedu"
String s2 = "java";    // 指向常量池 "java"
String s4 = "java";    // 指向常量池 "java"
String s3 = new String("java"); // 指向堆中对象 "java"
System.out.println(s2 == s3);  // F
System.out.println(s2 == s4);  // T
System.out.println(s2.equals(s3));  // T
System.out.println(s1 == s2);  // F

(5)第五题

Person p1 = new Person();
p1.name = "hspedu";
Person p2 = new Person();
p2.name = "hspedu";System.out.println(p1.name.equals(p2.name)); // 比较内容:True
System.out.println(p1.name == p2.name);      // T
System.out.println(p1.name == "hspedu");     // TString s1 = new String("bcde");
String s2 = new String("bcde");
System.out.println(s1 == s2); // False

=在这里插入图片描述


二、字符串的特性

1. 说明

2. “不可变“的底层原理分析

String str = "123";
str = "456";

注意:底层在常量池创建了两个对象

在这里插入图片描述

分析:(1)首先在常量池创建456对象(2)改变str指向的地址


3. 面试题练习

(1)第一题

String a = "hello" + "abc";

代码分析


(2)第二题

String a = "hello";
String b = "abc";
String c = a + b;

1. 代码分析:底层创建了三个对象

2. String c = a + b的执行过程分析(重点!!

3. 总结


(3)第三题(综合题

public class Test1 {String str = new String("hsp");final char[] ch = {'j', 'a', 'v', 'a'};public void change(String str, char[] ch) {str = "java";ch[0] = 'h';}public static void main(String[] args) {Test1 ex = new Test1();ex.change(ex.str, ex.ch);System.out.print(ex.str + " and ");System.out.println(ex.ch);}
}// 输出结果
hsp and hava

在这里插入图片描述


三、String 类 的常见方法

要求:会用即可,无需死记硬背,需要用的时候直接查 API 文档即可

方法描述
equals区分大小写,判断内容是否相等
equalsIgnoreCase忽略大小写的判断内容是否相等
length获取字符串的个数,字符串的长度
indexOf获取字符串在字符串中第 1 次出现的索引,索引从 0 开始,如果找不到,返回 -1
lastIndexOf获取字符串在字符串中最后 1 次出现的索引,索引从 0 开始,如找不到,返回 -1
substring截取指定范围的子串(传入下标区间左闭右开
trim去前后空格
charAt获取某索引处的字符,注意不能使用 Str[index] 这种方式
toUpperCase全部转换为大写字母
toLowerCase全部转换为小写字母
concat拼接字符串中的字符
replace替换字符串中全部要被替换的字符(传参:被替换的字符串替换的字符串
split分割字符串,对于某些分割符,我们需要转义如 \\
compareTo比较两个字符串的大小 (区别三种情况的比较方式
toCharArray转换成字符串数组
format格式化字符串,%s 字符串 %c 字符 %d 整型 %.2f 浮点型

代码示例

public class StringMethodsExample {public static void main(String[] args) {// equals: 区分大小写,判断内容是否相等String a = "hello";String b = "Hello";System.out.println(a.equals(b));  // false// equalsIgnoreCase: 忽略大小写的判断内容是否相等System.out.println(a.equalsIgnoreCase(b));  // true// length: 获取字符串的个数,字符串的长度System.out.println("Length of 'hello': " + a.length());  // 5// indexOf: 获取字符串中第1次出现的索引String c = "hello world";System.out.println(c.indexOf('l'));  // 2// lastIndexOf: 获取字符串中最后1次出现的索引System.out.println(c.lastIndexOf('l'));  // 3// substring: 截取指定范围的子串System.out.println(c.substring(0, 5));  // hello// trim: 去前后空格String d = "   hello world   ";System.out.println(d.trim());  // "hello world"// charAt: 获取某索引处的字符System.out.println(c.charAt(0));  // h// toUpperCase: 转换为大写字母System.out.println(c.toUpperCase());  // HELLO WORLD// toLowerCase: 转换为小写字母System.out.println(c.toLowerCase());  // hello world// concat: 拼接字符串中的字符String e = "hello";String f = " world";System.out.println(e.concat(f));  // hello world// replace: 替换字符串中的字符System.out.println(c.replace('l', 'p'));  // heppo word// split: 分割字符串String g = "apple,banana,grape";String[] fruits = g.split(",");for (String fruit : fruits) {System.out.println(fruit + " ");/*apple banana grape*/}// compareTo: 比较两个字符串的大小String h = "apple";String i = "banana";System.out.println(h.compareTo(i));  // -1 (apple < banana)// toCharArray: 转换成字符串数组char[] chars = h.toCharArray();for (char ch : chars) {System.out.println(ch);/*apple*/}// format: 格式化字符串String name = "John";int age = 30;System.out.println(String.format("My name is %s and I'm %d years old.", name, age));  // My name is John and I'm 30 years old.}
}

个别方法的说明

(1)equalsIgnoreCase方法

String str = "i am learning java";
String str1 = "I AM LEARNING JAVA";
System.out.println(str.equalsIgnoreCase(str1));// 输出:true

忽略大小写,比较内容是否相同

(2)concat方法

String str = "I";
System.out.println(str.concat(" am").concat(" learning").concat(" java"));
// 输出:I am learning javaString str1 = "I am learning";
String str2 = " java";
String str3 = "!!!";
System.out.println(str1.concat(str2).concat(str3));
// 输出:I am learning java!!!

(3)replace方法

String str = "jackson未来要走java后端,所以他正在学java";
System.out.println(str.replace("java","C++"));
// 输出:jackson未来要走C++后端,所以他正在学C++String str1 = "我在学java";
String str2 = "C语言";
System.out.println(str1.replace("java",str2));
// 输出;我在学C语言

易错!替换对本身无影响,返回的结果才是被替换的

(4)split方法

String str = "千里之行,始于足下";
String[] split_result = str.split(",");
for (int i = 0; i < split_result.length; i++) {System.out.println(split_result[i]);
}
// 输出结果
千里之行
始于足下String str = "C:\\aaa\\bbb";
String[] split_reuslt = str.split("\\\\");
for (int i = 0; i < split_reuslt.length; i++) {System.out.println(split_reuslt[i]);
}
// 输出结果
C:
aaa
bbb

说明:遇到特殊字符需要加转义符 “\”

(5)compareTo方法

情况一

String str1 = "java";
String str2 = "java";
System.out.println(str1.compareTo(str2));// 输出结果
0

说明:长度、内容相同返回0

情况二

String str1 = "javahahaha";
String str2 = "haha";
System.out.println(str1.compareTo(str2));// 输出结果:2

说明:jh在字母表中的顺序相差2

情况三

String str1 = "javaha";
String str2 = "java";
System.out.println(str1.compareTo(str2));// 输出结果
2

说明:多了两个字符ha

(6)format方法

1. 使用方法:String.format(字符串,常量...)

System.out.println(String.format("%s今年%d岁了,正在学Java,未来打算走Java后端开发,期望薪资为%.1f","jackson",18,20000.55));// 输出结果
jackson今年18岁了,正在学Java,未来打算走Java后端开发,期望薪资为20000.6

注意:使用%f占位符时会自动四舍五入

2. 格式化时也可以传变量

String name = "jackson";
int age = 18;
double salary = 20000.55;
System.out.println(String.format("%s今年%d岁了,正在学Java,未来打算走Java后端开发,期望薪资为%.1f",name,age,salary));// 输出结果
jackson今年18岁了,正在学Java,未来打算走Java后端开发,期望薪资为20000.6

相关文章:

  • 从零开始搭建 Pytest 测试框架(Python 3.8 + PyCharm 版)
  • Android Studio 解决首次安装时下载 Gradle 慢问题
  • 【数据分析】探索婴儿年龄变化对微生物群落(呼吸道病毒和细菌病原体)结构的影响
  • 使用 C/C++ 和 OpenCV 提取图像的感兴趣区域 (ROI)
  • 游戏(game)
  • Mybatis-Plus的LambdaWrapper
  • Python_day47
  • 华为云Flexus+DeepSeek征文 | 从零到一:用Flexus云服务打造低延迟联网搜索Agent
  • Python入门手册:异常处理
  • 微前端 - Native Federation使用完整示例
  • JavaWeb的一些基础技术
  • Jenkins持续集成CI,持续部署CD,Allure报告集成以及发送电子 邮件
  • 前沿论文汇总(机器学习/深度学习/大模型/搜广推/自然语言处理)
  • EPPLUS——CAD c#读写EXCEL的第三方库
  • wpf ListBox 去除item 单击样式
  • Docker容器部署elasticsearch8.*与Kibana8.*版本使用filebeat采集日志
  • 使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件
  • 数据库(sqlite)基本操作
  • 【QT】输入类控件 详解
  • QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧
  • 福州网站制作建设/易搜搜索引擎
  • hois.skxy.wordpress/seo分析案例
  • 网站怎么做图片动态图片不显示/优化大师网页版
  • 网站导航网站建设多少钱/网络推广app是违法的吗
  • 怎样做同性恋女视频网站/百度电话客服24小时人工
  • 丰台住房和城乡建设委员会网站/产品软文范例100字