`

String str = new String("abc")内存分配问题

    博客分类:
  • java
阅读更多

 

 

一、JAVA数据存储类型:栈和堆 

好处:1 栈:优点:数据可以共享,存取速度快仅次于CPU中寄存器,

   缺点:存在栈中的数据大小和生命周期必须是固定的,缺乏灵活性

 

2 堆:好处:可以动态分配内存大小,生存期不必告诉编译器,垃圾回收器自动回收不适用的数据 

              缺点:由于动态分配内存使得存取速度快 ;

 

 

二、数据的存放

基本数据类型存放在栈中: 

基本数据类型如:int, short, long, byte, float, double, boolean, char;他们大小固定,生存期可知,

出于追求速度,就存在栈中了

堆中存放:对象,类以及应用等信息 

如:Integer,String,Double等Java用new()语句来显示告诉编译器,在运行时才根据需要动态创建,

因此比较灵活,但缺点占用更多的时间。

 

三、理解栈数据的共享

如:int a=3; int b=3 ;

程序执行:1 创建a的一个引用, 2查找是否有值为3的地址,如果有则讲a指向3的地址,没有则创建一个存放数值为3的地址,然后指向即可

 然后处理  int b=3 ; 在创建完b的引用变量后,由于在栈中已经有3这个数值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况

引用变量存放在栈中,直接指向堆中内存区域的首地址。

 

四、String包装类的理解

这种类,既可以用String str = new String("abc");的形式来创建,也可以 String str = "abc"

1 理解String str = "abc"  ,这种形式和基础数据类型存储很相似, 

先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 

2 中用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象在堆中。 

结论:

  1 因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 

           同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。

  2 对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。 

       另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。

      担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。

   3 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

 

分享到:
评论

相关推荐

    String型的不可变性

    但是,如果我们使用 new 操作符来创建 String 对象,例如,String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1 == str2); // false,这里 str1 和 str2 指向不同的对象。 ...

    String类创建对象问题

    #### 二、`String` 创建方式及内存分配 - **直接赋值**:例如 `String str = "abc";` 这种方式创建的字符串会直接存储在字符串池中。如果字符串池中已经存在相同的字符串,则不会创建新的对象,而是返回已存在的...

    Java String对象的经典问题

    2. **使用new关键字**:如`String str = new String("abc");` 这两种方式创建的对象虽然看起来相似,但在内部机制上有所不同。具体来说: - **直接赋值**:这种方式会在**字符串常量池**(String Pool)中查找或...

    java语言程序设计课后习题答案.doc

    String str1 = new String("abc"); String str2 = "abc"; System.out.println(str1==str2);//false String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1==str2);//false ...

    java语言程序设计课后习题标准答案.doc

    String str = new String("abc"); ``` **1.2 字符串比较** - **使用`==`操作符**: - 当两个字符串通过字面量创建时,它们共享同一内存区域(字符串常量池),因此使用`==`比较时结果为`true`。 - 如果至少有...

    C#中String类常用方法汇总

    string str = "AbC"; string lowerStr = str.ToLower(); // "abc" string upperStr = str.ToUpper(); // "ABC" ``` 2. `.Trim()` `.Trim()` 方法用于移除字符串两端的空白字符,如空格、制表符等。 ```csharp...

    通过查询数据库里的方法名称,来调用方法

    利用影射,通过查询数据库里的方法名称,来调用方法 SqlConnection conn = new ... asac.abc c = new asac.abc(); TextBox1.Text = c.abcd(dr); conn.Close(); // str1 = str1.Substring(0, str1.Length - 1);

    string 的创建

    - 如 `String str = new String("abc");` - 这种方式下,一个新的字符串对象会在堆内存中创建。 - 同时,`"abc"` 也会被放入字符串常量池中(如果之前没有出现过的话),但 `str` 指向的是新创建的对象而非字符串...

    JAVA_String

    2. 使用`new`关键字和构造函数,如`String str = new String("Hello, World!");` 3. 字符数组转换,如`char[] chars = {'H', 'e', 'l', 'l', 'o'}; String str = new String(chars);` `String`类提供了丰富的操作...

    String对象的内存分析

    本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...

    Java String 字符串创建理解 equels和\"==\" 差异

    2. **使用new关键字**:`String str = new String("Hello, World!");` 使用new关键字创建的字符串会在堆内存中创建一个新的对象,即使常量池中已有相同的字符串,也会生成新的实例。 3. **StringBuilder/...

    String类型两种不同实例化方式

    String str = new String("abc"); ``` 这种方式使用new关键字来创建String对象,它与字面量方式有显著区别。使用new创建String对象时,JVM不会去检查常量池中是否已有相同的字符串,而是直接在堆内存中创建一个新的...

    Java API资源,html版本(官网资源下载入口不太好找,分享给大家)

    本材料为Java API文档,适用于所有Java开发者,尤其是刚开始学习Java的同学,手边有一份API文档,开发效率大有帮助。... String str = new String(data); 既有常用方法,又有其他方法的详细说明,用处巨大。

    C#字符串处理的相关操作

    string str = "abc"; char r = str[0]; // r的值是'a' ``` 可以使用foreach循环来遍历字符串中的每个字符。例如: ```csharp string str = "abc"; foreach (char item in str) { Console.WriteLine($"输出的字符:{...

    c++ stl之string常用函数

    string str1 = "abc"; string str2 = "abd"; if (str1 < str2) { cout << "str1 is less than str2" ; } ``` 3. **显式比较** - `int compare(const string &s) const:` 显式比较两个字符串,返回值为正表示...

    java语言程序设计课后习题答案解析.doc

    2. 使用`new`关键字创建新对象:`String str = new String("abc");` 当使用"=="来比较字符串时,它实际上是在检查两个字符串是否指向内存中的同一个引用,而不是比较它们的内容。这意味着,如果两个字符串变量都...

    Java中的堆和栈.pdf

    但是,如果使用`new`创建String对象,如`String str1 = new String("abc"); String str2 = new String("abc");`,则它们在堆中是独立的对象,`str1 == str2`会返回`false`。 在编写Java代码时,理解堆和栈的区别...

    JAVA虚拟机内存分配机制

    如果使用`new`关键字创建对象,如`String str1 = new String("abc"); String str2 = new String("abc");`,则会产生两个独立的对象实例,即使它们的内容相同。 对于字符串,Java提供了特殊的处理。字符串字面量(如...

    12基础篇之第十二(String的基本用法).docx

    3. 当比较两个由 `new String()` 创建的对象时,即使它们的内容相同,使用 `==` 运算符比较的结果也是 `false`,因为它们指向不同的内存地址。正确的方式应该是使用 `equals()` 方法进行比较。 示例代码如下: ```...

Global site tag (gtag.js) - Google Analytics