zoukankan      html  css  js  c++  java
  • java中“==”和equals方法的区别,再加上特殊的String引用类型

    ==和equals的区别:

    1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的

    2.进行比较时,分为  基本数据类型  的比较和  引用数据类型 的比较

        基本数据类型:两者都是比较的

        引用数据类型:两者比较的是在栈内存中的地址

    3.特殊的:对于像String这种对equals方法进行重写的引用数据类型,equals比较的是,而不是地址了。


    特殊的String:

        java程序在运行时,会创建一个字符串缓冲池,当使用s1=“abc”这样的表达式创建字符串时,程序首先会在这个String缓冲池中寻找相同值的对象,如果有就将该s1的引用指向这个已经存在的对象;

        当用String s2 = new String(“abc”)时,他明确告诉程序要一个“新的”,于是一个新的"abc"Sting对象被创建在内存中。s1 和 s2 的值相同但是位置不同。

        当s2 = s2.intern();使用这条语句后,它做了个小动作:检查字符串缓冲池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串的引用;如果不存在,该方法会把"abc"添加到字符串缓冲池中,然后再返回它的引用。

    参考博客:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html


    对于下面的代码:

    String s1 = "abc";

    String s2 = "a" + "bc";

    System.out.prinln(s1==s2);

    结果输出:true        原因是:常量进行计算,在编译时就可以确定其值,这也和字符串缓冲池的内容是在编译时确定的原理一致,所以输出为true;

    但对于下面的代码:

    String s1 = "a";

    String s2 = "abc";

    String s3 = s1 + "bc";

    System.out.prinln(s2==s3);

    结果输出:false    原因是:s1是变量,编译时无法确定其值,故不会去查询字符串缓冲池,而是运行时在堆上为其分配空间(“abc”),所以s2和s3的对象地址不同,故为false;


    还有一点需要时刻记得:

    String类是不可变的,也就是说,String对象一旦创建无法改变,如果需要频繁使用字符串连接操作,应该使用StringBuilder(JDK1.5以前使用StringBuffer)来代替String,另外String类重写了equals方法,而StringBuilder和StringBuffer并没有!!       

  • 相关阅读:
    vim
    Linux 软链接和硬链接
    常用命令
    linux 二级目录结构
    关于bash shell的理解
    虚拟机网络模式
    安装虚拟机
    date 命令
    使用3种协议搭建yum仓库
    ubuntu update时发生错误
  • 原文地址:https://www.cnblogs.com/teiba/p/8996507.html
Copyright © 2011-2022 走看看