当前位置:

首页 > Java数据结构之字符串怎么用

Java数据结构之字符串怎么用

1.字符串基础知识串(string)是由零个或多个字符组成的有限序列,又名字符串。我们可以从这段段基本概念中知道:零个或多个字符组成:说明字符串的内部元素类型为字符。有限:说明字符串的内容长度是有一定限制的,小于一个最大范围,但是在该范围内,实际的长度是不确定的。序列:说明字符串中的相邻字符存在前驱和后继的关系。在Java中没有内置的字符串类型,每个用双引号括起来的字符串都是Java中String类的一个实例。也就是说Java中String并不是数据类型,在Java中所有的字符串都是String的实例化对

Java数据结构之字符串怎么用

1.字符串基础知识

串(string)是由零个或多个字符组成的有限序列,又名字符串。

我们可以从这段段基本概念中知道:

  • 零个或多个字符组成:说明字符串的内部元素类型为字符。

  • 有限:说明字符串的内容长度是有一定限制的,小于一个最大范围,但是在该范围内,实际的长度是不确定的。

  • 序列:说明字符串中的相邻字符存在前驱和后继的关系。

在Java中没有内置的字符串类型,每个用双引号括起来的字符串都是Java中String类的一个实例。

也就是说Java中String并不是数据类型,在Java中所有的字符串都是String的实例化对象。

Java中的String

Java中的String类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都为此类的实例。

也就是说,Java程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

在Java中String最重要的特点就是:

String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。我们将这种特性称为String的不可变性。

字符串的不可变性

不可变性:当你给一个字符串重新赋值之后,老值并没有在内存中销毁,而是重新开辟一块空间存储新值。

也就是说一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象

例如:

String s="dcm";String s="ddccmm"

当s的值发生改变之后,ddccmm这个值并没有覆盖dcm,只是重新开发了一个新的空间去储存ddccmm然后将s指向它。

如果我们在实际开发中对很含有大量字符的字符串进行遍历赋值修改,会对内存中产生很多无法释放的字符串对象,造成内存垃圾。

正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降。

这时我们可以使用Java中另外一个字符串类StringBuilder。

我们在做题的时候关于字符串一般用的都是String类,但是考虑到我们有时候也会用到StringBuilder类这里我就对StringBuilder类进行稍微细致一点的讲解。

2.StringBuilder类

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指StringBuilder对象中的内容是可变的。

2.1 StringBuilder类常用的方法
Java数据结构之字符串怎么用
可以看出来,构建一个StringBuilder的对象只能使用它的构造方法来构造,不像String一样可以直接String s= "123"来创建

因为StringBuilder类对象是可变的,所以当我们对一个字符串需要进行改变比较多的时候一般定义为StringBuilder类。

2.2 String和StringBuilder的区别

String 对象是不可改变的。每次使用String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。

StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值,当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。也就是说当对字符串进行改变时,都是对当前对象的状态进行更新的。

可以使用重载的构造函数之一来指定 StringBuilder 类的容量。

2.3 String类与StringBuilder类的相互转换

String类转换为StringBuilder类

public class String{
    public static void main(String[] args){
        String s = "baibai";
        StringBuilder s1 = new StringBuilder(s);
        System.out.println(s1);
    }}

StringBuilder类转换为String类

public class String {
    public static void main(String[] args){
        StringBuilder s1 = new StringBuilder();
        //连续连接
        s1.append("abc").append("efg");
        String s = s1.toString();
        System.out.println(s);
    }}

3.初始化String类

3.1初始化String对象的两种方法:

//方法一:直接创建
String s1= "大聪明 超牛的";
//方法二:对象创建
String s2 = new String("大聪明 超牛的"); 
String s3 = new String();//也可以创建一个空串

虽然两种方法看起来是一样的但是本质上是不一样的。
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上。那存放在公共池(常量池)与堆中有什么不一样吗?

我们来举个例子:

String s1 = "大聪明 超牛的";              // String 直接创建
String s2 = "大聪明 超牛的";              // String 直接创建
String s3 = s1;                    // 相同引用
String s4 = new String("大聪明 超牛的");   // String 对象创建
String s5 = new String("大聪明 超牛的");   // String 对象创建
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
System.out.println(System.identityHashCode(s4));
System.out.println(System.identityHashCode(s5));

输出:
Java数据结构之字符串怎么用
可见前三个字符串的地址相同,后两个各不相同!

这是因为直接创建的字符串时,会先在公共池中找有没有这样的字符串,如果有那就将引用直接指向它,而不去开发新的空间。在这里s1,s2,s3这三个引用指向了公共池中的同一块内存。

对象创建时,每次都会在堆上开新的空间来存放字符串,也就是说s4,s5分别指向在堆上的两块不同的内存,只不过这两块内存里面都储存着相同的东西。

4.String类常用API

这里再次强调一下,我们在做题的时候遇到关于字符串相关题目我们几乎都是使用String类来解决问题,除了在字符串进行大量更改时我们可能会暂时用到StringBuilder类。

这里的暂时就是我们在对字符串更改等操作之后一般还是要把字符串转换为String类的。

所以我们要学习的API主要还是String类的API。对应刷题我StringBuilder的API我们只需要学习上面提到的两个就够了。

String 类在 java.lang 包下,所以使用的时候不需要导包!

4.1 基本数据类型转换成字符串

有三种办法:

(1)基本类型数据的值+“” (最常用,最简单);
(2)使用包装类中的静态方法 static String toString(int i)返回一个表示指定整数的String 对象。如:在Integer中:Integer.toString(6)
(3)使用String类中的静态方法 static String valueOf(int i) 返回int 参数的字符串表示形式。如:String.valueOf(6)

String 类别中已经提供了将基本数据型态转换成String 的 static 方法也就是 String.valueOf() 这个参数多载的方法 :

String.valueOf(boolean b) 
//将 boolean 变量 b 转换成字符串 
String.valueOf(char c) 
//将 char 变量 c 转换成字符串 
String.valueOf(char[] data)
//将 char 数组 data 转换成字符串 
String.valueOf(char[] data, int offset, int count)
//将char数组data中由data[offset]开始取 count个元素转换成字符串 
String.valueOf(double d)
//将 double 变量 d 转换成字符串 
String.valueOf(float f)
//将 float 变量 f 转换成字符串 
String.valueOf(int i)
//将 int 变量 i 转换成字符串 
String.valueOf(long l)
//将 long 变量 l 转换成字符串 
String.valueOf(Object obj)
//将 obj 对象转换成 字符串, 等于 obj.toString()

因为是静态方法所以不需要实例化。

4.2 字符串转换为基本数据类型

一般使用包装类的静态方法parseXX("字符串")

要将 String 转换成基本数据类型大多需要使用基本数据型态的包装类别,如:String 转换成 byte可以使用 Byte.parseByte(String s)

Byte.parseByte(String s)
//将 s 转换成 byte 
Byte.parseByte(String s, int radix)
//以 radix 为基底 将 s 转换为 byte
Double.parseDouble(String s)
//将 s 转换成 double 
Float.parseFloat(String s)
//将 s 转换成 float  
Integer.parseInt(String s)
//将 s 转换成 int 
Long.parseLong(String s)
//将 s 转换成 long

注意这里也是静态方法,只不过都是对应包装类的静态方法

4.3 使用length()得到一个字符串的字符个数

int len = String.length();

4.4 使用toCharArray() 将一个字符串转换成字符数组

Char[] arr = String.toCharArray();

4.5 判断两个字符串的内容是否相等返回true/false

String1.equals(String2);//区分大小写
String1.equalsIgnoreCase(String2);//不区分大小写

4.6 与位置相关的字符串

charAt(int)//得到指定下标位置对应的字符
indexOf(String)//得到指定内容第一次出现的下标
lastIndexOf(String)//得到指定内容最后一次出现的下标

4.7 将一个字符串按照指定内容劈开split(String) ,返回字符串数组。

String s = "wa,dcm,nb!";
String[] str = s.split(",");//返回结果中str[1]=dcm

4.8 contains(String) 判断一个字符串里面是否包含指定的内容,返回true/false

Boolean a = String1.contains(String2)

4.9 使用substring()截取字符串,返回子串

String.substring(int)//从指定下标开始一直截取到字符串的最后
String.substring(int,int)//从下标x截取到下标y-1对应的元素

4.10 字符串大小写转换

String.toUpperCase()
//将一个字符串全部转换成大写
String.toLowerCase()//将一个字符串全部转换成小写

4.11 使用replace()进行字符串内容替换

String.replace(String,String)
//将某个内容全部替换成指定内容
String.replaceAll(String,String)
//将某个内容全部替换成指定内容,支持正则
String.repalceFirst(String,String)
//将第一次出现的某个内容替换成指定的内容

5.字符串进阶练习

387. 字符串中的第一个唯一字符
Java数据结构之字符串怎么用
题解:

把字符串的单个字符转化为对应数组下标,遍历一遍字符串获得26个字母分别出现几次。然后在遍历一遍字符串看哪个字符先出现次数为1,就输出对应下标。

class Solution {        
    public int firstUniqChar(String s) {
        int len = s.length();
        int[] vis = new int[26];
        int temp = -1;
        for(int i = 0; i < len; i ++) {
            vis[s.charAt(i) - 'a'] ++;
        }
        for(int i = 0; i < len; i ++) {
            if(vis[s.charAt(i) - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }}

或者我们也可以把字符串先转换为字符数组来解题,原理都是一样的!

class Solution {
    public int firstUniqChar(String s) {
        int[] arr = new int[26];
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            arr[chars[i] - 'a']++;
        }
        for (int i = 0; i < chars.length; i++) {
            if (arr[chars[i] - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }}
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
相关文章 更多
谷歌浏览器Mac版入口
谷歌浏览器Mac版入口

谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

Chrome浏览器JS脚本不运行怎么办
Chrome浏览器JS脚本不运行怎么办

Chrome中JavaScript未执行需依次检查:一、移除站点级禁用并添加允许域名;二、开启全局JavaScript开关;三、禁用干扰扩展;四、在开发者工具中启用JavaScript;五、重置内容设置为默认。 有时在Chrome里打开网页,会发现交互按钮点了没反应,数据加载不出来,页面仿佛“静止”

IE浏览器怀旧版在线网址
IE浏览器怀旧版在线网址

IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

火狐浏览器有哪些设置功能
火狐浏览器有哪些设置功能

火狐浏览器五大核心设置功能:解锁高效、安全与个性化体验 火狐浏览器功能强大,但如果不仔细挖掘,很多能大幅提升效率和安全性的设置可能就“藏着掖着”了。这就好比拥有一台高性能设备,却只用了基础模式。那么,如何把它调整到最顺手、最安全的状态?接下来,我们就聚焦于当前版本(截至2025年末)最关键的五大设置

chrome搜索免验证入口
chrome搜索免验证入口

Chrome官方免验证入口为https://www.google.cn/chrome/,提供全平台安装包、免登录即用、本地化安全机制及引擎级性能优化。 到底该去哪里找正版、免费且无需繁琐验证的Chrome浏览器入口?这个问题困扰了不少网友。今天,我们就来直通核心,为大家详细拆解Chrome引擎的官方

java heap space 选型思路:使用场景与区别整理
java heap space 选型思路:使用场景与区别整理

Java堆是JVM存储对象的核心内存区域,配置需结合场景:单体应用适中设置;大数据处理需大堆并关注GC停顿;微服务强调快速启动;高并发需精细划分堆区域。关键参数-Xms和-Xmx建议等值以稳定性能。垃圾回收器选择影响效率,如G1适用于大堆,ZGC可实现低停顿。内存错误时需监控堆状态。

java heap space 使用中遇到的问题怎么解决
java heap space 使用中遇到的问题怎么解决

Java堆内存溢出错误通常因内存泄漏、数据处理需求过大或JVM参数配置不当引起。排查时可借助jmap、堆转储及MAT等工具定位问题。解决方案包括调整JVM内存参数(如-Xmx)、修复代码中的内存泄漏、优化大数据处理逻辑,并建立持续监控与预防机制,以保障应用稳定运行。

java xml 选型思路:使用场景与区别整理
java xml 选型思路:使用场景与区别整理

XML在Java开发中用于配置、数据交换等场景。解析方式主要有DOM、SAX、StAX及第三方库。DOM适合操作小文件,SAX/StAX适合处理大文件流,JAXB用于对象与XML映射。选型需结合数据大小、内存、性能及团队熟悉度,现代框架常封装底层解析。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。