`
eksliang
  • 浏览: 599634 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java内存分配和String的不变性

    博客分类:
  • java
阅读更多

转载请出自出处:http://eksliang.iteye.com/blog/2146549

http://eksliang.iteye.com

一.java分配内存涉及的区域包括

    1. 寄存器
    2. 常量池
    3. 静态存储域

二.寄存器介绍

      寄存器是最快的内存区域,因为他保存在处理器内部,这块区域我们没有直接的控制权,也不可能在代码里面找到寄存器的任何存在踪迹,所以这块不做讨论

 

三.常量池介绍

1.常量池是什么?

答:他是在.class文件中开避的一块内存区域,用来存储在编译期间就可以确定一些数据

       例如:String str="think";think在编译的期间就是可识别的常量,就能加进常量池

2.常量池中的数据是在什么时候加载进内存的?

答:在类被编译成.class文件时,加载进来的

3.常量池中都放些什么东西?

答:包括如下信息

  1. String类型的变量;例如String str="think",不是new String("think");
  2. 对象的常量值
  3. 类的全限类名以及他的描述符;属性的名称跟描述符;方法的名称跟描述符

4.String的不变性

1.什么是String的不变性?

答:所谓String的不可变性,是说一旦字符串被创建,对其所做的任何修改都会生成新的字符串对象(来源于《think in java》)

接下来看下他的源码

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    /**
     * Class String is special cased within the Serialization Stream Protocol.
     *
     * A String instance is written initially into an ObjectOutputStream in the
     * following format:
     * <pre>
     *      <code>TC_STRING</code> (utf String)
     * </pre>
     * The String is written by method <code>DataOutput.writeUTF</code>.
     * A new handle is generated to  refer to all future references to the
     * string instance within the stream.
     */
    private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];

 通过源码我们可以看到这个类他的所有属性,以及类都是final关键字修饰,也就是说他在内存中只有一份拷贝,也就是说当创建一个新的字符串,他会去常量池中找如果这个串存在就直接引用,如果没有就创建

例如:如下三句代码的意思是

1)String s1="aabbcc";
2)		String s2="aabbcc";
3)		s1="aa";

 他的含义入下图所示:

当程序执行到(1)时如图在常量池中创建"aabbcc"



 

当程序执行到(2)时如图所示,因为已经存在了,就直接引用,(实际上内部在创建一个字符串时,他会先去变量常量池,查找看当前创建的字符串是否存在,如果存在就直接引用,没有就创建)



 

当程序执行到(3)时如图所示,因为修改了字符串s1的值,所以他会在内存中创建一个新字符串,原来指向aabbcc的指针断开,指向“aa”

 



 

四.栈

1.栈中存放的是那些数据?

答:存放基本类型的变量数据和对象的引用,但对象本身并不存放在栈中,而是存放在堆中或者常量池中(字符串、常量对象存放在常量池中)

       当在一段代码块定义一个变量时,JVM就在栈中为这个变量分配内存空间,当该变量退出该作用域后,JVM会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

2.实际存储在哪里?

答:数据驻留在RAM(随机存储器)区域;

何为随机存储器?答:是与CPU直接交换数据的内部存储器,也叫主存或者内存,它可以随时读写,而且速度很快,通常作为操作系统或正在运行中的程序的临时数据存储媒介

 

五.堆

1.存放的是那些数据?

答:存放所有new 出来的对象。或者通过反射创建的对象

2.实际数据存储在哪里?

答:数据驻留在RAM(随机存储器)区域

 

六.静态存储域

1.存放的是那些数据?

答:存放的是静态成员(static定义),这儿的静态(static)是指"位置固定位置"。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的一个属性或者方法是静态的,但是JAVA对象永远不会保持到静态存储区

 

 

 

 

  

  • 大小: 2.2 KB
  • 大小: 3.1 KB
  • 大小: 4.4 KB
0
0
分享到:
评论

相关推荐

    Java-Java String和StringBuilder

    这大大减少了内存分配和垃圾回收的压力,尤其在需要大量字符串拼接操作时。 下面是一个使用StringBuilder的例子: ```java StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" "); sb....

    StringBuffer和String_区别

    在这种情况下,使用 StringBuffer 更为高效,因为它只涉及少量的对象创建和内存分配。 4. **大量数据的拼接** ```java // 使用 String 拼接 String s = ""; for (int i = 0; i ; i++) { s += "hello"; } ...

    Java机制下的栈和堆.pdf

    Java编程语言中,内存管理是其核心特性之一,主要分为栈内存和堆内存两部分。栈内存主要存储基本类型变量...合理利用栈内存的高效性和堆内存的灵活性,以及了解如何正确处理String对象,是编写高质量Java代码的基础。

    三张图彻底了解Java中字符串的不变性

    在Java编程语言中,字符串的不变性(Immutability)是一个关键特性,它指的是字符串对象一旦创建后,其内容就不能被修改。这个概念对于理解和优化Java程序至关重要,尤其是在处理字符串操作时。以下将通过三张图来...

    Java常用类

    - **线程安全性**:因为String对象的不变性,多个线程可以安全地共享一个String对象。 - **提高性能**:JVM能够缓存String对象,从而避免不必要的对象创建,尤其是在使用字符串常量时。 - **便于实现某些算法**:...

    String和StringBuffer 的区别 .txt

    在这种情况下,每执行一次`tmp += x`都会创建一个新的`String`对象,导致大量的内存分配和垃圾回收开销。而如果使用`StringBuffer`,则可以在原有的对象上进行修改,避免了频繁创建新对象的开销。 综上所述,选择...

    2021国外Java面试题(纯英文).pdf

    final和finally关键字有不同的用途,final用于声明不变性,finally用于确保异常处理后的代码执行。 super关键字用于引用父类的成员,如变量、方法或构造器。 静态方法不能被重载,因为它们与类相关联,而不是与...

    Android NDK底层和java代码相互传值调用(实用经典Demo)

    例如,Java的`int`对应C/C++的`int32_t`,`long`对应`int64_t`,`float`和`double`保持不变,而字符串通常通过`char*`或`std::string`在C++中表示,Java中则使用`String`类。 2. **JNI接口定义** 要实现Java与C++...

    java基础易忘

    - **不变性**: `final` 关键字可以用来声明常量或不可变对象。 - **不可修改**: 一旦被声明为 `final`,对象的状态就不能再改变。 #### 32. 静态成员的默认属性 - **默认属性**: 在 Java 中,如果一个静态成员没有...

    黑马程序员入学Java精华总结

    10. **分配内存空间** - 数组在创建时需要指定长度,数组元素占用连续的内存空间。 11. **二维数组** - 二维数组可以看作数组的数组。 12. **操作数组的工具类-Arrays** - 提供了排序、查找等功能。 13. **...

    Java面试测试题目2018张大成总结

    `中,原String对象不变,因为String是不可变的。 #### 15. JAVA的四种基本权限 - **public**:对所有类可见。 - **private**:仅对本类可见。 - **protected**:对本类及其子类和同一包中的类可见。 - **默认**:对...

    java面试宝典

    28. **字符串的不变性和内存使用** - 字符串在Java中是不可变的,这意味着一旦创建,其内容不能更改。 - 理解字符串拼接操作的性能影响,以及如何使用`StringBuilder`或`StringBuffer`进行优化。 29. **对象的...

    各大互联网公司常见java面试题

    28. **反射机制**:反射可以动态获取类信息、创建对象、调用方法、访问字段,具有灵活性和动态性,但牺牲了性能和安全性。 29. **设计模式**:设计模式是解决常见问题的最佳实践,如单例模式、工厂模式、观察者模式...

    Java 常用类(csdn)————程序.pdf

    这是由`String`类的`final`关键字决定的,它确保了对象的不变性。 字符串在Java中被视为特殊的对象,它们通常用双引号括起来表示,如`"Hello World"`。字符串的值在创建后是不能更改的,这是因为它们在内存中的存储...

    8张图解java.docx

    1. **字符串不变性**:在Java中,`String`类的实例是不可变的,这意味着一旦创建,就不能修改。例如,当你执行`s = s.concat("ef")`,实际上创建了一个新的`String`对象,而不是在原对象上添加内容。如果需要频繁...

    6个问题,让你轻松入门Java

    在 Java 中,`final` 关键字具有非常重要的作用,它能够确保变量或类的不变性。 **1. 不可变变量** - **定义不可变变量**:可以使用 `final` 关键字来定义不可变的变量。 - **示例**: ```java final ...

    自整理Java关于基础和框架的面试题

    ### 自整理Java关于基础和框架的面试题 #### 基础知识点 ##### JDK常用的包 - **java.lang**: 包含所有基本类,如`String`、`Math`等。 - **java.util**: 提供集合框架、日期/时间设施、事件模型、杂项实用程序类...

    java基础语法

    - **垃圾收集机制(Garbage Collection)**:自动管理内存的一种机制,负责回收不再使用的对象所占用的内存空间,提高了程序的效率和可靠性。 - **Java程序执行过程**: - 编写源代码(.java文件)。 - 使用`javac`...

    java常见概念题

    这种方式确保了数据的一致性和完整性。 - **异步**则是在某些场景下,当一个线程调用某个耗时较长的方法时,并不希望阻塞当前线程,而是继续执行后续代码。这种方式提高了程序的效率,尤其是在处理网络请求、文件...

Global site tag (gtag.js) - Google Analytics