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
String Buffer和String Builder(String类深入理解)的更多相关文章
- String、String Buffer、String Builder
对于String.String Buffer.String Builder:我一直都只知道String是字符串常量,后两者是字符串变量: String和String Buffer是线程安全的,Stri ...
- 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,一般对应的中文信息为:O ...
- C/C++关于string.h头文件和string类
学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用s ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- java中的BigDecimal和String的相互转换,int和String的类型转换,Integer类和String相互转换
一: /*由数字字符串构造BigDecimal的方法 *设置BigDecimal的小数位数的方法 */ 注:BigDecimal在数据库中存的是number类型. import java.math.B ...
- 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
- 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.应用程序类必 须扩展javafx.application.Application”
用eclipse写代码的时候,写了一个简单的程序,编译的时候突然出现“错误: 在类 com.test.demo 中找不到 main 方法, 请将 main 方法定义为: public static v ...
随机推荐
- Ubuntu P40显卡配置CUDA 10.1,CUDNN 7.6,Conda 5.2.0, Tensorflow-gpu 1.8
1. 安装CUDA 禁用nouveau vim /etc/modprobe.d/blacklist.conf 最后两行加入 blacklist nouveau options nouveau mode ...
- [Python] 前程无忧招聘网爬取软件工程职位 网络爬虫 https://www.51job.com
首先进入该网站的https://www.51job.com/robots.txt页面 给出提示: 找不到该页 File not found 您要查看的页已删除,或已改名,或暂时不可用. 请尝试以下操作 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hdfs分布式文件系统安装
实验目的 复习安装jdk 学习免密码登录 掌握安装配置hdfs集群的方法 掌握hdfs集群的简单使用和检查其工作状态 实验原理 1.hdfs是什么 hadoop安装的第一部分是安装hdfs,hdfs是 ...
- MySQL优化(四)——读写分离
1.MySQL高可用 主从复制 一主多备 多主多备 读写分离 减少IO开销,防止阻塞等等 2.主从复制参考 https://www.cnblo ...
- Android中的消息处理机制
安卓中的消息处理机制主要涉及到5个概念 (1)消息类:Message,可以理解成一个数据单元: (2)消息队列类:Message Queue,存放通过Hander发布的消息,处理顺序类似于队列,按照先 ...
- linux服务基础之编译安装nginx
nginx源码下载地址: http://nginx.org/download/nginx-1.16.0.tar.gz //根据需要下载其他版本 1. 下载nginx # wget http://ngi ...
- LeetCode刷题 --杂篇 --数组,链表,栈,队列
武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...
- 工控安全-PLC指纹提取的几种方法
前言:PLC为可编程逻辑控制器,采用S7协议.其硬件本身存在许多漏洞,可以利用kali里面的漏洞模块或者modbus工具对其进行攻击,甚至直接可以进行未授权访问,只要其开启对外网的端口服务,那么我们就 ...
- 视频格式转换mp4
第一步:https://ffmpeg.zeranoe.com/builds/下载ffmpeg 或者:百度云下载: 链接:https://pan.baidu.com/s/1x_QogbV8xFjkYTe ...
- H5_0018:z-index失效的原因
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效. 在CSS中,只能通过代码改变层级,这个属性就是z-index, 要让z-index起作用有个小小前提,就是元素的p ...