在学习的java的String对象时,我们都知道创建String对象有两种方法,一种是通过使用构造方法建,一种是直接赋值的方式创建,但是这两种方法在创建String对象时的区别,和他们创建对象的个数到底是几个,这对于初学者来说恐怕还是一个迷,下面我就和大家来探讨一下这两个问题,这也是在java面试中常见的面试题之一.
我们知道在java中,堆主要用来存放对象,栈主要用来存放基本数据类型和对象的引用,数据可以共享,存取速度仅次于寄存器,快于堆.但是对于String类型,又多出了一个比较特殊的,String库.用于存放String对象,下面我们通过几个实例讲解,他们三都之间的关系.
1,String s=new String("abc")当执行这一句时生成几个String对象?它们分别存入在那里?
生成两个String对象!为什么呢?这是由于String对象多了一个String库的原因,在java中每次创建String对象时,都会首先到String库中寻找有没有和字符串值想同的对象,如果有就不会在String库里创建这个对象,而直接到堆里创建一个对象.所以当我们第一次执行String s=new String("abc")时,String库里没有存在abc这个对象,所以在String库里创建了这个对象后,又到堆里创建了一个,故生成了两个对象.
2,String s="abc"和String s="cde"分别创建了几个对象,存放在那里?
当执行String s="abc"时,没有创建新的对象.为什么呢?因为我们在上面执行了String s=new String("abc")这一句,在String库里已经生成了一个abc的对象,所以当执行String s="abc"时,在String库里找到了abc,就直接返回了这个地址给S,而不在到堆里创建一个新的对象.这也是String s=new String("abc")和String s="abc"的区别,一个需要到堆里在创建一个对象,一个只在String库里创建对象.
当执行了String s="cde"时生成了1个对象,为什么呢?原因是String库里没有这个对象,所以在String库中创建了一个新对象,后就直接返回了这个对象的地址,而不在去堆里创建一个新的对象.
3,String s=new String("abc")当执行这一句时生成几个String对象?它们分别存入在那里?
生成一个对象,存放在堆里,为什么呢?在String库里已经存大了abc对象,所以只在堆里创建一个对象.这里要注意一下,在java中使用new来创建对象时,每new一次都会生成一个新的对象,不管你堆里有没有存在这个对象.
另外在有几种情况,在此就不作讲解,请大家自己去做实验吧
String s="a"+"bc"
String a="ab"
String b="cd"
String c="abcd"
String d=a+b
String e=a+"cd"
String f="ab"+b
.........
大家自己下去实验一下,这同和情况下又生成了几个对象.如果不清楚的请留言