深度剖析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的结果是falseSystem.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;//直接比较字符串的内容,所以结果都是trueSystem.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类的全部内容,感谢大家愿意花时间阅读本文!

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

Hystrix应用:如何在Spring Boot中使用Hystrix?

Hystrix应用&#xff1a;如何在Spring Boot中使用Hystrix&#xff1f; 引言 在微服务架构的发展过程中&#xff0c;面对复杂的服务依赖和不可预见的系统故障&#xff0c;如何提升系统的容错能力成为了一个非常急迫且重要的能力。 由 Netflix&#xff08;网飞&#xff09;公司…

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

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

Ubuntu-22.04安装VMware虚拟机并安装Windows10

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、VMware是什么&#xff1f;二、安装VMware1.注册VMware账号2.下载虚拟机3.编译vmmon&vmnet4.加载module5.安装bundle 三、安装Windows101.基础配置2.进阶…

【leetcode面试经典150题】50. 插入区间(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#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(73):Java中的引用类型: 弱引用、软引用与强引用详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Scrum.org认证PSM(Professional Scrum Master)官方认证班

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架&#xff0c;旨在最短时间内交付最大价值。根据2022年全球敏捷状态报告&#xff0c;Scrum的应用占比已经达到87%。 Scrum.org 由 Scrum 的联合创始人 Ken Schwaber 创立…

git log详解

文章目录 git log -p其他常用的参数 git log是用来查看历史提交记录的&#xff0c;那么这些记录包含什么呢&#xff1f;如果你不指定分支或者master&#xff0c;默认情况下git log显示的是目前你HEAD的位置的git提交日志&#xff0c;默认不加参数&#xff0c;git log显示如下&a…

【C++风云录】融入虚拟现实的魅力:借助 C++ 库打造沉浸式的游戏体验和交互效果

点燃创造力&#xff1a;解锁 C 库的潜力&#xff0c;构建令人惊叹的物理模拟和游戏应用 前言 在现代的游戏和虚拟现实应用中&#xff0c;物理模拟和真实的交互体验是不可或缺的要素。为了实现逼真的物理效果和流畅的游戏体验&#xff0c;开发人员需要依赖强大的物理模拟库和游…

如何在ADS中实现数据的导入和导出

1 MDIF接口 ADS提供了一种通用的MDIF格式文件&#xff0c;允许用户使用一个通用的数据接口实现导入和导出的功能&#xff0c;其Help文件中的简介如下&#xff1a; 2 数据的导入 实现数据导入功能之前&#xff0c;数据必须遵从一定的标准格式&#xff0c;如下图所示&#xff0c;…

有哪些更复杂的并发编程概念可以进一步学习?

并发集合&#xff1a;Java 提供了一套并发集合类&#xff0c;如 ConcurrentHashMap&#xff0c;ConcurrentLinkedQueue 和 CopyOnWriteArrayList 等&#xff0c;可以在并发环境下使用&#xff0c;而不需担心线程安全问题。 原子变量: java.util.concurrent.atomic 包提供了一组…

自动化运维(二十八)Ansible 实战之最佳安全实践

Ansible是直接操作我们服务器的工具&#xff0c;Ansible是否安全关系到整个生产和办公环境的数据安全&#xff0c;因此确保 Ansible 安全地运行非常重要。以下是有关 Ansible 安全的详细介绍&#xff0c;包括如何安全地使用 Ansible 和一些最佳安全实践。 1. Ansible 安全概念…

[大模型] BlueLM-7B-Chat WebDemo 部署

BlueLM-7B-Chat WebDemo 部署 模型介绍 BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;参数规模为 70 亿。BlueLM-7B 在 C-Eval 和 CMMLU 上均取得领先结果&#xff0c;对比同尺寸开源模型中具有较强的竞争力(截止11月1号)。本次发布共包含 7…

我与C++的爱恋:类与对象(二)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 本篇着重介绍构造函数和析构函数&#xff0c;剩余内容在下篇解答。 一、类的默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 任何类在什么都不写时…

ThingsBoard通过服务端获取客户端属性或者共享属性

MQTT基础 客户端 MQTT连接 通过服务端获取属性值 案例 1、首先需要创建整个设备的信息&#xff0c;并复制访问令牌 ​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、通过服务端获取属性值 5、在客户端查看对应的客户端属性或者共享属性的key 6、查看整个…

java的gradle,maven工程中使用selenium

一、下载selenium库 &#xff08;1&#xff09;gradle工程 工程中会有一个build.gradle.kts的文件&#xff0c;这个文件可以定制 Gradle 的行为 在文件中添加下面代码&#xff0c;然后sync // implementation ("org.seleniumhq.selenium:selenium-java:4.19.1") …

基于spring boot的留守儿童爱心管理系统

基于spring boot的留守儿童爱心管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

《剑指 Offer》专项突破版 - 面试题 108 : 单词演变(C++ 实现)

目录 前言 单向广度优先搜索 双向广度优先搜索 前言 题目链接&#xff1a;单词演变 题目&#xff1a; 输入两个长度相同但内容不同的单词&#xff08;beginWord 和 endWord&#xff09;和一个单词列表&#xff08;wordList&#xff09;&#xff0c;求从 beginWord 到 end…

HTML5+CSS3小实例:荧光图标悬停效果

实例:荧光图标悬停效果 技术栈:HTML+CSS 字体图标库:font-awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=d…