深度剖析Java中的String类

目录

引言

String类的特性

String类的部分实现代码:

不可变性:

补充:

常量池:

不可变性的好处

创建String对象

创建String对象的常用的三种方法如下:

使用常量串构造(最常用):

使用new关键字:

字符数组:

补充:

常用方法

两个常用的String对象的比较方法

1.用“==”号来进行比较,比较的是引用的地址

2.用equals()方法来进行比较(直接比较的字符串的内容)

字符串查找

转化

1. 数值和字符串转化使用valueOf()方法

2. 大小写转换

3. 字符串转数组

4. 格式化输出

字符串替换​编辑

字符串截取

从String类中按下标取一个char类型出来(charAt()方法)

字符串修改

StringBuilder和StringBuffer

String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

1.String变为StringBuilder:利用StringBuilder的构造方法或append()方法

2.StringBuilder变为String:调用toString()方法

结语


引言

        在Java编程语言中,String类是用来创建和操作字符串的一种非常重要的类。由于其不可变性和广泛的应用,String类在Java中的使用频率非常高。本文将详细介绍String类的特性、创建方式、常用方法以及它的不可变性。

String类的特性

String类的部分实现代码:

不可变性:

        从源码可以看到String类是通过一个被private关键字修饰的char类型的数组来存储数据的,但是String类并没有提供访问该数组的方法(set方法)。因此,一旦创建了String对象,它的值就无法被改变。如果需要对字符串进行修改,通常会创建一个新的String对象。

补充:

  1. String类被final修饰,表明该类不能被继承。
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
  3. String类是引用类型,内部并不存储字符串本身。

常量池:

        字符串常量池是String对象的一个特殊存储区域,它可以帮助节省内存空间。当我们创建字符串常量时,JVM会首先检查字符串常量池,如果池中已存在相同的String对象,就会返回池中的对象引用,而不是创建一个新对象。

        请注意:网上有些人说字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。

不可变性的好处

String类的不可变性有几个优点:

  1. 安全性:字符串常量的不可变性使得字符串实例可以安全地在多个线程间共享。
  2. 性能:不可变的字符串可以被缓存,减少了重复创建相同字符串对象的开销。
  3. 哈希值缓存:由于String的内容不可变,它的哈希值也不会变。这使得String对象可以作为哈希表的键,提高了哈希表的性能。

创建String对象

创建String对象的常用的三种方法如下:

  1. 使用常量串构造(最常用):

    String str = "Hello, World!";
    
  2. 使用new关键字:

    String str = new String("Hello, World!");
    
  3. 字符数组:

    char[] charArray = {'H', 'e', 'l', 'l', 'o'};
    String str = new String(charArray);
    

补充:

有以下代码:

public static void main(String[] args) {
    String s1 = new String("hello");
    String s2 = new String("world");
    String s3 = s1;
}

 调试结果如下:

         通过调试结果可以得知:s1和s2引用的是不同对象s1和s3引用的是同一对象。

常用方法

两个常用的String对象的比较方法

1.用“==”号来进行比较,比较的是引用的地址

代码演示如下:

public static void main(String[] args) {
    //s1和s2引用的是不同对象 s1和s3引用的是同一对象
    String s1 = new String("hello");
    String s2 = new String("hello");
    String s3 = s1;

    System.out.println(s1 == s2);//s1 == s2的结果是false
    System.out.println(s1 == s3);//s1 == s3的结果是true
}

 运行结果如下:

2.用equals()方法来进行比较(直接比较的字符串的内容)

代码演示如下:

public static void main(String[] args) {
    //s1和s2引用的是不同对象 s1和s3引用的是同一对象
    String s1 = new String("hello");
    String s2 = new String("hello");
    String s3 = s1;

    //直接比较字符串的内容,所以结果都是true
    System.out.println(s1.equals(s2));
    System.out.println(s1.equals(s3));
}

 运行结果如下:

        还有其他的比较方法(如:compareTo,Comparable等)由于篇幅问题就不做过多介绍了,同学们可自行了解。

字符串查找

        注意:上述方法都是实例方法。

转化

1. 数值和字符串转化使用valueOf()方法

String s1 = String.valueOf(1234);//int类型转String类型
String s2 = String.valueOf(56.78);//double类型转String类型
String s3 = String.valueOf(true);//boolean类型转String类型

2. 大小写转换

public static void main(String[] args) {
    String str = new String("hello");

    str = str.toUpperCase();//转大写
    System.out.println(str);

    str = str.toLowerCase();//转小写
    System.out.println(str);
}

3. 字符串转数组

代码演示如下:

public static void main(String[] args) {
    String s = "hello";
    
    char[] ch = s.toCharArray();// 字符串转数组
    for (int i = 0; i < ch.length; i++) {
        System.out.print(ch[i]);
    }
    System.out.println();
}

运行结果如下:

4. 格式化输出

代码演示如下:

public static void main(String[] args) {
    String s = String.format("%d-%d-%d", 1949, 10,1);//格式化输出
    System.out.println(s);
}

 运行结果如下:

字符串替换

        注意:由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串。

字符串截取

 代码示例如下:

public static void main(String[] args) {
    String str = "hello world";
    System.out.println(str.substring(0, 5));
    System.out.println(str.substring(6));//没有截取空格
}

运行代码如下:

        注意:substring(int beginIndex, int endIndex)是前闭后的,substring(0, 5)表示包含0号下标的字符,不包含5号下标。

从String类中按下标取一个char类型出来(charAt()方法)

代码示例如下:

public static void main(String[] args) {
    String str = "hello world";
    char ch = str.charAt(0);//取第一个
    System.out.println(ch);
    System.out.println(str.charAt(10));//取最后一个
}

运行代码如下:

字符串修改

public static void main(String[] args) {
    String s = "hello";
    s += " world";
    System.out.println(s);//输出hello world
}

        并不推荐这种方式,因为其效率非常低,中间创建了好多临时对象。尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。

StringBuilder和StringBuffer

        由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其它的大家可自行查阅文档。

方法 说明
StringBuff append(String str)在尾部追加,相当于String+=,可以追加:boolean、charchar[]doublefloatintlongObjectStringStringBuff的变量
char charAt(int index) 获取index位置的字符
int length() 获取字符串的长度
int capacity() 获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)扩容
void setCharAt(int index, char ch) index位置的字符设置为ch
int indexOf(String str) 返回str第一次出现的位置
int indexOf(String str, int fromIndex) fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str) 返回最后一次出现str的位置
int lastIndexOf(String str,
int fromIndex) 
fromIndex位置开始找str最后一次出现的位置
StringBuff insert(int offset, String str) offset位置插入:八种基类类型 & String类型 & Object类型数据
StringBuffer deleteCharAt(int index) 删除index位置字符
StringBuffer delete(int start, int end) 删除[start, end)区间内的字符
StringBuffer replace(int start, int end, String str) [start, end)位置的字符替换为str
String substring(int start) start开始一直到末尾的字符以String的方式返回
String substring(int startint end) [start, end)范围内的字符以String的方式返回
StringBuffer reverse() 反转字符串
String toString() 将所有字符按照String的方式返回

String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

1.String变为StringBuilder:利用StringBuilder的构造方法或append()方法

代码示例如下:

public static void main(String[] args) {
    StringBuilder stringBuilder = new StringBuilder("Hello");
    System.out.println(stringBuilder);
    stringBuilder.append(" World!");
    System.out.println(stringBuilder);
}

运行结果如下:

2.StringBuilder变为String:调用toString()方法

代码示例如下:

public static void main(String[] args) {
    StringBuilder stringBuilder = new StringBuilder("Hello");
    String str = stringBuilder.toString();
}

调试结果如下:

        由于StringBuilder和StringBuffer大部分功能和用法都是类似的,因此本文仅介绍StringBuilder,StringBuffer的相关方法大家可自行了解使用。

        注意:StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。

结语

        以上,就是的本次要带大家深度剖析的Java中的String类的全部内容,感谢大家愿意花时间阅读本文!

        如有错误,建议,或问题均可在评论区指出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/542155.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

帝国cms仿《鳄鱼下载站》网站源码

仿《鳄鱼下载站》网站源码手机安卓软件网站模版 PHP网站源码 帝国cms内核 采用帝国cms7.5 环境PHPmysql 恢复数据库后如何修改密码: 双击表&#xff0c;进入对应的详细数据表&#xff0c;然后找到&#xff1a;www_96kaifa_com_enewsuser这个表&#xff0c;双击打开修改&…

SAP SD学习笔记06 - 受注的据否,受注的理由,简易变更(一括处理)

上文讲了一括处理和Block&#xff08;冻结&#xff09;处理。 SAP SD学习笔记05 - SD中的一括处理&#xff08;集中处理&#xff09;&#xff0c;出荷和请求的冻结&#xff08;替代实现承认功能&#xff09;-CSDN博客 本章继续讲SAP的流程中一些常用的操作。 1&#xff0c;受注…

【算法】分治-快排

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 前言1. 75. 颜色分类1.1 分析1.2 代码 2. 912. 排序数组2.1 分析2.2 代码 3. 215. 数组中的第K个最大元素3.1 分析3.2 代码 4. LCR 159. 库存管理 III4.1 分析4.2 代码 前言 分治就是分而治之 1. 75. 颜色分类 1.1 分析…

基于java+springboot+vue实现的网上购物系统(文末源码+Lw+ppt)23-42

摘 要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;网上购物系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为…

Linux【实战篇】—— NFS服务搭建与配置

目录 一、介绍 1.1什么是NFS&#xff1f; 1.2客户端与服务端之间的NFS如何进行数据传输&#xff1f; 1.3RPC和NFS的启动顺序 1.4NFS服务 系统守护进程 二、安装NFS服务端 2.1安装NFS服务 2.2 创建共享目录 2.3创建共享目录首页文件 2.4关闭防火墙 2.5启动NFS服务 2.…

Java 语言程序设计(基础篇)原书第10版 梁勇著 PDF 文字版电子书

简介 Java 语言程序设计&#xff08;基础篇&#xff09;原书第 10 版 是 Java 语言的经典教材&#xff0c;中文版分为基础篇和进阶篇&#xff0c;主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解…

抖音滑块验证码加密的盐的位置

最近更新后之前很容易找到盐的位置的方法变了&#xff0c;抖音特意把盐隐藏起来了 {"reply": "RJC","models": "yAd8rl","in_modal": "DTn0nD2","in_slide": "ou7H0Ngda","move": …

C++算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

arm工作模式、arm9通用寄存器、异常向量表中irq的异常向量、cpsr中的哪几位是用来设置工作模式以及r13,r14,15别名是什么?有什么作用?

ARM 首先先介绍一下ARM公司。 ARM成立于1990年11月&#xff0c;前身为Acorn计算机公司 主要设计ARM系列RISC处理器内核 授权ARM内核给生产和销售半导体的合作伙伴ARM公司不生产芯片 提供基于ARM架构的开发设计技术软件工具评估版调试工具应用软件总线架构外围设备单元等等CPU中…

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…

spring boot集成logback到mysql 8

spring boot集成logback到mysql 8 依赖数据库准备创建log日志用户&#xff0c;并创建数据库执行建表sql 配置文件bugbug 1&#xff1a;Failed to instantiate type ch.qos.logback.classic.db.DBAppenderbug信息&#xff1a;解决&#xff1a; bug2: DBAppender cannot function…

windows SDK编程 --- 第一个程序

一、基础知识 1.Unicode 和 ANSI 在 Windows 编程中&#xff0c;Unicode 和 ANSI 是两种不同的字符编码方法&#xff0c;它们用于定义如何在计算机中表示和存储字符数据。 ANSI ANSI&#xff08;American National Standards Institute&#xff09;编码是一种基于单字节的字符…

最新视频理解大模型之MiniGPT4-video

前言 随着大模型的爆火&#xff0c;多模态大模型也随之卷了起来&#xff0c;基本每隔一小段时间就会冒出一个新模型。 今天给大家带来一个最新发现的关于视频理解的多模态大模型。 它的名字是MiniGPT4-video&#xff0c;可以看的出来其是MiniGPT4的一个分支&#xff1b;Mini…

vue3实现时钟效果

鼬鼬鼬鼬鼬被提需求了&#xff01;&#xff01;&#xff01; 产品&#xff1a;你学什么的&#xff1f; 我&#xff1a;跟CV有点关系 产品&#xff1a;control C加control V是吧 我&#xff1a;对对对 效果 时间实时变化&#xff1a; 页面部分 <template><div clas…

开源博客项目Blog .NET Core源码学习(14:App.Hosting项目结构分析-2)

开源博客项目Blog的前台页面&#xff08;如下图所示&#xff09;的控制器类保存在App.Hosting项目的Controllers文件夹内&#xff0c;页面保存在Views文件夹内&#xff0c;网页中使用的图标、js、css文件等保存在wwwroot文件中。 前台各个页面、Controller文件夹中的控制器类及…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发action…

【c 语言】函数前面的返回类型

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

大厂Java笔试题之统计兔子出生问题

题目&#xff1a;有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子…

vue3 vueUse 连接蓝牙

目录 vueuse安装&#xff1a; useBluetooth: 调用蓝牙API 扫描周期设备 选择设备配对 连接成功 vue3的网页项目连接电脑或者手机上的蓝牙设备&#xff0c;使用vueUse库&#xff0c;可以快速检查连接蓝牙设备。 vueUse库使用参考&#xff1a; VueUse工具库 常用api-CSDN…

ES6: promise对象与回调地狱

ES6&#xff1a; promise对象与回调地狱 一、回调地狱二、Promise概述三、Promise的组成四、用函数封装Promise读取文件操作 一、回调地狱 在js中大量使用回调函数进行异步操作&#xff0c;而异步操作什么时候返回结果是不可控的&#xff0c;所以希望一段程序按我们制定的顺序执…