Java中的String类型

1、基本类型和引用类型

在C语言里面,是有指针这么一个变量类型的,指针变量保存的就是所要指向内容的地址。在Java里面,没有了指针的这么个说法,而是换了一个词:引用类型变量。

先说Java里面的基本类型,所谓基本类型,很简单,就是一个数字,一个字符或一个布尔值,数字里面包含整型、浮点型等,没有什么好说的。

再说这个引用类型,他的概念就很像指针了。引用变量的值指向内存空间的引用,就是C中的地址,所在这个地址里面的内容就是要被他引用的对象。

2、String就是一个引用类型

大多数时候,我们在用String的时候,就是这么用的:

String str = "balabala";

直接赋值,简单易懂。

其实,还有下面的三种使用String的方式,利用API里面的String构造方法:

String str = new String(char[] array);

array是一个字符数组,这就很形象了,在array里面字符跟字符是分开的,需要array[i]来获取。

扫描二维码关注公众号,回复: 635398 查看本文章

通过String的这一个构造方法之后,将“字符”给“串”起来了,就变成了字符串。

另外一种构造方式:

String str = new String(char[] array,int offset,int count);

array还是那个字符数组,offset是指数组中的某一个位置,count值数量,综合的意思就是:将array数组中,从第offset个字符开始的,往后数count个字符的“子数组”,串成字符串。

举例:char[] array = {'a','b','c','d','e','f','g'};String str = new String(array,2,3);

此时str就是cde,数组从0开始数。

最后一个,最简单:

String str = new String("abcdefg");

3、基本类型跟引用类型中“等号”的判断区别

int a = 1; int b = 1; system.out.println(a == b);

输出的是true,因为基本类型中,==是进行值的判断。

String str1 = "abc";String str2 = "abc";system.out.println(str1 == str2);

输出的是true,因为引用类型中,==也是进行值的判断?

不,不是这样的,虽然表面上看,好像是这样,但其实不是的,在仔细看一下下面的例子:

String str1 = "abc";String str2 = new String("abc");system.out.println(str1 == str2);

这时输出的就是false了,然而str1、str2的内容是一样的,这是为什么?

这是因为,引用类型的"=="是进行地址值的判断,判断所引用的内容是不是是一个地址,是不是一个地方的。

所以,反过来说,若引用类型的"=="是false,那么俩个引用类型的引用地址是不同的,这就引出了下面要说的内容了。

为什么str1,str2的内容相同,但是是不同的呢?

4、直接赋值创建跟new String创建的区别

在2中说到了使用String的四种方式,1个直接赋值,3个new创建。

(1)String str1 = "abc";

  上面的直接赋值,其实是分成三步的:

  第一步,是将“abc”的这个字符串内容在“堆”中创建出来。

  第二步,将创建出来的“abc”的地址保存在一个叫做“字符串池”的东西里面。

  第三步,将“abc”的地址给str1(即str这个引用类型指向了abc这个字符串所在的内存地址)

  这时候,如果再来一个String str2 = "abc";

  java会先去字符串池寻址查找是否有这么一个字符串也叫“abc”,如果没有,参见上面三步操作。很明显,我们刚刚创建过,肯定能找到,然后将查找得到的地址也赋给str2。

(2)String str1 = new String("abc");

  当使用new的时候,不管内容是什么,不会执行上面的三步,直接在堆中创建一个传新版本的字符串,将字符串abc的地址(假设0x001)再给str1。

  这时候再来一个:String str2 = new String("abc");则字符串abc的地址(假设0x002)给str2。

(3)所以,直接赋值的string,如果值相同,那么引用的地址也相同。

  而,new出来的,不管值的内容相不相同,地址必然不同,这就是为什么3里面的str1==str2是false的原因了,来张图:

  

猜你喜欢

转载自www.cnblogs.com/dlfming/p/9029925.html