`
小牛犊
  • 浏览: 93398 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

臧圩人:JAVA面试题解惑系列(二)——到底创建了几个String对象学习笔记

阅读更多

1.我们常用的创建一个类的实例(对象)的方法有以下两种:

   (1)使用new创建对象。

   (2)调用Class类的newInstance方法,利用反射机制创建对象。

 

2.在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。

 

3.String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

 

4.常量的值在编译的时候就被确定了。

 

5.“==”可以用来比较两个变量:

   (1)如果比较的是两个基本类型(char,byte,short,int,long,float,double,boolean),则是判断它们的值是否相等。

   (2)如果表较的是两个对象变量,则是判断它们的引用是否指向同一个对象。

 

6.由于字符串池中对象的共享能够带来效率的提高,因此提倡大家用引号包含文本的方式来创建String对象,实际上这也是我们在编程中常采用的。

 

7.intern()方法:这是一个本地方法。在调用这个方法时,JAVA虚拟机首先检查字符串池中是否已经存在与该对象值相等对象存在,如果有则返回字符串池中对象的引用;如果没有,则先在字符串池中创建一个相同值的String对象,然后再将它的引用返回。

 

8.(1).栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

   (2).堆(heap):用于存储对象。

 

9.当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'},最后这个新创建的String对象会被添加到字符串池中。如果我们接着执行String b=new String("abc");代码,由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'。

 

10.字符串池中存储的其实也是基本数据类型char的数组或者说序列char[],在String类中将其包装。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics