JavaSE之String类

embedded/2024/10/19 22:58:21/

文章目录

  • 一、String类常用的构造方法
  • 二、常见的四种String对象的比较
    • 1.使用``==``比较
    • 2.使用``equals()``方法比较
    • 3.使用``compareTo()``方法比较
    • 4.使用``compareToIgnoreCase()``方法比较
  • 三、字符串的查找
  • 四、字符串的转化
    • 1.数字和字符串间的转化
    • 2.大小写转化
    • 3.字符串和数组间的转化
  • 五、字符串的替换
    • 1.replaceAll()
    • 2.replaceFirst()
  • 六、字符串的分割
  • 七、字符串的截取
  • 八、去除字符串中的左右空格
  • 九、字符串的不可变性
  • 十、StringBuilder和StringBuffer
  • 十一、String类OJ面试题

        在这里插入图片描述

                                           给个关注叭
      在这里插入图片描述

  个人主页

  JavaSE专栏

前言:本片文章主要整理了String类常用的一些方法、及StringBuilder 和 StringBuffer 的用法及区别

一、String类常用的构造方法

1.常量字符串构造

java">   String str = "abcd";

2.直接new String对象

java">   String str = new String("abcd");

3.使用字符数组构造

java">   char[] array = {'a','b','c','d'};String str = new String(array);

  在JDK8中,String 类的底层字符串使用字符数组(char[])来存储的;在JDK17中字符串使用字节数组(byte[])来存储的


【注意】几种字符串为空的情况

  1. 字符串长度为零,字符串为空
java">   String str = "";System.out.println(str.length);//0System.out.println(str.isEmpty());//true
  1. 字符串 str 为null,代表 str 引用不指向任何的对象
java">   String str = null;System.out.println(str.length);//空指针异常System.out.println(str.isEmpty());//空指针异常   

 这里再重复一下,关于 引用类型 容易搞混淆的知识点

  1. 一个引用不可以指向多个对象(只能指向一个对象)
  2. 引用不可以指向引用(这种说法是错误的),下面代码的解读是 str2引用 指向了 str1引用所指向的对象
java">   String str1 = new String("abc");String str2 = str1;
  1. 引用等于null,代表此时该引用不指向任何的对象
java">   String str = null;

二、常见的四种String对象的比较

1.使用==比较

  对于基本数据类型来说,使用==比较,比较的是变量中的数值是否相同;对于引用数据类型来说,使用==比较,比较的是 引用所指向的对象是否相同(引用所指向的地址是否相同)

java">   int a = 3;int b = 3;System.sout.println(a == b);//trueString str1 = "Hello";String str2 = "Hello";System.sout.println(str1 == str2);//falsestr1 = str2;System.sout.println(str1 == str2);//true

2.使用equals()方法比较

  equals()方法底层的比较规则是:先比较两个引用是否为同一个类型,然后比较两个引用所指向的是否为同一对象,最后比较字符串中的内容是否相同。返回值为true或false

java"> String str1 = new String("hello");Stirng str2 = new String("world");Stirng str3 = new String("hello");System.out.println(str1.equals(str2));//falseSystem.out.println(str1.equals(str3));//true 

3.使用compareTo()方法比较

  和equals()方法不同,compareTo()方法的返回值是 整型int. 返回值大于零,前者大于后者;返回值小于零,前者小于后者;返回值等于零,前者等于后者。compareTo()方法,字符串的大小 取决于 字符串中第一个不相等的字符 所比较的大小。str1和str2 比较,第一组不相等的字符就是 ‘a’ 和 ‘A’,所以整个字符串的大小 取决于 ‘a’ 和 ‘A’ 的大小。

java"> String str1 = new String("abcd");Stirng str2 = new String("Abcd");Stirng str3 = new String("abcd");System.out.println(str1.compareTo(str2));//  返回值大于零System.out.println(str1.compareTo(str3));//  返回值等于零System.out.println(str2.compareTo(str3));//  返回值小于零

4.使用compareToIgnoreCase()方法比较

此方法会忽略大小写

java"> String str1 = new String("abcd");Stirng str2 = new String("Abcd");System.out.println(str1.compareTo(str2));//  返回值等于零

三、字符串的查找

在这里插入图片描述

四、字符串的转化

1.数字和字符串间的转化

数字转字符串

java">String str1 = String.valueOf(1234);
String str2 = String.valueOf(1.234);

字符串转数字

java">int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");

2.大小写转化

java">String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());

【注意】这里的大小写转化,转化后,原来的字符串不会发生任何改变,调用方法后,会产生一个新的String对象,新的对象里面就会存放转化好的字符串


3.字符串和数组间的转化

java">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);

五、字符串的替换

1.replaceAll()

替换所有的指定字符

java">String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));

2.replaceFirst()

替换第一次出现的指定字符

java">String str = "helloworld" ;
System.out.println(str.replaceFirst("l","_"));

【注意】这里的大小写转化,转化后,原来的字符串不会发生任何改变,调用方法后,会产生一个新的String对象,新的对象里面就会存放转化好的字符串


六、字符串的分割

java">        String str1 = "name=zhangSan=age=12";String[] ret = str1.split("=");//以'='分割,分割后存放在字符串数组中System.out.println(Arrays.toString(ret));String[] ret2 = str1.split("=",3);//以'='分割,最多分三组System.out.println(Arrays.toString(ret2));

运行结果:
[name, zhangSan, age, 12]
[name, zhangSan, age=12]


几种特殊情况的分割

  1. 以字符 ‘.’ 分割,需要加上转义字符"\"。字符 “|”, “*”, “+” 都得加上转义字符,前面加上 “\\”
java">        String str1 = "192.168.34";String[] ret = str1.split("\\.");//以'.'分割,需要加上"\\"System.out.println(Arrays.toString(ret));

2.以字符 ‘\’ 分割,需要用 “\\\\”

java">        String str1 = "192\\123";String[] ret = str1.split("\\\\");//以'\'分割System.out.println(Arrays.toString(ret));

3.如果一个字符串中有多个分隔符,可以用"|"作为连字符

java">        String str1 = "name=zhangSan&age=10";String[] ret = str1.split("=|&");//以'=' 和 '&' 分割,中间加'|'System.out.println(Arrays.toString(ret));

七、字符串的截取

在这里插入图片描述

【注意】截取部分内容(下标区间内),下标区间为左闭右开区间—>[begin,end);
如果区间为[0,str.length()),那么返回的新的字符串对象还是原来的字符串对象


八、去除字符串中的左右空格

在这里插入图片描述
代码示例如下:

java">String str = "  hello world   ";
String ret = str.trim();
System.sout.printfln(ret);

运行结果:
hello world
前后都没有空格


九、字符串的不可变性


在这里插入图片描述
在这里插入图片描述

  通过观察 String 的源码,String 类被 final 修饰,表明这个String 类不能被继承;类中的数组 也被 final 修饰,说明这个数组不能指向新的对象,但是可以通过下标改变数组中的值,所以说 “字符串的不可变性就是因为 数组被final修饰了,里面的值才不能被改变这种说法是错误的.字符串的不可变性是因为,被 private 关键字修饰,在类外无法访问数组,进而无法改变字符串的内容。

十、StringBuilder和StringBuffer

如果想要修改字符串中的内容,可以使用String类 进行字符串的拼接,但是这种效率很低

java">String str = "Hello";
str += " world"
System.sout.printfln(str);

将上述代码反汇编:
在这里插入图片描述
观察反汇编之后的代码,上面三段语句就等效于以下代码:

java">StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Hello");
stringBuilder.append(" world");
String ret = stringBuilder.toString();

【注意】这种方法不推荐使用,这种方法效率非常低,因为中间创建了很多的临时对象


  由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。所以要对字符串进行修改,建议使用 StringBuilder 和 StringBuffer 类。这两个类大部分功能是相同的,以下是一些常用的方法:
在这里插入图片描述


面试题:String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操

StringBuffer属于线程安全操作,类似于在公共厕所,每次进去一个人,都会上锁,另外一个人就进不去,只有前面的人完成方便之后,厕所门锁才会开。

【注意】虽然使用StringBuffer 比较安全,但是也会造成系统资源的消耗,因此在单线程下使用StringBuilder;在多线程下使用StringBuffer。


十一、String类OJ面试题

  1. 字符串中的第一个唯一字符

  2. 字符串中最后一个单词的长度

  3. 检测字符串是否为回文串


http://www.ppmy.cn/embedded/128842.html

相关文章

docker 指令集

docker 操作命令汇集说明&#xff1a; 1.将运行中的Docker容器保存为镜像 docker commit <容器ID或名称> <镜像名称>:<标签> 例如 docker commit abc123 my_image:latest 2.将镜像保存为tar文件 docker save -o <tar文件名…

Android 11.0 系统默认蓝牙打开状态栏显示蓝牙图标功能实现

- 1.前言 在11.0的系统rom定制化开发过程中,在默认系统中,打开蓝牙开关的时候不会状态栏不会显示蓝牙图标,而只有 蓝牙连接成功后会显示蓝牙图标,客户开发需要要求在蓝牙打开的时候在状态栏就显示蓝牙图标,接下来分析下 相关的状态栏图标显示流程,然后实现相关功能 2.系…

3.3关节组件

&#xff08;1&#xff09;弹簧关节&#xff1a;模拟弹簧效果 &#xff08;2&#xff09;铰链关节&#xff1a;链条绑定&#xff0c;大于力矩&#xff0c;两个物体产生相互拉力 &#xff08;3&#xff09;固定关节&#xff1a;两个相对位置固定在一起 &#xff08;4&#xff09…

Element UI 组件库详解:从入门到精通

在追求统一且流畅的用户体验时&#xff0c;开发者们常常选择使用 UI 组件库来加快开发速度。Element UI&#xff0c;这个基于 Vue.js 的组件库&#xff0c;提供了大量界面组件&#xff0c;极大地提升了前端开发的效率。本文将指导您如何开始使用 Element UI 组件库&#xff0c;…

基于langchain.js快速搭建AI-Agent

基于langchain.js快速搭建AI-Agent 什么是AIAgent? 1. 替换默认请求地址为自定义API 构建基础会话大模型 import { ChatOpenAI } from langchain/openai;const chat new ChatOpenAI({model: gpt4o,temperature: 0,apiKey: ****,configuration: {baseURL: https://www.xx.co…

day 22 第六章 二叉树part07

二叉搜索树的最近公共祖先 利用二叉搜索树的特性。 题目链接/文章讲解&#xff1a;代码随想录 递归法 class Solution { private:TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q) {if (cur NULL) return cur;// 中if (cur->val > p->val &&am…

VBA技术资料MF211:重置右键菜单及子菜单

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

2024全国大数据与计算智能挑战赛火热报名中!

一年一度的 全国大数据与计算智能挑战赛震撼来袭&#xff01; 报名速通&#xff1a; https://www.datafountain.cn/special/BDSSF2024 大数据与决策&#xff08;国家级&#xff09;实验室连续三年组织发起全国大数据与计算智能挑战赛&#xff0c;旨在深入挖掘大数据应用实践中亟…