`
huntingbaby
  • 浏览: 4568 次
  • 性别: Icon_minigender_1
  • 来自: 清远
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java对象的创建及存储

    博客分类:
  • J2SE
阅读更多
    在Java中,创建一个对象通常都用new关键字,并且需要创建一个引用来跟这个对象相关联,该引用就是实际操纵其相关联对象的标识符。如下:
String s;

    在这里创建的仅仅是引用并不是对象(安全的做法:在创建一个引用的同时便对其进行初始化)
String s = "asdf";

    Java对象的主要存储地方:

    堆栈——简称"栈",用于存储对象的引用,基于堆栈指针存储、移除数据
    【优势】存储速度快,仅次于寄存器,栈数据可以共享。
    【不足】编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,缺乏灵活性。
    主要存储基本类型(boolean、char、byte、short、int、long、float、double)和对象句柄。
    【注意String不是基本类型,是类。不过String类在java中比较特殊,被设计成为不可改变(immutable)的类,封装了有关字符串的操作,字符串是创建后就不可改变的;可变的对应是StringBuffer类。
        1.数据共享
/*
创建了一个对象变量为a的引用,编译器首先在栈中查找是否有3这个值
if(!has 3){
    把3这值存储到栈中,并使引用a指向该值;
}
*/
int a = 3;
/*
接着创建一个对象变量为b的引用,同样先查找栈中是否有3这个值
if(has 3){
    把引用b指向a所指向的值3;
}
*/
int b = 3;
System.out.println(a==b);//true
/*
根据以上情况,引用a和b在栈中指向同一值,故此这两个变量相等,同时也证明了栈中共享数据。如果此时改变变量a的值,那么其引用的指向也会随之改变。也就是说编译器会重新查找栈,检查数据。那么下面变量a的引用就指向新的地址,其引用的改变不会影响变量b的引用指向。
*/
a = 4;
System.out.println(a==b);//false

        2.对象引用共享
/*
String是一个特殊的包装类数据,其包括两种创建方式:
1).在栈中创建一个对String类的对象引用变量str,然后查找栈中是否存放"abc"。没有,则将"abc"存放进栈,并令str指向”abc”;再创建另一个对String类的对象引用变量s1、s2指向str这同一引用对象,查找栈中是否存放"abc"。有"abc" 则直接令s1、s2指向"abc"。
*/
String str = "abc";
String s1 = str;
String s2 = str;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
//从上面可以看到,s1和s2指向同一对象。

    【注意数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b,它是由编译器完成的,有利于节省空间;而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
    堆——用于存储所有的Java对象
    【优势】编译器不需要知道数据存储块内存分配大小和生命周期,具有很大的灵活性。可以动态分配内存大小,且Java垃圾收集器会自动收回无用的数据。
    【不足】由于要在运行时动态分配内存,存储速度较慢。
/*
2).用关键字new来创建新对象,它会在存放于堆中。每调用一次就会创建一个新的对象。在堆中创建新对象时,都是不管其字符串值是否相等、是否有必要创建新对象,从而加重了程序的负担。
*/ 
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
/*
故上述说明,存放在堆里不同内存块中的两个对象不能用"=="相比较。比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用"=="。
*/

    【注意我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
0
0
分享到:
评论

相关推荐

    JAVA创建对象的四种方法

    - 序列化机制是 Java 中的一种机制,它可以将对象转换为字节流,方便对象的存储和传输,使用反序列化机制可以创建对象,从字节流中恢复对象。 - 在 Java 中,创建对象的方式选择非常重要,它可以影响程序的性能、...

    java对象创建与回收demo

    在实际开发中,了解对象创建和垃圾回收的原理可以帮助我们编写出更高效、资源利用率更高的代码。例如,避免创建大量短生命周期的对象(称为"对象抖动"),合理使用数据结构和集合类,以及适时调用`System.gc()`...

    java中对象创建、初始化、引用

    #### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...

    java创建xml对象

    在本项目"XmlToObject"中,可能包含了实现这些功能的代码,包括读取XML文件,创建相应的Java对象,以及将Java对象写回XML文件。可能有自定义的解析逻辑,以适应特定的XML结构。此外,还可能涉及错误处理、性能优化等...

    探讨Java的对象是怎么在内存中产生的?

    本文将详细探讨Java对象在JVM中的创建过程以及其内存布局,帮助读者更深入地理解Java对象是如何在内存中产生的。 #### 二、对象的创建 Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上...

    深入Java对象及元素的存储区域

    ### 深入Java对象及元素的存储区域 在Java平台进行软件开发的过程中,一个显著的特点是对象的创建是在程序运行时动态发生的。这也就意味着,直到程序执行时才能最终确定对象应该存放在哪个内存区域。不同的存储区域...

    Excel列表转化成java对象

    使用POI,我们可以创建一个工作簿对象,然后遍历工作表,单元格等,读取数据并将其转化为Java对象。例如,如果Excel中的每一行代表一个用户对象,我们可以通过循环遍历行和列,构建User对象并填充属性。 对于CSV...

    JAVA对象序列化保存为XML文件的工具类

    另一方面,`objectXmlDecoder`方法打开XML文件,创建一个`XMLDecoder`实例,读取XML数据并将其转换回Java对象。这些对象被添加到一个`ArrayList`中并返回。注意,如果XML文件中包含多个序列化的对象,`XMLDecoder`将...

    java对象生成xml数据

    在Java编程中,将Java对象转换为XML数据是一项常见的任务,特别是在处理数据交换或存储时。JAXB(Java Architecture for XML Binding)是Java提供的一种标准API,它允许开发者轻松地在Java对象和XML文档之间进行映射...

    Java对象池实现源码

    总结来说,Java对象池是一种优化技术,通过复用对象减少创建和销毁的成本。我们可以借鉴Jakarta Commons Pool的设计思路,实现自己的轻量级对象池,满足特定场景的需求。理解并熟练运用对象池,对于提升Java应用的...

    Java面向对象程序设计

    - **对象创建**:通过`new`关键字实例化一个类的对象。 - **封装**:将数据和操作数据的方法封装在类中,实现信息隐藏。 - **构造器**:用于初始化新创建对象的特殊方法。 5. **第5章:继承与接口** - **继承**...

    xml转换java对象

    2. **读取XML到Java对象**: 创建一个`XmlMapper`对象,然后调用`bindMapToReader()`或`bindMapToInputStream()`方法,传入XML文件的输入源和之前配置的映射。这会将XML数据解析成Java对象。 3. **Java对象到XML**: ...

    JAVA对象与XML互转

    通过构建DOM树,你可以遍历树并创建对应的Java对象,或者从Java对象生成DOM树再输出为XML。 3. **DOM4J**:这是一个流行的Java库,提供了更高级别的API来操作XML。可以使用DOM4J的`DocumentHelper`创建`Document`,...

    Java中控制创建对象的个数

    首先,让我们了解基本的对象创建过程。在Java中,我们通常通过`new`关键字来创建对象。例如: ```java MyClass myObject = new MyClass(); ``` 然而,如果我们要控制对象的个数,直接使用这种方式可能会导致无限制...

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    - 当我们创建一个对象时,对象的引用存储在栈中,而对象的实体存储在堆中。 - **示例**:假设有一个名为`Student`的类,其中包含一个整型成员变量`id`。 ```java Student u1 = new Student(); // 创建对象 u1.id ...

    深入理解java对象,包括对象创建和内存分配

    总的来说,理解Java对象的创建、内存分配和JVM的工作机制对于编写高效、健壮的Java代码至关重要。这涉及到堆内存管理、对象生命周期、垃圾收集以及各种JVM优化策略。开发者应时刻关注这些细节,以便在解决性能问题时...

    Java中对象与引用

    在Java中,对象存放在堆内存中,而引用则存储在栈内存中。 #### 二、对象与引用的创建过程 考虑下面的示例代码: ```java class Student { String name; int age; } // 创建对象 Student stu = new Student();...

    Java面向对象精髓编程

    - **集合框架(Collections Framework)**:Java提供了丰富的数据结构和算法,如ArrayList、LinkedList、HashMap等,方便存储和操作对象。 - **网络编程(Network Programming)**:Java的Socket类和ServerSocket类...

    JSON与JAVA对象之间的转换

    // 创建一个Java对象 Person person = new Person("John", "Doe", 30); // 使用Gson将Java对象转换为JSON字符串 Gson gson = new Gson(); String jsonString = gson.toJson(person); // 将JSON字符串反序列化回...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

Global site tag (gtag.js) - Google Analytics