从String s = new String("abc")了解引用变量与对象

一、引用变量与对象的区别

首先,根据我们实例bean对象过程知道,A aa;仅是声明了一个类A的引用变量,aa并不是一个对象,类的对象是通过 new来创建的。

所以,String s ....中s并不是一个对象,而是一个string类型的引用变量。

另外, 对于string字符串来讲,字符串文字本身是一个对象,如 "XXX",则 XXX就是一个对象。

二、文字池即缓冲池(pool of literal strings)和堆(heap)中的字符串对象

由于字符串对象的大量使用(一般而言对象总是在heap分配内存),java中为了节省内存空间和运行时间,例如在比较字符串时,==要比equals()快,所以在编译阶段就把所有的字符串文字放到一个文字池中,而在运行时文字池成为常量的一部分。文字池中所以相同的字符串常量会被合并,只占用一个空间。

通过以下两种方式可验证:

1、

// ==判断内容为两个对象的引用地址

//String s1 = "abc" 先在缓冲池查找是否已有abc对象,没有,会在缓冲池创建 abc对象,并把引用地址赋给s1;

// String s2 = "abc" 会先在缓冲池查找是否有abc对象,有则不创建,直接用已有abc对象,把引用地址赋给s2;

// 所以s1和s2的引用地址是一样的

String s1 = "abc";

String s2 = "abc";

if(s1 == s2){

//此处会输出内容

}

2、

//使用new创建string对象时,不管缓冲池和堆中是否已有abc对象,都会在堆中创建abc对象,并把堆中abc对象引用地址赋给string引用

// String s1 = new String("abc")在堆中创建abc对象,并把abc引用赋给s1

// String s2 = new String("abc")在堆中新创建一个abc对象,把新对象引用赋给s2

String s1 = new String("abc");

String s2 = new String("abc");

if(s1 == s2){

//此处无内容输出

}

三、String s = new String("abc")过程步骤(详见--String s = "abc"和String s = new String("abc")详解文章)

1) 栈中开辟一块空间存放引用str2; 
      2) 堆中开辟一块空间存放一个新建的String对象"abc"; 
      3) 引用str2指向堆中的新建的String对象"abc";
      4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,

时间: 2024-10-03 14:56:40

从String s = new String("abc")了解引用变量与对象的相关文章

c#问答篇:对象与引用变量-----初学者的困惑

转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html 从宏观的角度来看,对象是类的实例.比如: //定义一个名为Someone的类,代表这么一些人(通过指定年龄,性别,性格等基本信息)class Someone {  public int age;  public string sex;  public string name;  //other...}//......//创建一个Someone类的对象,代表昵称为nemo

浅谈变量,数据变量与引用变量

Java是一种面向对象语言 Java程序中一切皆对象,也就是说运行中的Java程序其实是很多对象依照设计要求不断 创建 修改 联系其他对象 修改其他对象 完成使命后被垃圾收集器回收. 那么程序设计就要求定义对象的功能,设置对象之间的联系(接口),设计对象之间相互操作的顺序,根据操作结果的不同再进行更多不同的操作. 对象的定义指对对象的准确描述(对象有什么属性特点,具备什么能力-方法),定义对象的文件我们称之为类,所以类可以有属性和方法: (其实对象是非常非常非常抽象的,它的抽象体现在 1.范围广

java中String s="abc"及String s=new String("abc")详解

1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配内存,存取速度较慢. ==是判断

String str=new String("abc")到底创建了几个对象

这句代码到底创建了几个对象?研究了好一阵,现在才能说清楚. package com.sun.test; public class Test<T> { T a; /** * @param args */ public static void main(String[] args) { String str=new String("abc"); } } 我们来看下这段简单代码的字节码: <pre name="code" class="java

经典String str = new String(&quot;abc&quot;)内存分配问题

出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没办法,下载了曾经大学里的一本pdf格式的教学书,看了整整一天才算是搞明白存储管理中的一部分知识.曾几何时,我曾写过大学无用的一些小论题,觉得大学里教的东西不切合实际,理论化偏严重,总认为用理论教出来的人,总是说着牛逼,做事掉渣的人.所以,在大学里,我的学习只能说是应付考试,太多的东西都没有去深入了解

关于String str =new String(&quot;abc&quot;)和 String str = &quot;abc&quot;的比较

String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc" System.out.println(str == str1) System.out.println(str.equal(str1)) 结果: false true 原因解析: Java运行环境有一个字符串池,由String类维护,执行语句String str="abc"时 1.

String s=&quot;abc&quot;及String s=new String(&quot;abc&quot;)详解

一.相关知识点 1.   栈(stack)与堆(heap)都是Java用来在Ram(随机存取存储器)中存放数据的地方, 栈数据可以共享. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.缺点是,由于要在运行时动态分配内存,存取速度较慢. 3.   ==是判断两个对象是否是同一个对象即引用地址:equa

【Java 重难点知识】String s=new String(&quot;abc&quot;) 与 String=&quot;abc&quot;; 区别

首先, String s=new String("abc");这句话创建了2个对象: 一个为new出来的一个实例对象,另一个则为"abc"; s不为对象,s只是一个引用(C++中的指针). 查询Java中String类的构造器,有一个这样的构造器,api如下: public ( original) 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列:换句话说,新创建的字符串是该参数字符串的副本.由于 String 是不可变的,所以无需使用此构造

由String str=new String(&quot;abc&quot;);引起的

话题是由如下的事情引出的: public class StringTest { public static void main(String[] args) { String str1 = new String("abc"); String str2 = "abc"; if (str1 == str2) { System.out.println("str1 == str2"); } else { System.out.println("