可变对象与不可变对象

1.什么是可变对象?

属性变更时不新建对象的对象,如StringBuiler,可以将其中存储的字符串看作属性,调用StringBuilder.append(String str)追加字符串时,是在已有StringBuilder对象的基础上进行的,没有新建对象。

基本数据类型的包装类以及String类以外的几乎全部类的对象都是可变对象。

2.什么是不可变对象?

属性变更时必须新建对象的对象,如String,已有"String str=‘abc‘",再次赋值"str=‘efg‘",此时新建一个String对象存储“efg”,str指向这个新建的对象。

基本数据类型的包装类以及String类的对象都是不可变对象。

3.可变对象与不可变对象的选择

不可变对象代表内存中的一个稳定区域,多个引用变量指向同一区域,一个引用变量尝试改变对象的内容时,不会改变原对象的内容,而是新建一个对象,这样就保证了数据的稳定,因此不可变对象通常用在需要保持数据稳定的情况。

在更新可变对象的属性时不会新建对象,节省内存空间,因此可变对象主要用在属性变化频繁的情况,如计数器,需要建立统计对象与统计结果之间的映射关系,因此构建一个Map集合。Integer对象是不可变对象,不适用用来存储统计结果,应该采用一个可变对象来存储统计结果,这里采用数组,当然也可以是自定义对象,其中有一个int属性用来计数:

    public void test01() {
        String str = "abc efe hig klm nop qrs";
        String[] arr = str.split(" ");

        HashMap<String, int[]> map = new HashMap<String, int[]>();
        for (String x : arr) {
            int[] count = map.get(x);
            if (count != null)
                count[0]++;
            else
                map.put(x, new int[] { 1 });
        }
    }
时间: 2024-11-05 15:54:37

可变对象与不可变对象的相关文章

Python中的可变对象和不可变对象

本文和大家分享的主要是python中可变对象与不可变对象相关内容,一起来看看吧,希望对大家学习python有所帮助. 什么是可变/不可变对象 · 不可变对象,该对象所指向的内存中的值不能被改变. 当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. · 可变对象,该对象所指向的内存中的值可以被改变. 变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是 原地改

Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的. 不能改变状态的意思是:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 2. 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑.看下面代码: 1 String s =

Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对NSString对象做深拷贝时,如果是copy复制方式,其实就是浅复制,只是复制了同一个对象的指针:如果是mutableCopy复制方式,系统会分配一个新的内存空间用来存放复制出来的NSMutableString对象,此时地址是新的,内容是一样的,他们正在被不同的实例变量字符串指针指着. 可变对象:

Python 可变对象和不可变对象

具体可以看这里:http://thomaschen2011.iteye.com/blog/1441254 不可变对象:int,string,float,tuple 可变对象   :list,dictionary 可变对象和不可变对象在 python 中,如字面意思一样,可变对象一旦创建之后还可改变但是地址不会发生改变,即该变量指向的还是原来的对象.而不可变对象则相反,创建之后不能更改,如果更改则变量会指向一个新的对象. 举个栗子: >>> s = 'abc' # 不可变对象 >&g

Python基础:Python可变对象和不可变对象

Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,float,tuple 可变对象   :list,dictionary 对于全局变量来说,可变对象和不可变对象有很大的不同. 一.不可变对象 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的.运用这样的机制,有时候会让人产生糊涂,似乎可变对象变

“不可变的对象”与“不可变的对象引用”

什么是不可变的对象呢?我们都知道String是不可变的,如果有涉及大量的字符串拼接我们最好不要用String,虽然我们在代码中可以这样写: String str = "test"; str = "test1"; 这样写是没有错的,这是不是和我们所说的String类型时不可变的违背了呢?其实不然,我们这里看到str"改变"了值,其实不是不是真正改变了,而是改变了str的引用.我们从下图可以看到当定义String str = "test1&

【Python】可变对象和不可变对象

Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,float,tuple 可变对象   :list,dictionary 一.不可变对象 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的. 从上面得知,不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用. 输

Python坑系列:可变对象与不可变对象

在之前的文章 http://www.cnblogs.com/bitpeng/p/4748148.html 中,大家看到了ret.append(path) 和ret.append(path[:])的巨大差别.这和Python的对象机制有关.现在谈谈这个问题! 我们知道,Python有可变对象和不可变对象,他们的表现行为也迥然不同.先来几个简单的问题: 1 def foo1(arg): 2 arg = 5 3 print(arg) 4 5 x = 1 6 foo(x) # 输出5 7 print(x

【转】Python中的可变对象和不可变对象

python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list), set 一.不可变对象 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的.运用这样