`
ccr1988
  • 浏览: 34682 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String类内存解析

阅读更多
String是java常用类中最重要的类,主要是它很多特殊点,网上分析的例子很多,我
也想谈下自己的看法,最经典的问题是String a=new String("abc");是如何实现创建
2个对象的?
   我们看下String的构造方法,SUN(ORACLE),JDK源码的解释:
/**
     * Initializes a newly created <code>String</code> object so that it
     * represents the same sequence of characters as the argument; in other
     * words, the newly created string is a copy of the argument string. Unless 
     * an explicit copy of <code>original</code> is needed, use of this 
     * constructor is unnecessary since Strings are immutable. 
     *
     * @param   original   a <code>String</code>.
     */
    public String(String original) {
	int size = original.count;
	char[] originalValue = original.value;
	char[] v;
  	if (originalValue.length > size) {
 	    // The array representing the String is bigger than the new
 	    // String itself.  Perhaps this constructor is being called
 	    // in order to trim the baggage, so make a copy of the array.
	    v = new char[size];
 	    System.arraycopy(originalValue, original.offset, v, 0, size);
 	} else {
 	    // The array representing the String is the same
 	    // size as the String, so no point in making a copy.
	    v = originalValue;
 	}
	this.offset = 0;
	this.count = size;
	this.value = v;
    }


也就是说String类在init的时候就已经创建了一个char数组对象(数组对象也是存放在堆内存中),我们可以用一个图来形象的表示下:

从图里我们可以看到开始new的时候需要进行2个步骤,先init再new,由于普通类init的时候不会创建对象,只有在new的时候才创建,也就只能创建一个对象,而String不一样,在初始化的时候就已经创建了一个对象,当new的时候又会再创建一个,自然是2个,而a引用new处理的...
  • 大小: 25.5 KB
0
4
分享到:
评论

相关推荐

    String对象的内存分析

    最近在网上经常看到String对象的问题,现将String对象的内存分析进行分享

    day09_02String类的内存解析

    Java内存分配和String类型的深度解析

     在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是本文将要涉及到的一些问题,...

    java内存分配和String类型的深度解析Java开发J

    java内存分配和String类型的深度解析Java开发Java经验技巧共12页.pdf.zip

    String a="hello" String b="hello" a==b 返回true的问题分析

    String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...

    论文研究-基于JVM内存模型的String分析 .pdf

    基于JVM内存模型的String分析,王培,程明,本文首先介绍了运行时的Java程序的内存管理模型中的方法区、堆和Java栈等几块内存区域,又介绍了存于堆中的常量池这块比较特殊的内�

    java中String类的笔试面试题含答案

    分析:str1没有使用new关键字,在堆中没有开辟空间,其值”hello”在常量池中,str2使用new关键字创建了一个对象,在堆中开辟了空间,”==”比较的是对象的引用,即内存地址,所以str1与str2两个对象的内存地址是不...

    C#中string和StingBuilder内存中的区别实例分析

    本文实例分析了C#中string和StingBuilder内存中的区别,有助于更好的掌握C#程序设计中string和StingBuilder的用法。分享给大家供大家参考。具体方法如下: 关于 string和StringBuilder的区别参考MSDN。本文用程序...

    jdk1.8之后的String.intern()方法内存分析

    关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...

    Java解析XML工具类--(java源码)

    * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...

    JVM内存分配及String常用方法解析

    主要介绍了JVM内存分配及String常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    空间内存的分配与回收

    空间内存的分配与回收 #include"stdio.h" #include"iostream.h" #include"string.h" #include"iomanip.h" const int MAXJOB=100;//定义表最大记录数 struct job{ int start; int length; char tag[20]; }; struct ...

    深入Java内存分配

    Java有几种存储区域? java内存分配 Java内存模型 Java内存分配实例解析 String 常量池问题 堆(Heap)和非堆(Non-heap)内存 堆内存分配 非堆内存分配

    string_view-standalone:将C ++ 17'string_view'的自定义实现反向移植到c ++ 11

    这可以大大减少内存占用,并为不可变的字符串(例如解析和标记化)提供了较大的优化。 因此,对于可能不支持较新标准的系统,这种类型在较旧的c ++版本中可能是资产。 完整类型的basic_string_view在CharT和Traits...

    C#之CLR内存深入分析

    如要看内存值类型的朋友可以看一下前一篇C#之CLR内存原理初探。 C#引用类型具体分析如下: 先来装备两个类: internal class Employee { public static Employee LookUp(string name) { return null; } public...

    PHP共享内存用法实例分析

    int $key , string $flags , int $mode , int $size $flags: a:访问只读内存段 c:创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写 w:可读写的内存段 n:创建一个新内存段,如果该内存段已存在,则...

    C++调用Go方法的字符串传递问题及解决方案

    摘要:C++调用Go方法时...经过一段时间的分析和验证,终于理解问题产生的原因并给出解决方案,现分享如下。 背景知识 Go有自己的内存回收GC机制,通过make等申请的内存不需要手动释放。 C++中为std::string变量赋值

    Java内存分配分析/栈内存、堆内存

    首先学习JVM相关需要需要内存的组成。  基本内容  · 堆  java动态创建对象,即对于new的一个实例对象。但是需要注意的是该实例对象的成员变量都存储在各自的堆区域中,其中对象方法是在堆中共享,即不是每次...

Global site tag (gtag.js) - Google Analytics