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

JavaSE之String类

文章目录

  • 一、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.常量字符串构造

   String str = "abcd";

2.直接new String对象

   String str = new String("abcd");

3.使用字符数组构造

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

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


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

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

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

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

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

1.使用==比较

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

   int a = 3;
   int b = 3;
   System.sout.println(a == b);//true
   
   String str1 = "Hello";
   String str2 = "Hello";
   System.sout.println(str1 == str2);//false
   
   str1 = str2;
   System.sout.println(str1 == str2);//true

2.使用equals()方法比较

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

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

3.使用compareTo()方法比较

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

 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()方法比较

此方法会忽略大小写

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

三、字符串的查找

在这里插入图片描述

四、字符串的转化

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

数字转字符串

String str1 = String.valueOf(1234);
String str2 = String.valueOf(1.234);

字符串转数字

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

2.大小写转化

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

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


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

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()

替换所有的指定字符

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

2.replaceFirst()

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

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

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


六、字符串的分割

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

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

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

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

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

七、字符串的截取

在这里插入图片描述

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


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

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

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

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


九、字符串的不可变性


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

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

十、StringBuilder和StringBuffer

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

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

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

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.kler.cn/news/356316.html

相关文章:

  • 将MySQL中按行记录的数据转换成按列记录
  • 【EJS】JavaScript 模板引擎
  • DC系列靶机-DC6
  • 深度学习代码学习笔记2
  • 超详细的Java Web开发
  • C++之《剑指offer》学习记录(3):拷贝构造函数
  • SpringBoot的Web项目Mybatis-plus多数据源
  • Python实现贪吃蛇大作战
  • 基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现
  • MYSQL OPTIMIZE TABLE 命令重建表和索引
  • CSS 居中那些事
  • YashanDB学习-数据库SQL基础操作
  • 【Linux】理解文件系统与软硬链接,观察inode号理解<“软链接是包含路径的新文件“,“硬链接是关于文件名的机制“>,最终明白<什么是真正删除一个文件>
  • 爱快路由器配置腾讯云动态域名DDNS详细说明
  • windows 10家庭版无法打开组策略的方法,亲测有效
  • Spring Cloud Alibaba 体系-组件-Sentinel
  • 电影评论系统:Spring Boot设计与实现
  • 宇宙汽车展览如何以创新性、个性化与便捷性,重塑汽车展示生态
  • 中仕公考:国考省考能一起备考吗?
  • 【博士每天一篇文献-算法】持续学习之GEM算法:Gradient Episodic Memory for Continual Learning