String与new String()的区别
来源:互联网 发布:北京php培训班 编辑:程序博客网 时间:2024/06/06 03:31
比较
在我们程序中,最常用也最常见的就是String类型,也就是常说的字符串类型,但是常见这样赋值,比如:String str1 = "12345";
String str2 = new String("6789");
这两种方式,所声明的变量是有区别的,区别如下:
String str1 = "12345";
这个申明字符串,会创建一个对象或者不会创建一个对象,这里会出现一个字符串实例池的概念,然后这里也分为两种情况:
1 就是声明的那个字符串已经存在实例池中,这个实例池中存放着很多字符串,如果实例池中已经包含了字符串:12345,所以这种情况的话,语句String str1 = "12345";不会创建对象,而是直接引用池中的字符串:12345
2 如果字符串"12345"在实例池中并不存在,那么刚开始会初始化一个字符串:12345,即创建一个字符串对象:12345,并且把创建好的字符串放到字符串实例池中
总的来说,String str1 = "12345";的实现过程:
首先在栈区创建一个str1的引用,然后在字符串实例池(不同于堆和栈,它是独立的,存储的是不可变化的变量)去查找是否存在字符串的内容是: 12345的对象,如果在字符串实例池中不存在这个对象,则创建一个,然后str1指向实例池中的这个对象,如果存在,则直接将str1指向实例池中的这个对象;如果后面又一个定义字符串变量str3= "12345",则这个str3直接指向实例池中已经存在的 12345,这个时候不再重新创建对象了;如果比较str1 == str3操作,则返回true,因为它们所指向的地址是一样的
String str2 = new String("6789");
对于new String("6789")则不管怎么样,都会创建新的对象,而且创建两个对象,首先在栈中创建一个str2的引用对象,然后在堆中创建一个包含字符串"6789"的对象,str2保存的值是这个包含"6789"的对象的内存地址,即str2指向这个"6789"这个对象;如果后面又有一个对象String str4 = new String("6789");那么这个对象会和上个对象一样,创建两个对象,而不是直接指向str2找个对象指向的对象。
==与equals的区别
==是比较基本数据类型,比如int,long,double等数据是否相等,比较的就是栈中的这个变量的值是否相等,而equals比较的是这个变量中的值所指向的值是否相等,是拿来比较对象之间的值是否相等;
简单来说,==比较的是变量在栈内存中存放的内存地址,而equals比较的是变量在栈内存中存放的内存地址所指向的那个对象的值
实例
当时还有疑问,对于String字符创的创建,后来查找资料,大体上解决了心中的疑问,今天通过实例来说明。
public static void main(String[] args) { String str1 = "abcd"; String str2 = "abcd"; System.out.println(str1 == str2); //true String str4 = "abc"+"d"; System.out.println(str1 == str4); //true System.out.println(str2 == str4); //true String str3 = "abc"; str1 = str3 +"d"; System.out.println(str1 == str2); //false System.out.println((str1+"a")==(str2+"a")); //false System.out.println((str1+"a").equals((str2+"a"))); //true String str5 = str1+str2; String str6 = "abcdabcd"; System.out.println(str5 == str6); //false System.out.println(str5.equals(str6)); //true String str7 = str1.concat(str2); System.out.println(str7 == str6); //false System.out.println(str7.equals(str6)); //true }
对于str4 = "abc"+"d"; 是先合并字符串,然后去字符串实例池查找
str1 = str3 + "d"; 这种拼接是通过创建StringBuffer(或者StringBuilder),之后把StringBuffer(或者StringBuilder)转化为String类型,实际上这边new了一个对象,并且是在堆上进行的
(str1+"a")==(str2+"a") 实际上和str1 = str3 + "d";同样的形式
0 0
- new String[] 与new String[] {""}的区别
- String与new String的区别
- String与new String的区别
- String与new String的区别
- String与new String的区别
- String与new String的区别
- String与new String()的区别
- string="" 与 new String()的区别
- String string = ""; 与String string = new String();的区别
- new String("abc")与String a="abc"的区别
- String="" 与new String()的区别
- string与new string跟StringBuffer和StringBuilder的区别
- Collection<String>n=new ArrayList<String>()与List<String>n=new ArrayList()的区别
- String = "" 和 new String("")的区别
- String和New String()的区别
- new String() 和 String 的区别
- String 和 new String()的区别
- Java String 和 new String()的区别
- 添加文字水印
- PhpStorm中的自动补全
- 410c 上安装中文版本的答题器游戏demo
- C++11 中容器相关特性
- 利用scp 远程上传下载文件/文件夹
- String与new String()的区别
- JavaSE_12反射机制
- Kettle安装部署及实例演示
- JavaSE常识类
- servlet中的会话管理
- Windows Server 搭建git远程仓库
- 《将博客搬至CSDN》
- ubuntu16.4休眠问题
- Java内存管理原理及内存区域详解