iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java数据结构之字符串怎么用
  • 452
分享到

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

2023-06-30 14:06:12 452人浏览 八月长安
摘要

这篇文章主要介绍“Java数据结构之字符串怎么用”,在日常操作中,相信很多人在Java数据结构之字符串怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之字符串怎么用”的疑惑有所帮助!接下来

这篇文章主要介绍“Java数据结构字符串怎么用”,在日常操作中,相信很多人在Java数据结构之字符串怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之字符串怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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 包下,所以使用的时候不需要导包!

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

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

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

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

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

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

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

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

int len = String.length();

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

Char[] arr = String.toCharArray();

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

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

6 与位置相关的字符串

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

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

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

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

Boolean a = String1.contains(String2)

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

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

10 字符串大小写转换

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

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;    }}

到此,关于“Java数据结构之字符串怎么用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java数据结构之字符串怎么用

本文链接: https://www.lsjlt.com/news/329456.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java数据结构之字符串怎么用
    这篇文章主要介绍“Java数据结构之字符串怎么用”,在日常操作中,相信很多人在Java数据结构之字符串怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之字符串怎么用”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • Redis数据结构的动态字符串sds怎么使用
    本篇内容主要讲解“Redis数据结构的动态字符串sds怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis数据结构的动态字符串sds怎么使用”吧!Redis是用ANSI C语言编写的...
    99+
    2023-06-21
  • 解析Redis数据结构之简单动态字符串sds
    Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库、缓存和消息中间件。其中 Redis 键值对中的键都是 string 类型,而键值对...
    99+
    2024-04-02
  • C语言数据结构与算法之字符串详解
    目录串的定义串的比较 串的抽象数据类型串的初始化相关定义初始化定长类初始化串的堆式顺序存储结构(Heap)初始化堆字符串 赋值操作比较两个堆字符串的大小 串的定义...
    99+
    2024-04-02
  • Java数据结构之List怎么用
    小编给大家分享一下Java数据结构之List怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!泛型什么是泛型泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型是在C#2.0引入的。泛型(Genericity...
    99+
    2023-06-21
  • Java数据结构与算法系列精讲之字符串暴力匹配
    概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. 字符串匹配 字符串匹配 (String Matching) 指的是判断一个字符串是否包含另一...
    99+
    2024-04-02
  • 从零开始学Python:第九课-常用数据结构之字符串
    接着上期的Python教程讲,视频教程你们私我要的,整理出来了:Python 900集全套视频教程(全家桶)https://pan.baidu.com/s/1cU5lDWq9gh0cQ7hCnXUiGA,你们好好学。第二次世界大战促使了现代...
    99+
    2023-06-01
  • Java数据结构之队列怎么用
    这篇文章主要介绍了Java数据结构之队列怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:一、概述:1、说明:队列的原则时先进先出,就像生活中排队取票一样,谁排在...
    99+
    2023-05-31
    java
  • Python的字符串和常用数据结构有哪些
    本篇内容介绍了“Python的字符串和常用数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用字符串第二次世界大战促使了现代电子...
    99+
    2023-06-01
  • Python结构化字符串中提取数据详情
    目录前言从结构化字符串中提取数据字符串解析前言 在许多自动化任务中,我们都需要从已知格式结构化的输入文本中提取相关信息。例如,我们可能需要在一段电影评论数据中提取观影时间、电影名、评...
    99+
    2024-04-02
  • JavaScript数据结构之字典方法怎么用
    今天小编给大家分享一下JavaScript数据结构之字典方法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、什么是字...
    99+
    2023-06-30
  • PHP数据结构:字符串处理技巧,掌握高效字符串操作与匹配
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • Java数据结构之List的使用总结
    目录泛型什么是泛型泛型的分类泛型的定义简单演示泛型背后作用时期和背后的简单原理泛型类的使用泛型总结包装类基本数据类型和包装类直接的对应关系包装类的使用,装箱(boxing)和拆箱(u...
    99+
    2024-04-02
  • redis内部数据结构之SDS简单动态字符串的示例分析
    小编给大家分享一下redis内部数据结构之SDS简单动态字符串的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言rei...
    99+
    2024-04-02
  • Java基础学习之字符串知识总结
    目录一、前言二、String 类(字符串常量)2.1 String 类实例的创建2.2 String 对象的比较2.3 String对象的空值2.4 字符串拼接三、StringBui...
    99+
    2024-04-02
  • java怎么根据特殊字符截取字符串
    根据特殊字符截取字符串可以使用Java的split()方法或者substring()方法。1. 使用split()方法:`...
    99+
    2023-08-16
    java
  • java字符串怎么添加字符
    在Java中,我们可以使用"+"操作符或者StringBuilder类来添加字符到字符串中。 使用"+"操作符: 可以通过在字符...
    99+
    2023-10-26
    java
  • Java数据结构之KMP算法怎么实现
    这篇文章主要讲解了“Java数据结构之KMP算法怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java数据结构之KMP算法怎么实现”吧!暴力匹配算法(Brute-Force,BF)这...
    99+
    2023-07-04
  • java字符串和数字怎么拼接
    在Java中,可以使用加号(+)来连接字符串和数字。例如: int num = 10; String str = "The...
    99+
    2024-04-02
  • Java数据结构之HashMap和HashSet
    目录1、认识 HashMap 和 HashSet2、哈希表2.1 什么是哈希表2.2 哈希冲突2.2.1 概念2.2.2 设计合理哈希函数 - 避免冲突2.2.3 调节负载因子 - ...
    99+
    2023-03-24
    Java HashMap 的构造方法 设计哈希函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作