JavaSE【 String 类】(2)(

news2024/11/29 4:34:10

一、字符串的不可变性

1.String本身不可变

字符串修改
注意:尽量避免直接对 String 类型对象进行修改,因为 String 类是不能修改的,所有的修改都会创建新对象,效率 非常低下。
public static void main(String[] args) {
        /**
         * String 本身是不可修改的
         * 下面代码,创建了三个对象 "hello" "abc" "helloabc"
         * 查看源码  private final char value[];
         * 发现 如果想要改变str 那么就需要拿到 value[]这个值,但是这个值被 private 所修饰
         * 所以在 String类 外部,无法拿到或者修改这个 value值
         */
        String str = "hello";
        System.out.println(str);//hello
        str += "abc";
        System.out.println(str);//helloabc
        /**
         * 但是从运行结果上来看,好像的确 变成了 helloabc
         * 打开cmd 查看 java汇编码
         */
    }

String 类中的字符实际保存在内部维护的 value 字符数组中 ,该图还可以看出:

1. String类被final修饰,表明该类不能被继承

2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中 的内容可以修改。

3.value被修饰被privatel修饰,如果想要改变str 那么就需要拿到 value这个值,但是这个值被 private 所修饰 所以在 String类 外部,无法拿到或者修改这个 value值。

 

2.Stringbuilder

根据汇编码,发现String在拼接字符串的时候创建了StringBuilder这个对象

用StringBuilder模拟实现

发现能实现同样的效果 helloabc 

public static void main2(String[] args) {
        /**
         * StringBuilder
         * 根据上面main1代码的汇编代码,模拟以下代码
         */
        String str = "hello";
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(str);
        stringBuilder.append("abc");

        str = stringBuilder.toString();
        System.out.println(str);//helloabc
    }

二、比较String 、StringBuffer、StringBuilder

 public static void main(String[] args) {
        /**
         * 对比String 、StringBuffer、StringBuilder
         *
         */
        //String
        long start = System.currentTimeMillis();//执行开始时间
        String string = "";
        for(int i = 0; i < 10000; ++i){
            string += i; //在空字符串后,循环拼接10000次字符
        }
        long end = System.currentTimeMillis();//执行结束时间
        System.out.println("String前后执行的时间:"+(end - start));

        //StringBuffer
        start = System.currentTimeMillis();
        StringBuffer stringBuffer = new StringBuffer("");
        for(int i = 0; i < 10000; ++i){
            stringBuffer.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("stringBuffer前后执行的时间:"+(end - start));


        //StringBuilder
        start = System.currentTimeMillis();
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < 10000; ++i){
            stringBuilder.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("stringBuilder前后执行的时间:"+(end - start));

    }

发现

String拼接字符串时,耗费的时间最长。

StringBuffer和StringBuilder 两者耗费时间相差不大,都是极短的。

String 与 StringBuffer、StringBuilder最大的区别就在于 StringBuffer、StringBuilder调用了append函数。

查看append 底层代码逻辑

返回的是this

查看汇编比较

1.String 在循环拼接字符串内时,每一次循环都 new了一个StringBuilder对象

 

2.StringBuffer 每次循环不会new新的对象,直接返回 stringBuffer 的值

 

3.StringBuilder 也没有在每次循环中创建新的对象

 1)对比String 和 StringBuffer、StringBuilder

String 不可变, StringBuffer、StringBuilder可变

String每次循环都在创建对象、 拼接对象、 销毁对象,无形之中消耗了大量时间

而StringBuffer、StringBuilder 直接在该字符串的位置后拼接对象,返回的这个字符串的地址

耗费时间自然就少了许多

  2)对比StringBuffer 和 StringBuilder

StringBuffer 的append方法 被synchronized所修饰了,这个保证了线程安全,而StringBuilder 没有线程安全

StringBuffer 里所有的方法都被synchronized修饰,都保证了线程安全。

 

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

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

相关文章

AutoCAD Civil 3D中文本地化模板下载及设置

安装AutoCAD Civil3D后默认使用的是其自带的公制模板&#xff0c;其中各种标签、样式均不符合我们国内的标准&#xff0c;因此必须使用本地化地制图模板。参照本文说明完成模板的设置。 模板下载 链接&#xff1a;https://share.weiyun.com/5nhj0Fw 密码&#xff1a;njwxw8 也…

Revit SDK 介绍:NewForm 新建体量

前言 这个例子介绍如何新建体量。 内容 图形生成效果。 用 Extrusion 创建体量 // 创建一个轮廓 ReferenceArray ref_ar new ReferenceArray(); // 创建三条直线&#xff0c;并放入轮廓 Autodesk.Revit.DB.XYZ ptA new Autodesk.Revit.DB.XYZ(10, 10, 0); Autodesk.Rev…

【c++每天一题】 字符串压缩

字符串压缩 时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 128MB&#xff0c;其他语言 256MB 难度&#xff1a;简单 分数&#xff1a;100 OI排行榜得分&#xff1a;12(0.1*分数2*难度) 描述 给定一个字符串&#xff0c;将连续相同的字符…

HI3559A DMEB试玩

HI3559A DMEB试玩 1、 不支持himm命令2、 默认ip设置3、 设置登录密码4、 不支持telnet登录5、 不支持ftp7、 命令行的现实格式修改9、 IIC例程不通10、 HI3559a从emmc启动&#xff0c;文件系统变为只读11、 驱动加载12、 官方例程中SENSOR不出图 最近需要使用3559来&#xff0…

程序员常用的27款开发工具以及年度各方向的工具

一、Java 线上诊断工具 Arthas 工具的使用场景&#xff1a; 1、这个类从哪个 jar 包加载的&#xff1f;为什么会报各种类相关的 Exception&#xff1f; 2、我改的代码为什么没有执行到&#xff1f;难道是我没 commit&#xff1f;分支搞错了&#xff1f; 3、遇到问题无法在线…

Redis I/O多路复用机制

1. 多路复用要解决什么问题 并发多客户端连接场景&#xff0c;在多路复用之前最简单和典型的方案&#xff1a;同步阻塞网络IO模型。 这种模式的特点就是用一个进程来处理一个网络连接(一个用户请求),比如一段典型的示例代码如下。 直接调用 recv 函数从一个 socket 上读取数…

vue3+ts 分享海报

安装依赖1. npm install html2canvas --save<div class"flex-box"><div><div v-for"(item,index ) in from.list" :key"index" click"actvieFuntion(index)"><div>{{item}}</div><div :class"…

算法训练营day46|动态规划 part08:完全背包 (LeetCode 139. 单词拆分)

139. 单词拆分 (求排列方法) 题目链接&#x1f525;&#x1f525; 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没…

AIGC之文本内容生成概述(下)—— GPT

GPT&#xff08;GenerativePre-TrainedTransformer&#xff09; 提到GPT模型&#xff0c;就不得不说众所周知的ChatGPT模型&#xff0c;ChatGPT的发展可以追溯到2018年&#xff0c;当时OpenAI发布了第一代GPT模型&#xff0c;即GPT-1&#xff0c;该模型采用Transformer结构和自…

Tableau自学四部曲_Part2:数据连接可视化原理

文章目录 一、数据连接1. 连接类型2. 连接方式3. 提取方式4. 连接筛选5. 保存类型6. 数据处理7. 理解本文的数据 二、可视化原理1. 做个小实验2. 数据是如何变成图表的&#xff1f;&#xff08;1&#xff09;数据变成图表的过程&#xff0c;就是用数据映射到视觉图形的过程&…

180B参数的Falcon登顶Hugging Face,最好开源大模型使用体验

文章目录 使用地址使用体验 使用地址 https://huggingface.co/spaces/tiiuae/falcon-180b-demo 使用体验 相比Falcon-7b&#xff0c;Falcon-180b拥有1800亿的参数量&#xff0c;在智能问答领域做到了Top 1。在回答问题的深度和广度上都明显优于只有70亿参数量的Falcon-7b&…

容器编排学习(二)镜像制作和私有仓库介绍

一 Dockerfile 1 概述 commit的局限 很容易制作简单的镜像&#xff0c;但碰到复杂的情况就十分不方便例如碰到下面的情况需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方法 Dockerfile是一种更强大的镜像制作方式…

蓝牙方案|伦茨科技最新ESL蓝牙电子价签方案

随着电子货架标签市场无线标准的发布&#xff0c;蓝牙技术将协助零售业进行下一阶段的数字化转型&#xff0c;为商店和购物者提供更好的消费体验。电子货架标签提供了精准的自动定价&#xff0c;并增加了对实时促销和产品信息的访问&#xff0c;提供更令人满意且整合的全渠道体…

如何用Java编写代码来等待一个线程join()??

笔者在前面几篇文章中详细的讲解了&#xff1a;线程and进程的区别及其各种对比&#xff0c;如何中断一个线程等文章&#xff0c;接下来本篇文章主要讲解&#xff1a;用Java编写代码来等待一个线程join()&#xff1f;&#xff1f; 线程之间是并发执行的&#xff0c;操作系统对于…

清华开源LLM中英双语对话语言模型ChatGLM2,效果能赶超ChatGPT?

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数.ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,其第二代继承了第一代的优秀特点,并在第一代的基础上,更新了更多的新特性。 更强大的性能: C…

C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)

了解程序环境和预处理 前言&#xff1a;一、程序环境二、编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 三、预处理3.1 预定义符号3.2. #define的使用3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##的用途3.2.5 带副作用的宏参数3.2.6…

数据结构大作业 成绩分析c语言程序设计

界面加载 界面展示 成绩输入 求平均成绩 升序排列 降序排列 名字排序 按名字搜索 按ID搜索 每门课成绩分析 成绩单展示 -

1.6 二次曲面

二次曲面 文章目录 二次曲面知识点1 二次曲面的概念知识点2 常见的二次曲面知识点3 空间曲面小结 知识点1 二次曲面的概念 定义1 三元二次方程&#xff08;二次项系数不全为0&#xff09; A x 2 B y 2 C z 2 D x y E y z F z x G x H y I z J 0 Ax^2By^2Cz^2DxyEyzF…

Windows 12 网页版,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 自 1985 年微软发布第一代 Windows 系统后&#xff0c;其市场占比一直逐步攀升。经过数十年的迭代发展&#xff0c;目前 Windows 已成为全球桌面操作系统的主导者。 今年整个科技行业开始拥…

Canal使用

什么是Canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始&#xff0c;业务逐…