zoukankan      html  css  js  c++  java
  • Java中容易迷糊的String

    1 "=="与"equals"
              "=="这种比较是针对两个String类型的变量的引用,也就是说如果两个String类型的变量, 它们所引用同一个String对象(即指向同一块内存堆),则"=="比较的结果是true。 用Object对象的equals()方法来比较,String对象继承自Object,并且对equals()方法进行了重写。
        两个String对象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较, 也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。  

    2 String作为基础类型或者String对象

    public class Str {
        public static void main(String[] args) {
            String a = "abc";
            String b = "abc";
            String c = new String("abc");
            String s1 = new String("abc");
            String s2 = new String("abc");
            String s3 = s2;
            System.out.println(a == b);        // true
            System.out.println(a.equals(b));      // true
            System.out.println(a == c);        // false
            System.out.println(a.equals(c));      // true
            System.out.println(s1 == s2);      // false
            System.out.println(s1.equals(s2));    // true
            System.out.println(s2 == s3);       // true
            System.out.println(s2.equals(s3));    //true
        }   
    }

        String a = "abc", 可能创建一个或者不创建对象,如果"abc"这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象("abc"),然后a指向这个内存地址,无论以后用这种方式创建多少个值为"abc"的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝, Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。把String作为一个基本类型来使用的,因此s1所引用的对象是属于String缓冲池内的。

      String c = new String("abc"),把String作为一个对象来使用的,因此s2所引用的对象不属于String缓冲池内的,即它是独立的。通过new关键字,虚拟机会为此创建一个新的String对象,即为它分配了一块新的内存堆。至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象, 它的value是"abc"。同时如果这个字符串再java String池里不存在,会在java常量池里创建这个String对象"abc"。
      String s3 = s2;// 即把s2的引用赋值给了s3,所以s3所引用的对象其实就是s2所引用的对象。

    在java编译好的class文件中,constant pool是一个由数组组成的表,用来存储程序中的各种常量,程序执行时,constant pool会存储在method area中。

    java中的数据类型,可分为两类:
    1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
      他们之间的比较,应用双等号(==),比较的是他们的值。
    2.复合数据类型(类)
      当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false
    String时,因为字符串常量池
     
    (java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方 法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。

    String类型更多理解请访问http://blog.csdn.net/wangdong20/article/details/8566217

  • 相关阅读:
    App测试从入门到精通之安装、卸载和运行测试
    App测试从入门到精通之App分类和场景操作系统
    一步到位带你入门Selenium
    MAMP和WAMP搭建Web环境,数据库,数据分布可视化
    爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍
    Python 基本语法,文件读写,数据结构和类型
    python 数据工程 and 开发工具Sublime
    jieba user guide
    python各类项目模块记录
    python parse xml using DOM
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6641504.html
Copyright © 2011-2022 走看看