一:String实例化的方式一:
String实例化的方式:
方式一:通过字面量定义的方式(即直接赋值的方式);
方式二:通过new + 构造器的方式;
1.特性:
1.String声明为final的,不可继承的;
2.String实现了Serializable接口:表示字符串时支持序列化的;String实现了Comparable接口:表示String可以比较大小;
3.String 内部定义了final char[] value 用于存储字符串数据;
4.String:代表不可变的字符序列,简称 不可变性
- 当字符串重新赋值时,需要重写指定区域内赋值,不能使用原有的value进行赋值。
- 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能在原有的value上进行赋值。
- 当调用string的replace()方法时,也必须重新指定内存区域赋值。不能在原有的value进行赋值。
5.通过字面量的方式(即:new的方式)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会存储相同内容的字符串的。(即不会在常量池中开辟两个空间存储相同的内容)
2.内存实现:
如果s1再赋值hello,则会重新在方法区开辟一个空间,s1指向这个空间的地址。而不是在它本身改变。
以上是针对String实例化的第一种方式
二:String实例化的方式二:
1.内存实现:
我们先来看一道题;
这样既基本明白new一个String对象和直接通过赋值的方式创建String的区别。
理解了上面的图,则下面四道题便很简单。
扩展一下:
在面向对象中经常有创建对象时用到string
我们来分析一下这内存结构:
2.面试题:
String s = new String(“abc”);方式创爱对象,在内存中创建了几个对象?
两个:一个是在堆空间中new结构,另一个是在char[]对应的常量池中的数据:“abc”
第二个题:
根据此图的题,我们引入三个结论:
1.常量与变量的拼接在常量池中,并且常量池中不会存在相同的常量;
2.只要其中有一个变量,结果就在堆中;
3.如果拼接的结果调用intern()方法;返回值就在常量池中;
第三道面试题:
这道题主要是考察值传递。
当传参的时候另一个str进栈指向test ok 然后随着函数被调用完毕,最上面的str便出栈,随意最后str仍然是good。