java-String类两种实例化方式以及其区别
前言:String是字符串类型,但是在Java中并没有定义这种数据类型。但它可以像基本数据类型一样使用。但是它本质还是创建一个对象。
一、实例化方式
1、直接实例化对象
像基本数据类型一样也可以直接进行实例化。比如:String a = "abcd";
2、构造方法实例化对象
String str = new String("abcd");
二、两种的区别
1、直接实例化
创建了一个栈空间跟一个堆空间。但是直接实例化对象Java会将此字符串使用的匿名对象自动入池保存(字符串对象池),在下次在新创一个String类的对象入池保存且内容相同时会直接引用已有的内容,所以在这种情况下内容相同的情况下就只开创一个空间就是栈空间,栈空间保存的内容就是跟它内容相同的引用地址,这样就可以做到节省内存了。
如:
这个图片的第八行跟第十行是下面的构造方法实例化对象的实验
2、构造方法实例化对象
直接创建两个两个空间,而且不会自动入池保存。也就是说不管对象的内容跟对象池里面的没有一毛钱的关系。但是可以手动入池保存,String str = new String(“abcd”).intern();。
如:
上面两张图“==”比较的是内容堆空间的地址。如果想要比较的是对象的内容那就用String提供的方法equals()。
如:
这个时候就不是比较堆内存的地址了,而是直接比较里面的内容。
新手发表,如果有大佬指点一下缺点我还是挺开心的。讲的不好也可以指出来评论一下,我改进。