String类-equals和==的区别-遍历-SubString()-StringBuilder-StringJoiner-打乱字符串

news/2024/12/22 13:55:20/
概述

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

特点
  • 字符串不可变,它们的值在创建后不能被更改

  • 虽然 String 的值是不可变的,但是它们可以被共享

  • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

常用的构造方法

方法名说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(byte[] bys)根据字节数组的内容,来创建字符串对象
String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc

public class StringTest {public static void main(String[] args) {//public String():创建一个空白字符串对象,不含有任何内容String s1 = new String();System.out.println("s1:" + s1);//public String(char[] chs):根据字符数组的内容,来创建字符串对象char[] chs = {'a', 'b', 'c'};String s2 = new String(chs);System.out.println("s2:" + s2);//public String(byte[] bys):根据字节数组的内容,来创建字符串对象byte[] bys = {97, 98, 99};String s3 = new String(bys);System.out.println("s3:" + s3);//String s = “abc”;	直接赋值的方式创建字符串对象,内容就是abcString s4 = "abc";System.out.println("s4:" + s4);}
}
创建字符串对象两种方式的区别
  • 通过构造方法创建

通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同

  • 直接赋值方式创建

    以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

==号比较的到底是什么

基本数据类型 具体数据值

int a = 10;
int b = 20;
System.out.println(a == b) //false

引用数据类型 地址值

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2) //false
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2) //true
equals方法的作用

equals()只能作用在引用数据类型,无法作用在基本数据类型

equals()方法在不重写的情况下调用的是"=="也就是比较两个对象的地址值是否一致,但是很多类(如String, Integer等)都重写了equals方法,以便按照对象的内容而不是内存地址进行比较。例如,对于String类,"equals"方法会比较两个字符串中的字符是否完全相同。如果重写后具体对比的含义根据重写规则而定

方法介绍

public boolean equals(String s)     比较两个字符串内容是否相同、区分大小写
public class StringTest1 {public static void main(String[] args) {//构造方法的方式得到对象char[] chs = {'a', 'b', 'c'};String s1 = new String(chs);String s2 = new String(chs);//直接赋值的方式得到对象String s3 = "abc";String s4 = "abc";//比较字符串对象地址是否相同System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s3 == s4);System.out.println("--------");//比较字符串内容是否相同System.out.println(s1.equals(s2));System.out.println(s1.equals(s3));System.out.println(s3.equals(s4));}
}//结果
false
false
true
--------
true
true
true

遍历字符串

public class StringTest2 {public static void main(String[] args) {//输入字符串并打印Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();//遍历for(int i = 0; i < str.length(); i++){//i 依次表示字符串的每一个索引char c = str.charAt(i);System.out.println(c);}}
}
subString()

截取

String subString(int beginIndex,int endIndex)

包头不包尾,包左不包右.

只有返回值才是截取的小串

截取到末尾

String subString(int beginIndex)

注意点:只有返回值才是替换之后的结果

StringBuilder

StringBuilder可以看成是一个容器,创建后里面的内容是可变的

当我们在拼接字符串和反转字符串的时候会使用到

常用方法
append()

public StringBuilder append(任意类型)

reverse()

public StringBuilder reverse()

length()

public int length()

toString()

public String toString()

public class StringBuilderTest {public static void main(String[] args) {//1.创建对象StringBuilder sb = new StringBuilder("abc");//2.添加元素sb.append(1);sb.append(2.3);sb.append(true);//反转sb.reverse();//获取长度int len = sb.length();System.out.println(len);//打印//普及://因为StringBuilder是Java已经写好的类//java在底层对他做了一些特殊处理。//打印对象不是地址值而是属性值。System.out.println(sb);}
}
StringJoiner
  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。

  • 作用:提高字符串的操作效率,代码编写简洁
  • JDK8出现的

基本使用:

//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印
System.out.println(sj);//[aaa, bbb, ccc]
String str = sj.toString();
字符串拼接的底层原理

如果没有变量参与,都是字符串直接相加,编译后就是拼接之后的结果,会复用串池中的字符串

如果有变量参与,每一行拼接的代码,都是在内存中创建新的字符串,浪费内存

public class StringTest3 {public static void main(String[] args) {String s1 = "abc";//记录串池中的地址值String s2 = "a"+"b"+"c";//复用串池中的字符串System.out.println(s1 == s2);//true}
}
//在编译的时候,会将"a"+"b"+"c"拼接成"abc"
打乱字符串
public class test7 {public static void main(String[] args) {//键盘输入任意字符串,打乱里面的内容//1.键盘输入任意字符串String str = "abcdefg";//2.打乱里面的内容//修改字符串里面的内容://1.subString       //2.变成字符数组char[] arr = str.toCharArray();//['a','b','c','d','e','f','g']//3.打乱数组里面的内容//从0索引开始,跟一个随机索引进行位置的交换//当数组里面的每一个元素都跟一个随机索引进行交换完毕之后,那么内容就打乱了Random r = new Random();for (int i = 0; i < arr.length; i++) {int randomIndex = r.nextInt(arr.length);//拿着随机索引指向的元素,跟i指向的元素进行交换char temp = arr[i];arr[i] = arr[randomIndex];arr[randomIndex] = temp;}//4.把字符数组再变回字符串String result = new String(arr);System.out.println(result);}
}


http://www.ppmy.cn/news/1364608.html

相关文章

虹科Workshop丨2月29日与南高齿开展风电齿轮箱技术交流会,共拓风电行业未来!

来源&#xff1a;虹科环境监测技术 虹科Workshop丨2月29日与南高齿开展风电齿轮箱技术交流会&#xff0c;共拓风电行业未来&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/R9ESM4Yv0py7n3CdD22_Qg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #风…

LeetCode 2120.执行所有后缀指令

现有一个 n x n 大小的网格&#xff0c;左上角单元格坐标 (0, 0) &#xff0c;右下角单元格坐标 (n - 1, n - 1) 。给你整数 n 和一个整数数组 startPos &#xff0c;其中 startPos [startrow, startcol] 表示机器人最开始在坐标为 (startrow, startcol) 的单元格上。 另给你…

正则表达式常见的应用场景

数据格式验证&#xff1a;正则表达式可以用来验证输入数据的格式是否符合要求。例如&#xff0c;可以使用正则表达式验证一个邮箱地址是否符合邮箱的格式规范&#xff0c;或者验证一个手机号码是否符合手机号码的格式规范。这在开发网站、手机应用程序等需要用户输入数据的场景…

07_html

文章目录 引言前端概述分类 HTML快速入门重要的body标签注释hr标签br标签一些常见的标签标题标签div标签span标签p标签a标签img标签路径问题 ol和ul标签table标签input标签&#xff08;表单元素&#xff09;textarea标签&#xff08;表单元素&#xff09;select标签&#xff08…

Mysql 的高可用详解

Mysql 高可用 复制 复制是解决系统高可用的常见手段。其思路就是&#xff1a;不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主…

spark stream:从Kafka中读取数据

一、添加依赖 ThisBuild / version : "0.1.0-SNAPSHOT"ThisBuild / scalaVersion : "2.12.12" libraryDependencies Seq( "org.apache.spark" % "spark-core_2.12" % "3.0.0") libraryDependencies Seq( "org.apach…

Bootloader开发

Bootloader开发 Bootloader开发目标 1) 要求Bootloader程序在升级过程中不被擦除,保证即使升级失败也能进入下次升级流程; 2) 上电后先进入Bootloader程序,在程序接收并存储完毕后进入main()函数; 3) 要求Bootloader程序可以作为CCS应用程序工程的一部分,而不需要将B…

Maven编译报processing instruction can not have PITarget with reserveld xml name

在java项目中&#xff0c;平时我们会执行mvn clean package命令来编译我们的java项目&#xff0c;可是博主今天执行编译时突然报了 processing instruction can not have PITarget with reserveld xml name 这个错&#xff0c;网上也说法不一&#xff0c;但是绝大绝大部分是因…