很多小伙伴在学习String类的时候都是觉得很简单,但是有一些面试题只能靠死记硬背来解决,不能理解原理,这边文章就会针对原理来使我们更好的理解
首先看一下经典的string面试题,通过面试题来深刻的理解
- String是否可以被继承?
这个问题就很简单了,因为使final修改,java定义不能继承
- String str = ”Hello”; str = str+”world!”;这两句代码执行后,原始的String对象中的内容变没?
首先String str = ”Hello”会在字符串常量区查找"Hello"这个字符串,如果找到的话就会直接指向这个地址,
而不会新创建一个,然后str = str+”world!”,此时str会指向Helloworld,之前Hello还会继续存在,
所以之前的内容是没有变的
- String str=new String(“Hello”);创建了几个String Object?二者之间有什么区别?
两个或一个,
”Hello”对应一个对象,这个对象放在字符串常量缓冲区,有自己的地址常量”Hello”不管出现多少遍,都是缓冲区中的那一个。
New String每写一遍,就创建一个新的对象,它一句那个常量”Hello”对象的内容来创建出一个新String对象。
如果以前就用过’Hello’,这句代表就不会创建”Hello”自己了,直接从缓冲区拿。所以是两个或者一个。
- String str = "hello"; String str2 = "hello";判断str和str2是否相等
创建String时会在字符串常量区查找hello这个字符串,如果已有的话直接指向这个地址,而不会重新创建,所以
str和str2指向的同一个地址
System.out.println(str==str2); //true,比较的是地址值
System.out.println(str.equals(str2)); //true String重写了equals这个方法,所以比较的是属性
- String str = new String("aaaa"); String str2 = new String("aaaa");判断str和str2是否相等
此时会创建两个对象,在堆中new了两个个string str和str2,然后在字符串缓冲区中创建了一个常量aaaa
,
System.out.println(str4==str5);//false 堆中有两个字符串,所以地址值不同
System.out.println(str4.equals(str5));//true //String重写了String重写了equals这个方法,所以比较的是属性
- String构造方法
String的构造方法在jdk的文档中有很多种,但是我们在实际的开发中都是只会使用String str = "hello"来书写,但是如果有大量的字符串而且要经常修改的话就会造成内存很大的开销。 每次定义一个tring字符串,首先会到字符串常量区查找是否存在,如果存在的话就会直接指向这个地址,而不会新创建一个,方法中所有""都会声明一个string,所以如果已经知道string会经常变化的话,建议使用 StringBuilder来操作字符串,因为 StringBuilder是允许改变值的,从始至终只会有一个StringBuilder,String不可变,多个的话会有多个存在,非常消耗内存!!