zoukankan      html  css  js  c++  java
  • 匿名对象、栈空间和堆空间,String的两种实例化方式的比较,"=="和"equals()"的区别

    匿名对象
    匿名对象一般只用一次,不需要对象变量,格式如下:
    New Class().getParameter();
    匿名对象没有对象名,一般作为其他类实例化的参数传递,由于其实质是对象的实例,而非指向对象实例的地址,所以它是在堆内存中开辟
    空间,而非栈内存。

    栈内存和堆内存的区别。
    我想通过String的两种实例化方式来讲解这个会比较容易明白。


    String str1="hello";
    String str2="hello";
    str1==str2为真

    这里的str1和str2指向的是同一个地址,那么这个地址在哪里呢?首先要明白一个字符串就是一个String类型的匿名对象,而在java中会提供
    一个字符串池来保存全部的内容,我们称之为共享设计,即乳沟新的实例化对象在池中已经定义了,那么就不需要重新定义,直接在池中取
    出来用就是了,所以str1和str2指向的是字符串池中的同一个地址,这是字符串采用直接赋值的方式。

    那么另一种采用构造方法来新建一个对象的方式:

    String str3=new String("hello");
    String str4=new String("hello");

    而这里的str3和str4则是新建了一个对象,因为这里使用了new关键字,所以它们是在堆内存中开辟了不同的空间,所以

    (str3==str4)==false

    因为这里的str3和str4指向的不同的两个地址。那么有些人会遇到这样的情况,就是有时候用"=="和"equals()"具有相同的效果,这里我们只要记住"=="进行的是地址比较,而"equals()"进行的是值比较,而它们具有相同效果则是因为采用的是直接赋值方式,比如上面的str1==str2和str1.equals(str2)都为真,虽然它们都为真,但是我们需要注意的是这连个表达式比较的方式是不一样的,一个比较的是地址,一个比较的是值
    所以,堆内存存储的实际上是实例化对象,而栈内存中存储的是指向堆内存空间的地址。java中的引用传递就是把堆内存空间的使用权交给
    多个栈内存空间。

  • 相关阅读:
    spark学习进度18(SparkSQL读写)
    查看及修改centos的系统时间
    第3章 串
    linux就该这么学 简介
    1 快速入门
    rocketMQ实战与原理解析 简介
    绪论
    数据结构java版 第4版 叶核亚著 简介
    数据结构java语言版 简介
    数据结构与问题求解java版 简介
  • 原文地址:https://www.cnblogs.com/CodeMeteor/p/3663154.html
Copyright © 2011-2022 走看看