Java【String字符串不可变】

news2024/11/18 20:31:32

字符串不可变&练习

  • 字符串不可变
    • 1. 字符串设置为不可变的原因
    • 2. 如何修改字符串内容
    • 3 StringBuilder类的具体使用
    • 4. 面试题

字符串不可变

1. 字符串设置为不可变的原因

  1. 方便实现字符串常量池,若String对象可变,常量池中的内容就会随时变化,常量池的实现就会非常麻烦(“写时拷贝”)
  2. 不可变的对象永远线程安全,不用考虑线程安全问题,效率很高
  3. 不可变对象可以作为哈希表的key值,高效保存在哈希表中
    在这里插入图片描述所谓的字符串不可变指的是字符串对象的内容不能变,而不是字符串引用不能变。这里的不可变是指“hello”,“world”,“helloworld”,这些字符串的对象一旦声明后就无法修改其内容。

不可变的本质原因:
String类的外部无法访问内部的value[]数组,并没有提供对应的getter和setter方法,对外部而言,value无法使用。因此,字符串对象的内容一旦产生无法修改。

由于字符串对象时不可变的,所有字符串的修改方法(subString、replace、toUpperCase)本质上都是产生了新的字符串,不是在原字符串上进行的修改!

2. 如何修改字符串内容

a. 在运行时通过反射破坏对value数组的封装
b. 更换使用StringBuilder或者StringBuffer类
若需要频繁进行字符串的拼接,使用StringBuilder类的append方法。StringBuilder类可以修改对象的内容。

StringBuilder sb=new StringBuilder();
sb.append("hello");
sb.append("world");
sb.append("!!!");
System.out.println(sb);

在这里插入图片描述
StringBuffer使用方法和StringBuilder一样,所有的方法名称,具体使用一模一样。
StringBuffer是线程安全,效率较低,性能较差;
StringBuilder线程不安全,效率较高。
不考虑线程安全的情况下,优先使用StringBuilder类。

3 StringBuilder类的具体使用

StringBuilder类和String类是两个独立的类,StringBuilder就是为了解决字符串拼接问题产生的。由于String的对象无法修改内容,为了方便字符串的拼接操作,产生了StringBuilder类,StringBuilder类的对象是可以修改内容的。
StringBuilder和String类的相互转换
在这里插入图片描述
(1) 拼接操作 append()方法

String转为StringBuilder

StringBuilder sb=new StringBuilder("hello");
//修改都是在原对象中进行的修改,不会产生新对象
sb.append("123");

(2) 按照String方式返回 toString()

还原为String对象

String str=sb.toString();

(3) 字符串反转操作reverse()

sb.reverse();

(4) 删除指定范围内的数据delete(int start,int end)

sb.delete(5,10);//Java中的区间是左闭右开

(5) 删除指定位置的元素deleteCharAt()

sb.deleteCharAt(5);

(6) 插入操作insert()

insert(int start,各种数据类型);
sb.insert(4,10);

将新元素插入当前sb对象,插入后新数值的起始索引为start

4. 面试题

  1. 请解释String、StringBuilder、StringBuffer的区别
  • String的对象内容无法修改,但是StringBuilder、StringBuffer的对象内容可以修改;
  • StringBuffer采用synchroniaed方法处理,是线程安全的操作,性能较差; StringBuilder采用异步处理,是线程不安全,效率较高。
  • String对象“+=”其实是编译器会默认优化为StringBuilder的append方法
    在这里插入图片描述

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

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

相关文章

Linux SVN提交日志校验

#!/bin/bash export LANG"en_US.UTF-8" #确保中文日志显示正常,便于统计日志 REPOS"$1" TXN"$2" #限制日志长度 LENGTH20 #exit 0SVNLOOK"/usr/bin/svnlook" BLACKLIST".* *.o *.chw *.pck ~\$*"function error_…

五、菜单管理

云尚办公系统:菜单管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!&#x…

【Linux系统编程】Linux基本指令详解(二)

文章目录 前言1. cp 指令(重要)2. mv 指令(重要)3. cat 指令echo 命令输出重定向追加重定向wc 命令输入重定向 4. more 指令5. less指令(重要)6. head指令7. tail指令8. 命令行管道(了解&#x…

《AVL树》

文章目录 一、AVL树的基本概念二、AVL树的结点定义三、AVL树的插入四、AVL树的旋转1. 右单旋2. 左单旋3. 右左双旋4. 左右双旋 五、AVL树的验证六、AVL树的性能七、源代码 一、AVL树的基本概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将…

Mysql+ETLCloud CDC+Doris实时数仓同步实战

业务需求及其痛点 很多大型企业需要对各种销售及营销数据进行实时同步分析,例如销售订单信息,库存信息,会员信息,设备状态信息等等,这些统计分析信息可以实时同步到Doris中进行分析和统计,Doris作为分析型…

《深入浅出SSD:固态存储核心技术、原理与实战》----学习记录(一)

前言 传统数据存储介质有磁带、光盘等,但更多的是硬盘(HDD)。随着数据呈爆炸式增长,对数据存储介质在速度上、容量上有更高的要求。时势造英雄,固态硬盘(Solid State Disk,SSD)横空出世。SSD使用电子芯片存储数据,没有…

数学建模算法(基于matlab和python)之 改进的欧拉方法与四阶L-K方法(4/10)

实验目的及要求: 1、熟悉各种初值问题的算法,编出算法程序; 2、明确各种算法的精度寓所选步长有密切关系; 3、熟悉在Matlab平台上直接求解常微分方程初值问题。 实验内容: 1、编写改进的欧拉公式通用子程序&#xff0…

禽流感病毒防治VR模拟实训教学效率高-深圳华锐视点

对于临床兽医学实训而言,学生在实验教学中依托传统的教学方式已经无法满足学生的学习效率,理论知识和实验教学无法完美结合。 随着互联网数字化的飞速发展,数字化虚拟仿真教学兴起,有效的提升了传统教学的质量,学生在实…

Blender骨骼绑定

演示视频参考连接:Blender骨骼绑定教程3:清除绑定 & Deform & 权重修改_哔哩哔哩_bilibili 对给定人体Mesh建立骨骼的操作步骤: 在Blender中打开人体Mesh模型,并确保该模型处于object模式。或者使用快捷键“Shift A”并选择“骨骼…

【FFmpeg实战】视频容器

原文地址:https://alphahinex.github.io/2020/03/12/video-container/ 视频容器 我们常见的视频格式有 avi 或 mp4 等,这些所谓的视频格式,实际上指的只是视频容器的格式。就像 zip 格式的压缩包里面可以放置任意类型的文件一样,…

【初识 Docker | 中级篇】 Docker 中部署 Spring Boot 微服务详解

文章目录 前言一、生成 Docker 镜像1.编写Dockerfile2.构建镜像 二、启动容器1.运行服务2.测试 三、jar包映射部署1.更新Dockerfile文件2.构建镜像3.创建&启动容器 总结 前言 本文将为您详细介绍如何在Docker容器中部署Spring Boot服务。 首先,您需要为您的Sp…

Argo CD 实践教程 07

在本章中,我们将探讨如何设置用户访问Argo CD的权限,以及从终端或CI/CD管道连接CLI的选项,以及如何执行基于角色的访问控制。我们将查看单点登录(SSO)选项,通常这是一个需要付费的功能,但由于Ar…

Bean与@Bean注解

文章目录 一、背景与IoC二、注解Bean1、Bean注解用法2、Bean注解源码3、Bean注解演示 一、背景与IoC 之前的代码书写现状—耦合度偏高。如下图,业务层需要数据层实现类对象BookDaoImpl,于是自己new了一个,此时,当数据层类名改为B…

隐藏菜单之菜单和搜索

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>菜单</title><style>/* css代码开始*/* {margin: 0;padding: 0;box-sizing: border-box;}b…

人工智能(pytorch)搭建模型15-手把手搭建MnasNet模型,并实现模型的训练与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型15-手把手搭建MnasNet模型&#xff0c;并实现模型的训练与预测&#xff0c;本文将介绍MnasNet模型的原理&#xff0c;并使用PyTorch框架构建一个MnasNet模型用于图像分类任务&#xff0c;…

1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库&#xff08; Data Warehouse &#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数…

Linux——使用第三方库链接的方式——动态式

回顾上文&#xff1a; (122条消息) Linux使用第三方库链接的使用方式——静态式_橙予清的zzz~的博客-CSDN博客https://blog.csdn.net/weixin_69283129/article/details/131414804?spm1001.2014.3001.5502 上篇文章中&#xff0c;我讲到了关于链接第三方库作为静态库的使…

股票技术分析方法综述

文章目录 K线均线MACDKDJ和RSIBOLL线趋势理论、支撑位和压力位形态理论量价关系理论道氏理论波浪理论江恩理论缠论自定义指标 K线 K线的组合形态是K线技术分析中的重要部分&#xff0c;包括早晨之星、黄昏之星、红三兵、黑三兵等。 早晨之星&#xff1a;由三根K线组成&#x…

OpenGL 抗锯齿

1.简介 你可以看到&#xff0c;我们只是绘制了一个简单的立方体&#xff0c;你就能注意到它存在锯齿边缘。 可能不是非常明显&#xff0c;但如果你离近仔细观察立方体的边缘&#xff0c;你就应该能够看到锯齿状的图案。如果放大的话&#xff0c;你会看到下面的图案&#xff1a…

家校互动、班级管理系统

最近做了一款使用若依开源框架搭建的一款家校互动、班级管理的平台&#xff0c;采用uniapp作为APP端&#xff0c;原生小程序作为小程序的家长端。