Java中string的特性

StringBuffer-append用法 查询文档可知,append的类型,虽然有很多,但我们常用的不多。 public void test1() { String w="hell";// 将 char 参数的字符串表示形式追加到此序列 char e='o'; StringBuffer buffer=new StringBuffer(w); StringBuffer append = buffer.append(e); System.out.println(append); } public void test2() { 阅读详情

 一、创建。

  好了,知道String是非可变类以后,我们可以进一步了解String的构造方式了。创建一个Stirng对象,主要就有以下两种方式:

  java 代码

  1.String str1 = new String("abc");

  2.Stirng str2 = "abc";

  虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。看下面的例子:

  java 代码

  1.String str1 = new String("abc"); //jvm 在堆上创建一个String对象

  2.

  3.//jvm 在strings pool中找不到值为“abc”的字符串,因此

  4.//在堆上创建一个String对象,并将该对象的引用加入至strings pool中

  5.//此时堆上有两个String对象

  6.Stirng str2 = "abc";

  7.

  8.if(str1 == str2){

  9.         System.out.println("str1 == str2");

  10.}else{

  11.         System.out.println("str1 != str2");

  12.}

  13.  //打印结果是 str1 != str2,因为它们是堆上两个不同的对象

  14.

  15.  String str3 = "abc";

  16.//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”

  17.//因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用

  18.  if(str2 == str3){

  19.         System.out.println("str2 == str3");

  20.  }else{

  21.         System.out.println("str2 != str3");

  22.  }

  23.//打印结果为 str2 == str3

  再看下面的例子:

  java 代码

  1.String str1 = new String("abc"); //jvm 在堆上创建一个String对象

  2.

  3.str1 = str1.intern();

  4.//程序显式将str1放到strings pool中,intern运行过程是这样的:首先查看strings pool

  5.//有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至

  6.//strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会

  7.//被GC收集。

  8.

  9.//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”

  10.//因此直接返回str1指向的对象给str2,也就是说str2和str1引用着同一个对象,

  11.//此时,堆上的有效对象只有一个。

  12.Stirng str2 = "abc";

  13.

  14.if(str1 == str2){

  15.         System.out.println("str1 == str2");

  16.}else{

  17.         System.out.println("str1 != str2");

  18.}

  19.  //打印结果是 str1 == str2

  20.

  为什么jvm可以这样处理String对象呢?就是因为String的非可变性。既然所引用的对象一旦创建就永不更改,那么多个引用共用一个对象时互不影响。

  比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。是不是有所感悟了?对,String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和 String在这种情况下的表现是相同的

  所以如下程序输出 1234

  public class Test {

  public static void changeStr(String str){

  str="welcome";

  }

  public static void main(String[] args) {

  String str="1234";

  changeStr(str);

  System.out.println(str);

  }

  }


9 海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例 海康视觉平台VisionMaster 上手系列:典型案例之螺丝机案例 快速入门 工业机器视觉 机器视觉 阅读详情

相关推荐

Java 22 | 11】 深入解析Java 22 : String API 增强特性

Java 22 对 String API 进行了多个增强,旨在提高字符串处理的性能和灵活性。这些改进使得字符串操作更加高效,同时也引入了一些新的功能,增强了开发者的使用体验。

颜淡慕潇 1万+

Stringbuffer 的append()和String“+“的区别

Stringbuffer是动态字符数组,可以用append()来组合两个字符串 StringBuffer a=new StringBuffer("Hello "); String b = "LiSi"; a.append(aString); 这个操作表示将b的索引追加到StringBuffer对象a中,也就是在内存中将b地址接到a地址后面。然后buf对象就会包含字符串"Hello LiSi "。 而a+b虽然和上面打印效果一样,a对象和b对象存在与他们原来的地址内存地址内存 。 ...

m0_52261367的博客 960

【26美赛B题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

2026美赛数学建模B题解析与备赛指南:本文针对B题"数据+预测+决策优化"的特点,提出通用建模路线图,包含数据预处理、特征工程、预测模型构建、策略优化和稳定性验证等关键环节。提供赛题拆解方法、Python/Matlab双实现方案、AI辅助建模技巧及论文写作模板。适用于2026美赛B题参赛者及其他数学建模竞赛选手,帮助掌握从数据到决策的闭环建模流程,特别强调逻辑严谨性和结果可视化呈现。订阅者可获取历年真题解析和持续更新的备赛资源。

一键难忘的博客 1996

StringBuffer类中的append方法

StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。 append方法 public StringBuffer append(boolean b) 该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如: St...

weixin_46353892的博客 1万+

StringBuffer和StringBuilder的append机制

StringBuffer和StringBuilder扩容机制的基本规则如下:● 如果一次追加的字符长度超过了当前设置的容量,则会按照 当前容量*2+2 进行扩容;● 如果一次追加的长度不仅超过了初始容量,而且按照 当前容量*2+2 扩容一次还不够,其容量会直接扩容到与所添加字符串长度相等的长度;● 之后如果还要再追加新的字符内容,依然会按照 当前容量*2+2 进行扩容。

qq_44432953的博客 2089

StringBuffer的append()源码分析以及适用场景

在牛客网上做了一道题: 答案是StringBuffer以及StringString不用说,是字符串常量类。但是StringBuffer是常量类,用了这么多年我还是才知道,今天研究一下StringBuffer类。首先,我是带着以下几个问题研究的: (1)StringBuffer 使用final修饰,为什么可以拼接字符串,改变内容? (2)为什么打印StringBuffer对象打印的是拼接后的值,而不是StringBuffer对象? (3)使用StringBuffer 的优势在哪里?什么情况下使用

CAT 2742

java string 特性_JAVA 中关于String特性

一、初始化String的两种方式String str1 = "hello";String str2= new String("hello");第一种方式本质上是声明了一个String的匿名对象,然后str1指向该对象。该匿名对象保存在对象池中。第二种方式分为两步:1) 声明一个"hello"的String对象2) new 关键字申请新的内存,将该内存分配String对象,并将值"hello"分配给...

weixin_42509815的博客 244

java_String对象特性2

java_String对象特性2

m0_59605707的博客 130

Java String 只读特性

public class Test {      public static void changeStr(String str1 ){          str1="welcome";      }      public static void main(String[] args) {          String str ="1234";          changeS

向着全栈前进 2183

java_String对象特性1

java_String对象特性1

m0_59605707的博客 122

Java String特性深度解析:你真的会用String

一、String的不可变性:核心设计哲学** Java将`String`设计为不可变对象,这一决策贯穿其整个生命周期,是理解Java字符串机制的基石。以下从多个维度解析其设计原因及实现细节: ##### **1.1 安全性考量** - **参数传递防护**:`String`常用于网络连接、文件路径、数据库URL等敏感场景。若可变,恶意代码可通过反射修改字符串内容(如将`"file.txt"`改为`"malicious.exe"`),导致未授权访问。 - **类加载机制保护**:Java类加载器依赖字符串常

2401_83923080的博客 994

解析Java中的StringStringBuffer与StringBuilder:性能与特性的较量

String不同,StringBuffer是可变的,你可以在其上执行添加、删除和插入操作,而无需创建新的对象。然而,当你需要进行大量的字符串拼接操作时,String可能会带来性能问题,因为每次拼接都会创建一个新的String对象,这将导致大量的内存分配和垃圾收集。然而,在单线程环境中,由于省去了线程安全性的开销,StringBuilder的性能通常优于StringBuffer。但是,通常情况下,你会发现StringBuilder的性能最好,其次是StringBuffer,而String的性能最差。

让每一行代码都有改变世界的力量 1031

Java中的String对象特性

1. 首先String不属于8种基本数据类型,String是一个对象。   因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。   2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;   3. String str=”kvill”; String str=new S...

(Never Give Up)--(我的知识点滴) 182

java string 特性_Javastring特性

一、创建。好了,知道String是非可变类以后,我们可以进一步了解String的构造方式了。创建一个Stirng对象,主要就有以下两种方式:java 代码1.String str1 = new String("abc");2.Stirng str2 = "abc";虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个St...

weixin_39875629的博客 122

java String字符串特性

优化等价 String a = "helloabc";重要规则 String c1 = "ab" + "cd";//2. 字符串时不可变的 一个字符串对象一旦被分配 其内容是不可变的。//1. String 是一个final类 代表不可变的字符序列。2. 执行 sb.append("hello");//以上创建三个对象。

2301_80783457的博客 404

[面试必备]StringBuffer的append 源码解析

目录 前言 源码 append toStringCache append数字的源码 append 字符串的源码 ensureCapacityInternal 扩容的新的容量计算函数newCapacity debug过程 前言 因为有面试官问到,StringBuffer是怎么实现append的; 简述一下思路就行 那么想到的肯定是动态数组哇,但是我想的是,不用每次都new 一个数组; 不用频繁的移动字符串数组。 基本描述是ok的~但是看看源码没毛病 dkdk 加油加油,后面再写

新一的技术笔记 792

findbugs常见错误总结

一、前置说明:   官网提供了所有的bug描述信息:官网bug描述链接 ,根据findbugs扫码结果中的关键字搜索即可找到bug的描述信息甚至是修复方案。 二、findbugs常见错误 Method concatenates strings using + in a loop (SBSC_USE_STRINGBUFFER_CONCATENATION) 错误的示范如下:字符串拼接性能太差。应改...

麦田里的码农 9064

StringBuffer常用方法

注:StringBuffer是线程安全的,性能低于StringBuilder +构造函数 StringBuffer() 构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。 StringBuffer(CharSequence seq) 构造一个包含与指定字符相同的字符串缓冲区。 StringBuffer(int capacity) 构造一个字符串缓冲区,其中没有字符,但是包含指定的...

书香水墨 1万+

Java常用类库--StringBuffer:append、insert、reverse、replace、subString、delete、indexOf

1、认识StringBuffer 1.1字符串连接 操作append append方法返回StringBuffer类的实例化类对象。 public class StringBufferDemo01{ public static void main(String args[]){ StringBuffer buf = new StringBuffer() ; // 声

吴英强的技术博客 8632

智慧化工园区总体设计方案Word(552页).docx

在当今化工行业转型升级的大潮中,智慧化工园区作为推动绿色、创新、高质量发展的关键力量,正逐步成为行业发展的新趋势。随着国家政策的不断引导和推动,智慧化工园区的建设已不仅仅是提升管理服务水平的手段,更是实现安全生产、环境保护和应急响应能力全面提升的重要途径。从提升重大危险源监测、隐患排查到完善风险分级管控机制,智慧化工园区利用信息化、智能化技术,构建了一个全方位、多层次的安全、环保、应急救援一体化管理平台。智慧化工园区以安全、便捷、高效、节能、物联为核心理念,通过深度融合云计算、物联网、人脸识别、大数据分析、人工智能等先进技术,实现了园区生产、车辆、人员、环境、能源等关键环节的智能化管理。在基础网络方面,园区不仅实现了全千兆光纤接入,还覆盖了5G信号、NB-IoT信号和WiFi网络,为万物互联提供了坚实的基础。智慧安监作为园区的核心板块,通过企业安全云服务、安全文化宣传教育、舆情信息监管、风险分级管控、隐患排查治理以及重大危险源管理等功能,构建了从源头到末端的全过程安全监管体系。特别是企业一张表功能,实现了企业档案的数字化管理,为精准施策提供了有力支持。此外,智慧园区还通过物联网监测预警系统,利用智能终端设备对园区内的各类风险进行实时监测和预警,确保园区安全无虞。在智慧节能与环保方面,园区通过智能仪表监测电、水、冷、气等能耗数据,实现能源管理的精细化和节能减排。智慧应急系统则融合了指挥调度、辅助决策等功能,能够在突发情况下迅速响应,有效处置。智慧环保系统则利用物联网技术和大数据分析,实现了环境质量的自动监测和预警,为环保部门提供了精准的执法依据。同时,智慧物流、智慧安防、智慧楼宇等系统的引入,进一步提升了园区的智能化水平和运行效率。这些系统的集成应用,不仅让园区的管理更加便捷高效,还极大地提升了园区的整体竞争力和可持续发展能力。对于正在筹备或优化智慧化工园区建设方案的读者来说,这份解决方案无疑提供了宝贵的参考和灵感,让智慧化工园区的建设之路变得更加清晰和有趣。

上一篇: getClass(),getName(),toString()各种用法
下一篇: String.getBytes()方法中的中文编码问题
superxgl
博客等级 码龄18年 100粉丝 166原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值