Java字符串String相关类常用方法详解

 更新时间:2025年02月19日 08:31:29   作者:NiKo_sx  
这篇文章主要介绍了Java中的字符串数据类型,包括字符串的创建、拼接、比较和常用方法,还介绍了StringBuilder和StringJoiner类的定义和使用,以及它们在内存中的管理方式,需要的朋友可以参考下

 一、String

1.Java中的数据类型

在Java中数据类型被分为基本数据类型引用数据类型

  • 基本数据类型:数值存储在自己的空间而不是堆内存或其他的空间中,如int、float、double、boolean等
  • 引用数据类型:数值存储在其他的空间,本身的空间存储的是地址值,如数组、创建的对象、字符串等。

在本节中,我们将介绍的字符串就是一种引用数据类型。

2.字符串概述

a.在Java中所有字符串的定义都在java.lang.String中,在使用String定义字符串时应先导包。       

//导包
java.lang.String;

//定义
String s = "abcdef";

b.字符串参与的所有运算都属于字符串的拼接操作。由于字符串的内容自创建之后就不能改变,所以每次执行字符串的拼接操作时都会在内存中重新申请空间储存拼接后的字符串。

String s1 = "abc";
String s2 = "123";
System.out.println(s1+s2);//执行结果:abc123

在执行上面的代码时一共产生了三个字符串,分别是s1("abc")、s2("123")以及拼接后新产生的字符串"abc123"。       

String s1 = "abc";
s1="三连+关注";
System.out.println(s1);//执行结果:三连+关注

c.字符串的值被创建后是无法改变的,因此在执行上面的代码时并没有改变"abc"里原本的内容,而是创建了一个新的字符串"三连+关注"并重新赋值给了s1。

d.对于没有变量参与的字符串拼接操作是不同于有变量参与的拼接操作的。

  • 如果没有变量参与,系统会检查串池,如果串池中有该字符串,直接复用,没有再开辟新的内存空间。
  • 如果有变量参与,每一行代码都会创建新的字符串。

3.字符串构造方法

a.直接定义

String s1 = "abc";
System.out.println(s1);//执行结果:abc

b.通过new关键字获取一个空字符串

String s1 = new String();
System.out.println("!"+s1+"!");//执行结果:!!

c.传递一个字符串,根据传递的字符串再构造一个新的字符串

String s1 = new String("abc");
System.out.println(s1);//执行结果:abc

d.传递一个字符数组,根据字符数组的内容构造新的字符串

char[] ch = {'a','b','c'};
String s1 = new String(ch);
System.out.println(s1);//执行结果:abc

e.传递一个字节数组,根据字节数组的内容构造新的字符串

byte[] by = {97,98,'c'};
String s1 = new String(by);
System.out.println(s1);//执行结果:abc

在字节数组中,97和98不再代表整形,而是ASCII码表中码值为97、98的符号,即a、b。

4.字符串构造内存原理

在Java中内存主要被分为栈、堆、方法区三部分(如下图)。

  • 栈:主要存储方法,方法开始执行时进栈,结束执时出栈。
  • 堆:存储对象或数组,使用new关键字时是在堆内存中开辟了空间。从键盘获取的字符串也是存储在堆中。
  • 方法区:存储可执行的class文件。

在堆内存中,有一块被称作串池(String Table)的内存空间,它是专门用来存储字符串的内存空间。

如果选择直接赋值(参考2.a)的形式构造字符串,系统会在串池中检查,如果两个字符串的内容完全相同,则直接服用已经构造好的字符串,而不会重新开辟空间存储,减少了空间浪费。

String s2 = "abc";
String s1 = "abc";//s1和s2中地址值是一样的

而如果使用new关键字构造,系统不会检查串池并直接在堆空间中开辟内存。

String s2 = new String("abc");
String s1 = new String("abc");//使用new关键字构造的字符串地址不同

5.字符串比较

a.如果直接用==符号比较,可能并不能反馈正确的结果。由String定义的字符串是一种引用数据类型,在String创建的对象本身的空间中存储的是地址值,而不是数据,==符号比较的是对象本身内存中的数据,因此可能会输出错误的结果。

Scanner sc = new Scanner(System.in);//在键盘上输入"abc",输入的数据是存储在堆内存中的
String s1 = sc.next();
String s2 = "abc";
System.out.println(s1==s2);//执行结果:false

b.比较两个字符串内容是否相同可以使用String类中的equals方法。

Scanner sc = new Scanner(System.in);//输入"abc"
String s1 = sc.next();
String s2 = "abc";
boolean res = s1.equals(s2);//equals的返回值是boolean类型
System.out.println(res);//执行结果:true

c.比较两个字符串内容是否相同且忽略大小写,使用String类中的equalsIgnoreCase方法。此处的忽略大小写只针对于英文字母而不针对于中文(如"1"和"一")。

Scanner sc = new Scanner(System.in);//输入"abc"
String s1 = sc.next();
String s2 = "Abc";
boolean res = s1.equalsIgnoreCase(s2);
System.out.println(res);//执行结果:true

6.字符串常见方法

  • public char charAt(int index);
  • 根据索引(索引下标从0开始)返回字符。
String s1 = "abcde";
char ch = s1.charAt(0);
System.out.println(ch);//执行结果:a
  • public int length();
  • 返回字符串的长度。
String s1 = "abcde";
int len = s1.length();
System.out.println(len);//执行结果:5
  • String substring(int begin,int end);
  • 从字符串中截取并返回下标从begin开始到end-1(不包含end)结束的字符串。
String s1 = "abcde";
String subs1 = s1.substring(0,2);//截取下标从0~1的字符串
System.out.println(subs1);//执行结果:ab

二、StringBuilder 

1.定义

StringBuilder可以看作一个容器,不同于String,用StringBuilder创建的对象内容是可变的,它可以提高字符串的操作效率。

StringBuilder sb = new StringBuilder();

括号中可传参可不传参。

2.常用方法

  •  toString();
  • 将StringBuilder类型的对象转换为String类型。
StringBuilder sb = new StringBuilder("abc");
String s1 = sb.toString();
System.out.println(s1);//执行结果:abc

需要注意的是,通过StringBuilder创建的对象无法直接使用String中的方法,需要经过toString转换才能使用String中的方法。

  • append();
  • 向StringBuilder创建的对象中添加数据。
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.toString());//执行结果:abc
sb.append("123");
System.out.println(sb.toString());//执行结果:abc123
  • reverse();
  • 反转对象中的数据。
StringBuilder sb = new StringBuilder("abc123");
System.out.println(sb.toString());//执行结果:abc123
sb.reverse();
System.out.println(sb.toString());//执行结果:321cba
  • length();
  • 返回容器中字符串的长度。
StringBuilder sb = new StringBuilder("abc123");
int len = sb.length();
System.out.println(len);//执行结果:6
  • capacity();
  • 返回目前容器的容量。一个空的StringBuilder对象默认容量时16.
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//执行结果:16

 3.StringBuilder内存分析

在创建StringBuilder的对象时,在内存中默认开辟容量为16的字节数组,如果载入的数据超容,则系统会自动 为StringBuilder扩容,新容量=老容量*2+2=34;如果新数据超容且超出自动扩容时的容量,那么新的容量以实际为准。

需要注意的是,capacity指的是容器能容纳数据的空间大小,而length可以理解为存储在容器中的有效数据的长度。

  • 初始容量:16
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//执行结果:16
  • 数据内存没有超出默认扩容的内存空间(34)
sb.append("abcdefghijklmnopq");
System.out.println(sb.length());//执行结果:17
System.out.println(sb.capacity());//执行结果:34
  • 数据内存超出了默认扩容的内存空间
sb.append("abcdefghijklmnopqrstuvwxyz123456789");
System.out.println(sb.length());//执行结果:35
System.out.println(sb.capacity());//执行结果:35

三、StringJoiner

1.定义

StringJoiner和StringBuilder一样。都可以看作一种容器,创建之后里面的内容是可变的。StringJoiner的代码编写十分简洁,可以快速有效的完成程序员指定的字符串拼接操作。StringJoiner是不支持空参构造的。

  • StringJoiner sj = new StringJoiner("---");
  • 创建一个对象,指定拼接时的间隔符号("---")。
StringJoiner sj = new StringJoiner("---");
  • StringJoiner sj = new StringJoiner("---", "[", "]");
  • 创建一个对象,指定拼接时的间隔符号("---")、开始符号("[")、结束符号("]")。
StringJoiner sj = new StringJoiner("---","[","]");

2.常用方法

  • public StringJoiner add(添加的内容);
  • 添加数据,并返回数据本身
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
System.out.println(sj);//执行结果:[aaa---bbb---ccc]
  • public int length();
  • 返回长度。这里的length同时包含间隔符号、开始符号、结束符号在内。
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
int len = sj.length();
System.out.println(len);//执行结果:17
  • public String toString();
  • 返回一个字符串。

总结 

到此这篇关于Java字符串String相关类的文章就介绍到这了,更多相关Java字符串String相关类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring WebSocket示例详解

    spring WebSocket示例详解

    websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,本篇文章主要介绍了spring WebSocket示例详解 ,有兴趣的可以了解一下。
    2017-01-01
  • 导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法

    导入项目出现Java多个工程相互引用异常A cycle was detected in the build path o

    今天小编就为大家分享一篇关于导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java读取excel图片导入代码示例(亲测有效)

    java读取excel图片导入代码示例(亲测有效)

    在日常工作中,我们经常要将一些照片插入到Excel表格中,这篇文章主要给大家介绍了关于java读取excel图片导入的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 浅谈一下Java中的堆和栈

    浅谈一下Java中的堆和栈

    这篇文章主要介绍了一下Java中的堆和栈,Java数据类型在执行过程中存储在两种不同形式的内存中:栈和堆,它们通常由运行Java虚拟机(JVM)的底层平台维护,需要的朋友可以参考下
    2023-04-04
  • IDEA查看Scala的源码的教程图解

    IDEA查看Scala的源码的教程图解

    这篇文章主要介绍了IDEA查看Scala的源码的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 测试springboot项目出现Test Ignored的解决

    测试springboot项目出现Test Ignored的解决

    这篇文章主要介绍了测试springboot项目出现Test Ignored的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 使用IDEA部署Docker应用指南分享

    使用IDEA部署Docker应用指南分享

    本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEA Docker连接、设置运行调试环境、构建运行镜像,并强调需准备本地Jar包、正确映射端口及网络配置
    2025-07-07
  • Java实现贪吃蛇游戏(1小时学会)

    Java实现贪吃蛇游戏(1小时学会)

    这篇文章主要为大家详细介绍了Java实现贪吃蛇游戏,1小时学会贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Springboot连接数据库及查询数据完整流程

    Springboot连接数据库及查询数据完整流程

    今天给大家带来的是关于Springboot的相关知识,文章围绕着Springboot连接数据库及查询数据完整流程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java去除集合中重复元素示例分享 java去除重复

    java去除集合中重复元素示例分享 java去除重复

    这篇文章主要介绍了java去除集合中重复元素示例,大家参考使用吧
    2014-01-01

最新评论