本文属本人原创,如要转载,请指明出处
http://blog.youkuaiyun.com/rypgood
java里面,String是最特殊的一个类。说它是基本类型,它又不是,说它不是基本类型,又和基本类型很
像,如果不搞清楚,很容易出现一些问题。下面我们来分析它的一些特点。
我们知道,String和int等基本类型一样,可以不用new关键字来对它进行赋值,如:
String s1="abc";
String s2="abc";
下面来了一个问题,问:由以上创建的s2和s2,s1==s2是true还是false?
可能你一不小心就答false了,但是经过你的测试,它是返回true的。
再一个问题:
String s1="abc";
String s2="abc";
以下表达式中得到的结果是什么?
1、s1+s2=="abcabc"
2、s1+"abc"=="abcabc"
3、s1=="ab"+"c";
4、"abc"+"abc"=="abcabc"
你可以自己测试一下,答案是:
1、false
2、false
3、true
4、true
这是为什么呢?
这就要从内存说起了。java的基本数据类型只在栈内存中操作,其中包括char。而String,我们知道,字
符串其实是由字符数组变换而来的,所以String实际上就是一组char串。为了使用的方便,java将String
设计成可以由栈内存中存储字符串对它进行赋值。由于栈内存中的内容是唯一的,所以当s2被赋成"abc"
时,并没有新创建一个字符串;两个无引用的字符串进行加法操作,它是在栈中进行的,即把它当作基本
数据类型来对待,所以第3和第4个表达式是true。但是两个字符串进行加法操作时,有一个为有引用的类
型时,它们的加法操作将被放到堆中进行。这就是为什么1和2两个表达式为false了。
(关于栈内存和堆内存的内容可以到网上查找,这里不再说明。)
另外还要注意的是,String是不可变的,就是说,对某个字符串进行任何操作都不能改变它的内容。