String类的特殊之处

1。这个类的实例可以直接赋值,为什么如此,虚拟机对他进行了特殊处理有string pool
2。让我们可以收入理解==与equals
3。还有特殊的intern方法

String s1=new String("aaa");
String s2=new String("aaa");
System.out.println(s1==s2);
String s3="aaa";
String s4="aaa";
System.out.println(s3==s4);
System.out.println(s1==s4);
String s5="hello";
String s6="hell";
String s7="o";
System.out.println(s5==s6+s7);
System.out.println(s5=="hell"+"o");
System.out.println(s3.equals(s4));


测试结果:
false
true
false
false
true
true

原因如下:

==怎么用
原生数据类型,比较两边的值是否相等
对于引用,比较左右两边的引用是否指向同一个对象,或者说引用地址是否相同.
equals则不同
判断内容相等否,前面==只是里面第一个判断,如果等,他直接返回,不等就继续判断下面的

equals定义在Object里面,java每个类都会具有这个方法,但这个里面只是判断引用地址是否相等.
为什么具有作用呢?关键在于重写了....
Object里面本来也没什么属性之类的,怎么判断,不这样你要人家怎么样.

字符串是常量,一旦确定就不能改变 用+号是创建一个新的字符串引用指向它,而不是原有字符串的追加.

String pool(字符串池)
首先检查字符串池里面有没有这个,将已经存在的返回赋值给它,不存在则在池中创建一个,然后赋值给它.
String s1="aaa";
Stirng s2="aaa";
s==s2 true
如果是new则不一样
首先看string pool里面是否有
没-->>在pool里面创建,然后在堆中创建一个对象,然后将堆中的地址放回来,赋值给它

有-->>不在创建,直接在堆中创建,然后将堆中的地址直接赋值给它


String ss1=(String)str;
String ss2=ss1.intern();
System.out.println(ss2==ss1);
System.out.println(ss2=="zilei");


结果如下
false
true

原因:
这个方法返回的是字符串池中与他相等的那个字符串的地址.

首先equals方法对比,我们看jdk源码就知道,Object类的equals方法跟==没有任何区别,虽然我们都在说equals是比较内容相不相等,可惜在这个顶层类中,jkd没有实现什么
测试如下
Object o1=new Object();
Object o2=new Object();
System.out.println(o1==o2);
System.out.println(o1.equals(o2));
为什么等于false不是内容相等吗
源代码 return (this == obj);说明一切
但我们通常用到的String则不一样,这是String类重写了这个方法

我们自己创建一个类,如果不重写这个方法就还是==跟equals没什么区别,Object里面的方法,我们用到的类直接或者间接继承了它,然后自然也有了这些方法,比如toString(),Object里面只是打印出地址而已,String类实例调用就打印出了字符串,这是它重写了

继承中的转型问题
不向下转型不能调用子类中的方法.只能调用父类中的,但是在运行中,如果子类重写了这个方法,则调用子类的
Object str=new String("zilei");
//调用的是子类的
System.out.println(str.equals("zilei"));
如果要使用子类的方法必须String str1=(String)str;强制转换
此时可以调用子类的方法.

没有向上转型,直接强制转换
Object str=new Object();
String str1=(String)str
肯定不行,发生类型转换异常.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值