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

  • 相关阅读:
    java web 自定义错误页面 完整jsp错误页面代码(同时写错误日志) error.jsp
    linux ps命令详解
    Cocos2d-x MultipleTouch & CCControllButton's confusion
    android 处理图片之--bitmap处理
    JBoss 目录结构
    如何将Android默认的Camra程序导入到eclipse中
    SGU107——987654321 problem
    解析Systemtap
    csdn 刷分小工具(刷了1000多被封了,慎用)
    OpenCV——基本图形绘制(椭圆、圆、多边形、直线、矩形)
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6641504.html
Copyright © 2011-2022 走看看