String类为什么可以直接赋值
在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念
字符串常量池
String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符创常量池中。
使用String直接赋值
String str = “abc”;可能创建一个或者不创建对象,如果”abc”在字符串池中不存在,会在java字符串池中创建一个String对象(”abc”),然后str指向这个内存地址,无论以后用这种方式创建多少个值为”abc”的字符串对象,始终只有一个内存地址被分配。==判断的是对象的内存地址,而equals判断的是对象内容。通过以下代码测试:
String str = "abc";
String str1 = "abc";
String str2 = "abc";
System.out.println(str==str1);//true
System.out.println(str==str2);//true
也就是str、str1、str2都是指向同一个内存地址。
使用new String 创建字符串
String str = new String(“abc”);至少会创建一个对象,也有可能创建两个。因为用到new关键字,肯定会在堆中创建一个String对象,如果字符池中已经存在”abc”,则不会在字符串池中创建一个String对象,如果不存在,则会在字符串常量池中也创建一个对象。
String str = new String("abc");
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str==str1);//false
System.out.println(str==str2);//false
可以看出来,str、str1、str2指向的是不同的内存地址
使用String拼接字符串
项目中除了直接使用=赋值,也会用到字符串拼接,字符串拼接又分为变量拼接和已知字符串拼接
String str = "abc";//在常量池中创建abc
String str1 = "abcd";//在常量池中创建abcd
String str2 = str+"d";//拼接字符串,此时会在堆中新建一个abcd的对象,因为str2编译之前是未知的
String str3 = "abc"+"d";//拼接之后str3还是abcd,所以还是会指向字符串常量池的内存地址
System.out.println(str1==str2);//false
System.out.println(str1==str3);//true
所以在项目中还是不要使用new String去创建字符串,最好使用String直接赋值。
原文:https://blog.csdn.net/weixin_41098980/article/details/80060200
String类为什么可以直接赋值的更多相关文章
- 《java入门》第一季之类(String类字符串一旦被赋值就没法改变)
毫无疑问,String类是java里面最重要的类之一.因此它有很多方法需要了解和掌握. 字符串一旦被赋值,值就不能发生改变: package cn.itcast_02; /* * 字符串的特点:一旦被 ...
- 088、Java中String类之对象直接赋值
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- String类的两种赋值
java.lang包是java的默认引入包,所以我们不需显式地导包. String s1 = new String("字符串");//创建2个字符串对象,堆中一个,字符串常量池中一 ...
- String类StringBuffer类与StringBuilder类gc垃圾回收
String类的特点 直接赋值和new调用构造方法两种, 直接赋值时会将字符串常量入内存池,当其他变量再赋相同值时,不再在堆空间开辟内存 new构造方法会开辟两块堆内存空间,可以使用intern手工入 ...
- String类的直接赋值和构造方法赋值的区别
直接赋值:只开辟一块堆内存空间,而且保存的字符串可以自动入池,以供其他内容相同的字符串对象使用. 构造方法:开辟两块堆内存空间,有一块成为垃圾,并且字符串的内容无法自动入池,但是可以使用String类 ...
- 面试题:String类通用构造,拷贝构造,析构,赋值函数实现
已知 String 类定义如下: class String { public: //通用构造函数 String(const char* str = NULL); //拷贝构造函数 String(con ...
- 20140702 赋值构造函数的形参为什么一定用引用。string类的赋值运算函数的注意点
1.复制构造函数为什么一定要用引用,而不是用值 类名::复制构造函数(类名&引用名) 传递引用,可以避免复制,如果一个数据相当大的化,进行复制会浪费很多时间的. 类名::复制构造函数(类名 变 ...
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- C++ string类的实现
c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ...
随机推荐
- $\infty$-former: Infinite Memory Transformer
目录 概 主要内容 如何扩展? 实验细节 Martins P., Marinho Z. and Martins A. \(\infty\)-former: Infinite Memory Transf ...
- 美和易思 MOOT去鼠标检测,快进,倍速,自动下一章
F12 放到 console 直接运行即可 或者油猴添加新脚本 核心去除网页绑定焦点事件代码: if (!-[1,] && !window.XMLHttpRequest || navi ...
- shc命令
今天在公司看到业务系统有一个query.viewtx 等等命令.虽然不知道是什么语言写的,但是里边内容是看不到的. 如果是编译型语言这样的结果 我并不奇怪.但是如果我们写了一个shell脚本 如果加密 ...
- 初识python 之 兔子生崽(小练习)
题目:有一对兔子,从出生后第三个月起每个月都生一对小兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子不死,每个月的兔子总数为多少?思路分析: 月份 兔子数 规律1 2 2**12 2 2**13 ...
- nginxWebUI
nginx网页配置工具 github: https://github.com/cym1102/nginxWebUI 功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, ...
- Linux如何对文件内容中的关键字进行查找
如果是用vi打开文件后,在命令行下输入"/关键字"如果是在没有打开文件的前提就用"cat 文件名 | grep "关键字"
- sqoop的使用之import导入到HDFS
原文链接: https://www.toutiao.com/i6772128429614563843/ 首先我们已经安装好sqoop了,如果没有安装好参考文档<快速搭建CDH-Hadoop-Hi ...
- PPT制作图片磨砂玻璃艺术效果
如果图片损害,点击链接:https://www.toutiao.com/i6488928834799272462/ 选择"插入"选项卡,"图像"功能组,&quo ...
- html手机调试
长话短说 npm install anywhere -g 安装好后,cmd 命令 进入你要调试html页面的目录,运行 anywhere AnyWhere 静态文件服务器 软件简介 AnyWhere是 ...
- 学习笔记--Java中的变量
Java中的变量 /** * 关于 Java 语言当中的变量: * * 1. 什么是变量? * - 变量的本质上来说是内存空间,这块空间有(数据类型.名字.字面值) * - 变量包括三部分:数据类型. ...