String Buffer和String Builder(String类深入理解)

String在Java里面JDK1.8后它属于一个特殊的类,在创建一个String基本对象的时候,String会向“ 字符串常量池(String constant pool)” 进行检索是否有该数据(字符串)存在,如果存在则向该数据进行实例引用,返回到创建的String对象。
所以当创建两个不同名字,相同字符串的常量时,不可能会有两个不同的存储内存。

String常量,在JDK1.8后便可以任意修改,不会创建新的内存地址对内存应用的浪费。

(常量与常量比较)

String de="你好婷婷";
        String de1=de;
        //这是String常量
        de1="你好婷婷";
//修改de1,检索修改的值,在常量池是否存在一样的
        System.out.println(de==de1);//结果true

 结论:修改常量,修改的时候会在常量池检索是否有相同的字符串存在。有则将这个地址返回给修改的String常量(de1)

String对象,不可以更改。虽然表面String的对象值改变了,但是修改的同时也在内存开辟了新的空间,以前的就空间还存在:造成对堆内存的浪费。

1.(常量与对象比较)

String dee=new String("你好婷婷");
//这是String对象
String de=dee;
//这是String常量
System.out.println(de==dee);

结论: String常量可以指向对象的内存,上面代码已经·有dee对象,当de常量指向dee时,会直接返回内存地址到de,不会开辟新空间。

String de="你好婷婷";
//这是String常量
String dee=new String(de);
//这是String对象
System.out.println(de==dee);//结果为false

结论: String对象不能指向String常量,当创建dee对象的时候,就算不赋值也会在堆里面开辟一个为null的空间。

2.(对象与对象比较)

String dee=new String("你好婷婷");
//这是String对象
String dee1=new String(dee);
//创建新的String对象de
System.out.println(dee1==dee);//结果为false

String de=dee1;
dee1="你好婷婷";
System.out.println(dee1==de);//结果为false

结论: String对象de创建时开辟一个新的空间,并且将dee的字符串赋值到de。String对象也是不能更改的,多次修改只会浪费更多的堆内存。

String Buffer和String Builder:

在我们平时写程序的时候,不免会遇到对String对象的修改,特别是在制作一个GUI程序,会多次使用String对象的方法和对它的修改,于是Java提供了String Buffer和String Builder两个类。

(1)String Buffer和String Builder它们都是可以对String对象修改,且不会创建一个新的堆内存(避免多次修改String对象对内存的极大浪费)。
(2)但是String builder、String buffer类与String类,它们三者不是一个类型的类,并且前两个比String类大个级别(不是个类型就不能直接比较)。
所以实例化它的时候可以直接赋值

//(1)修改

StringBuilder de=new StringBuilder("你好世界你好世界");
de.replace(0, de.length(), "修改以后的值");//替换字符串
System.out.println(de);

//(2)转换StringBuilder de=new StringBuilder("你好世界");
String dee=de+"";
//将StringBuilder转换成String

StringBuffer de1=new StringBuffer(dee);
//将dee类型转换成Stringbuffer类型

String Buffer和String Builder常用方法:

1.append(String e)
追加字符串:在原有的字符串后面继续添加。

      StringBuilder de=new StringBuilder("你好世界");
        de.append( ":修改以后的值");//追加
        System.out.println(de);//输出结果:你好世界:修改以后的值

扩展:appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this

2.delete(int start , int end)
移除序列以内的字符串。

StringBuilder de=new StringBuilder("你好世界");
de.delete(0,de.length());//完全移除
System.out.println(de);

3.replace(int start , int end ,String e)
替换序列以内的字符串

StringBuffer de=new StringBuffer("你好世界");
        de.replace(0,de.length(),"你好婷婷");//完全替换
        System.out.println(de);//输出结果:你好婷婷

扩展:setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)

4.insert(int e,String s)
插入字符串:根据序列号,在序列号对应的字符串后面插入新的字符串

StringBuffer de=new StringBuffer("你好世界");
        de.insert(5,"你好婷婷");//插入
        System.out.println(de);
//输出结果:程序报错,因为序列号是5,但de里面没有第5个

5.reverse()
取反:将字符串全部反转形式取代

StringBuffer de=new StringBuffer("你好世界");
        de.reverse();//fanhuan反转
        System.out.println(de);//结果:界世好你

String Buffer和String Builder的不同之处:

StringBuffer:可变字符串、效率低、线程安全;

StringBuilder:可变字符序列、效率高、线程不安全;

参考:
https://blog.csdn.net/weixin_38405253/article/details/100151578
https://blog.csdn.net/weixin_41101173/article/details/79677982

原文地址:https://www.cnblogs.com/xg-ai-tt/p/12262708.html

时间: 2024-08-29 14:42:54

String Buffer和String Builder(String类深入理解)的相关文章

String Buffer和StringBuilder类-java

Java String Buffer和StringBuilder类 对字符串进行修改时,需要String Buffer和StringBuilder类 能够被多次修改,却不产生新的未使用对象 StringBuilder类,不是线程安全的. 速度优势,要求安全的情况下必须用StringBuffer类 public class Test{ public static void main(String args[]){ StringBuffer sBuffer = new StringBuffer("e

String buffer类

StringBuffer 方法 以下是 StringBuffer 类支持的主要方法: 序号 方法描述 1 public StringBuffer append(String s) 将指定的字符串追加到此字符序列. 2 public StringBuffer reverse()  将此字符序列用其反转形式取代. 3 public delete(int start, int end) 移除此序列的子字符串中的字符. 4 public insert(int offset, int i) 将 int 参

String Buffer 和 String Build学习笔记

public class Concatenation {   public static void main(String[] args) {     String mango = "mango";     String s = "abc" + mango + "def" + 47;     System.out.println(s);   } } /* Output: abcmangodef47 *///:~ 引入一段代码,大家都知道"

JAVA——String类的理解

初学java,看书到String有些地方存有疑惑,参考了http://dev.yesky.com/91/2309091.shtml 自己重新总结一遍: 1.首先String不属于java的8个基本数据类型,String是一个类: 2.new String()和new String("")都开辟了一个内存空间,而不是NULL: 3.String a="hello";     与     new String("hello");   是有区别的: S

[转]C/C++关于string.h头文件和string类

学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用string类时要用到string.h头文件. 我现在看vc的书上也有CString类,这个要包含什么,怎么用? 我现在很迷惑,这两个 string.h有什么区别.是怎么回事 且看一: 这两个一个是标准C库的,定义了一些字符串的处理函数.一个是标准C++库的,定义了标准C++的std::string类

ORA-06502:PL/SQL :numberic or value error: character string buffer too small

今天遇到一个错误提示:ORA-06502:PL/SQL :numberic or value error: character string buffer too small,一般对应的中文信息为:ORA-06502: PL/SQL: 数字或值错误 :字符串缓冲区太小.仔细检查调试过程中才发现是开发人员定义了一个变量,但是在脚本里面赋予了该变量超过其长度的值. 比如: 1: DECLARE 2:  3: c VARCHAR2(3 CHAR); 4:  5: BEGIN 6:  7: c := '

C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:

public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字节从起始于特定偏移量的源数组复制到起始于特定偏移量的目标数组. /// <summary> /// C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法 /// </summary> /// <param name="str&

深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina

错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application

错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.application.Application 出现这种错误的原因其中一种就是 导包时错把其他的String包导入,以至于找不到main(String[ ]  args) 原文地址:https://www.cnblogs.com/mibloom/p/9497357.html