博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String的两种实例化方式的区别?
阅读量:7063 次
发布时间:2019-06-28

本文共 1167 字,大约阅读时间需要 3 分钟。

hot3.png

String是在java编程中用的最多的数据类型,因此也有很多与其他数据类型不同的性质。

创建字符串可以用的命令有:

String str="abc";//创建str字符串,内容为abc。

String str=new String("abc");//创建str字符串,内容为abc。

虽然两种方法都可以创建,但是却有很大的不同。

一、

分析一下这两句命令:

String str="abc";

这句程序的内存分配情况为:

首先在栈内存中为str开辟空间,然后在堆内存中开辟匿名字符串abc的空间,再由str指向abc的空间。这种方法很简单,也很方便,而且在堆内存中也只开辟了一块内容为abc的空间,没有多余的空间。

如果写语句:String str1="abc";创建一个str1字符串,内容同样为abc,那么内存空间的开辟和指向情况为:

可以看到str和str1指向同一块堆内存,这是为什么呢?因为String用的最多,很特殊,因为对于String来讲使用直接赋值的方式会在字符串池中保存内容。如果之后在声明字符串的时候发现内容一样,则不会重新开辟空间,而是从内存池中取出数据继续使用。

二、

String str=new String("abc");

这句程序的内存分配情况为:

这句程序会在堆内存中开辟一块内容为abc的匿名空间,然后再new一块空间,赋值abc,并有str指向这里,这时候匿名空间由于没有栈指向成为垃圾,然后被回收。

结论:可以发现,程序开辟了两个空间,与前一个相比慢多了。所以在开发中绝对不能使用关键字new实例化String类。而且,如果直接使用赋值的方式也可以减少堆内存的开销。

测试代码:

public class Equal {	public static void main(String[] args)	{		String a = "Hello";		String b = "Hello";			String c = new String("Hello");		String d = new String("Hello");						System.out.println(a==b); //true		System.out.println("\n");		System.out.println(c==d); //false		System.out.println("\n"); 		System.out.println(a==c); //false		}}

截图:

170448_diJ7_1791074.jpg

问题:栈为什么比堆要快?

答:参考!(看了那么多的文章、帖子、书,还是不太明白——下次有机会应该问下面试官!)

1.

2.

3.

转载于:https://my.oschina.net/u/1791074/blog/314861

你可能感兴趣的文章
exchange日常管理之十五:报550错误
查看>>
VMware混合云–IaaS三国演义?
查看>>
PowerShell获取特定“描述”的虚拟机IP地址
查看>>
书摘—免费:商业的未来
查看>>
部署Oracle 11.2.0.3 RAC (二)
查看>>
python用zipfile模块打包文件或是目录、解压zip文件实例
查看>>
腾讯从社群端整治淘宝客,90%的淘客群被封
查看>>
Dell最新LSI Raid卡驱动for FreeBSD
查看>>
Linux下判断cpu物理个数,几核,是超线程还是多核心
查看>>
C++ limits头文件
查看>>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
查看>>
艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
查看>>
【TUP第11期】豆瓣网解彦博:好钢用在刀刃上
查看>>
极速理解设计模式系列:8.策略模式(Strategy Pattern)
查看>>
JSTL 自定义
查看>>
java环境变量
查看>>
System.Diagnostics.Debug和System.Diagnostics.Trace
查看>>
android检测当前网络是否可用
查看>>
MYSQL 的一些基本操作
查看>>
安装office2007 1706错误
查看>>