zoukankan      html  css  js  c++  java
  • 字符串比较

    代码如下:

     String str1 = new String("hello");
     String str2 = new String("hello");
     String str3 = "hello";
     String str4 = "hello";
     System.out.println(str1==str2);//false
     System.out.println(str3==str4);//true
     System.out.println(str1==str3);//false
    

    解析:

    虽然我们都知道Java是面向对象的编程,但并非完全的面向对象。比如说Java中的基本数据类型,用int,double等创建的变量都不是对象。一般我们都是通过new 关键字来创建对象,而基本数据类型创建的变量并不能用new 的方式获取。虽然如此,但Java对基本数据类型也有相应的解决办法——封装与其相应的类,即Integer对应int,Double对应double,它们皆是为了解决基本数据类型面向对象用的。

    明确这些之后,我们再来看类型是如何分配的,基本数据类型在栈中进行分配,而对象类型在堆中进行分配。基本类型之间的赋值是创建新的拷贝,而对象之间的赋值只是传递引用。所有方法的参数(基本类型除外)传递的都是引用而非本身的值。

    现在,再来说下String s="hello";以及String s = new String("hello");

    我在之前的一篇博客中简单的提到过String s="hello";(变量&数据类型),它与new不同,同时也是java中唯一不需要new就可以产生对象的途径。这种形式的赋值称为——直接量,它被放在一个叫作字符串拘留池(常量池)的地方;而new 创建的对象都放在堆上。String s="hello" 这种形式的字符串,会在JVM(Java虚拟机)中发生字符串拘留。

    那什么是字符串拘留呢?我们通过一个例子来理解这种机制,当我们声明一个字符串String s="hello";时,JVM会先从常量池中查找有没有值为"hello"的对象。如果有,会把该对象赋给当前引用,也就是说原来的引用和现在的引用指向同一个对象;如果没有,则在拘留池中创建一个值为"hello"的对象,如果下一次还有类似的语句,例如String str="hello";时,又会将str指向"hello"这个对象。以这种形式声明字符串,无论有多少个都指向同一个对象。

    再来说说String s = new String("hello");

    这种形式创建的对象就和其他new 创建的对象一样了,每执行一次就生成一个新对象,也就是说String str = new String("hello");与s毫无关系,他们是两个独立的对象,只不过巧了,他们的值或是说内容相等。

    我们也可以简单的理解为:

    String str = "hello"; 先在内存中找是否有"hello"这个对象,如果有就可以直接从常量池中拿来用,不用再从内存中创建空间来存储。如果没有,就创建一块新内存存着,以后要是有对象要用就直接给它用了。

    String str=new String ("hello") 就是不管内存里有没有"hello"这个对象,都新建一个对象保存"hello"。

    冰冻三尺,并非一日之寒
  • 相关阅读:
    GZDBHelper C#.NET开源的数据库访问组件
    判断页面是否是静态页面
    Web应用程序dll获取当前程序集路径问题
    webAPI 上传文件
    解决.Net Core3.0 修改cshtml代码之后必须重新生成才可以看到效果
    .net core使用LESS
    test
    JS实现线程锁(Promise),NodeJS并发锁处理
    参考护照编码实现算法JS生成带字母有序编码
    centos7防火墙开放端口与关闭防火墙
  • 原文地址:https://www.cnblogs.com/qjwcf/p/12856569.html
Copyright © 2011-2022 走看看