java中的String 类型易错点总结(相等比较和传值问题)

---------------------- android培训java培训、期待与您交流! ----------------------

毕老师视频看了一个月了,发现前面的东西很容易忘记。Java知识点真的是很多很碎,一定要时常的对前面的知识点进行复习总结才行,今天就对String中易错易混淆的知识点进行个总结。

1new String()new String(“”)都是声明一个新的空字符串,是空串不是null

2String str=”kvill”
String str=new String (“kvill”);
的区别:

简单引入常量池这个简单的概念。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

看例1:

String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );


  结果为:

true
true

Java会确保一个字符串常量只有一个拷贝。s0,s1,s2都是常量池中”kvill”的一个引用

new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。

看例2

String s0=”kvill”;
String s1=new String(”kvill”);
String s2=”kv” + new String(“ill”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );


  结果为:

false
false
false

4 String.intern()

  存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。Stringintern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;

例3

String s0= “kvill”;
String s1=new String(”kvill”);
String s2=new String(“kvill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //
把常量池中“kvill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );


  结果为:

false
**********
false //
虽然执行了s1.intern(),但它的返回值没有赋给s1
true //
说明s1.intern()返回的是常量池中”kvill”的引用
true

5)关于String是不可变的

  这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”;
就是有4个字符串常量,首先”kv””ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和“ans”生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String不可变产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的

6参数传递问题

结论:

String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。在参数传递时,包装类采用的是传值的方式,而不是传地址的方式,所以函数中的值改变并不会影响原来的值。

而StringBuffer 采用的是引用传递的方式。

例1

String str = new String (“original”);

changeString (str) {str=str+ “ is changed!” }
System.out.println(str); //
这时str的值仍然是original

例2

StringBuffer strBuf = new StringBuffer(“original”);

changeStringBuffer(strBuf) {strbuf.apend(“ is changed!”)} //
改变送进的StringBuffer变量

System.out.println(strBuf); //这时strBuf的值就变为了original is changed!

 

---------------------- android培训java培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值