永发信息网

map<String,Object>中放的东西是引用还是对象

答案:2  悬赏:80  手机版
解决时间 2021-02-09 11:57
map<String,Object>中放的东西是引用还是对象
最佳答案
实际上,java力图使程序员忘记指针,这包括2个方面:
第一,java限制指针,去除了指针运算。
第二,java从语法上努力隐藏指针,让指向某对象的指针看起来更像那个对象本身!是的,所有的java书籍都让人忘记了指针这回事,我们仿佛只跟对象打交道。偶尔,会被迫分清引用和
对象的关系。这就是目前的情形。多么好的想法!对象可比那些个不知所以的指针亲和多了!这是一种伟大的抽象!这里,我们也更愿意把引用和对象混淆。是的,为什么不呢?那样,整个世界都是对象,太好理解了!可事实上,为了节省内存,java不能把引用(指针)完全废除。要知道,复制一个引用(指针)要比
复制整个对象有效得多!所以我们不得不面对引用和对象共存的事实。下面我就好好分析分析:指针已经被抽象成了引用,现在指针不能够随心所欲的运算,并且看起来就像个对象,完全没有了指针
的模样。但它毕竟和对象还是不同的,还要经过一层“转换”(从指向的那个对象里取数据)。如果我们
在引用满天飞的时候总想着这样一层转换,真的是很不舒服。比如:
String key="name";
String value="hyq";
HashMap map=new HashMap();
map.put(key,value);你得想着:key只是个引用,value也是个引用,map还是个引用,我们刚刚做的是把key和value
这2个引用放进了map(也是个HashMap对象的引用)中,到时候我就可以通过map这个引用取得
里面的对应于key引用的value引用!你不晕我就服了。
一旦你这样想,你每时每刻都要面对这样的绕口令。因为我们对对象的操作全部要通过引用!java没有提供语法让你直接得到对象!(指的是直接寻址)这一点通过比较原始类型很好理解,int i=8,那么
i就是8,不是什么指针,要先找到放着8那块内存的地址再把8拿出来。这样多直接,多方便啊!所以,我们对引用最好也这么来理解,就轻松多了。
还是上面的例子,key就是个String,value也是个String,map是个HashMap,我们把key和value
放进map里,将来可以按key取出value。——多简单!其实,这样的理解是很符合人的思维习惯的,我相信大多数人刚学java时都会自然而然的这么理解,
但是我们一定要注意在什么时候不能这么理解。只要记住什么时候不能这么理解,我们就不会因为
这种“近似”的理解方式而犯错,而同时从这种理解方式里得到了方便和好处。把引用直接当作对象本身的好处是简单直接,容易理解,而“误差”的地方就在于,假设只有这个引用
可以修改此对象。换句话说,当别的引用修改了对象的时候,我们毫不知情并很感费解。比如:String name=null;
HashMap map=new HashMap();
map.put("name",name);//do a lot of things
name="hyq";当我们再从map里取出name的时候,发现它已经被赋值为hyq了!放进去的时候明明是啥都没有啊!
咋就变了讷?
引用到name那个对象的不只你map一个阿!在同一个函数里出现这种情况还不是很常见,我们一般也不必这么写,更多的是出现在函数调用、传参的时候,这样更加隐蔽,不易发现,也让代码可读性下降。比如:
String name=null;
HashMap map=new HashMap();
map.put("name",name);alterName(name);在alterName函数里我们修改了name对象,这会直接影响到函数外的map。所以,当我们把引用和对象故意混淆时,一定要记住什么时候应该分清楚。对象的使用不外乎以下几种情况:1
String name=new String("hyq");
然后使用name,引用生命周期一结束,对象失效(无法被取用)了事。这里只有name一个引用指向此对象,随便怎么弄都不会出事。2
String name=new String("hyq");
String anotherName=name;这里假设只有name会修改对象,并且在anotherName引用此对象前做完所有修改,anotherName只是取用这个对象调用方法。在这种情况下,也不会出事。这也是我们经常遇到的情况,并且一般都是在函数调用传参时出现。注意传参实际上就是String anotherName=name;
这里尤其要注意的是2个引用的生命周期:name修改对象的时候另一个引用还没出世,而等它出世后
发现它又不会修改对象,怎一个爽字了得!3
String name=new String("hyq");
String anotherName=name;
代码和上面一样,但是这里要么2个引用都会修改对象,要么只有一个修改但会影响到另一个。这个时候无论如何你不能再把引用当对象了,你必须分清楚它们。你必须小心仔细,不能有丝毫疏忽。当然,这种写法和风格无论如何是不值得提倡的,若非必要(没办法)请勿模仿!因为必然有一个引用
在不知情的情况下被人修改了对象,等它用的时候会大吃一惊,而这个对象是在什么时候被什么人修改的,极难排查。
(上面例子举得不好,String类是不变类,汗!)
StringBuffer name=new StringBuffer("hyq");
StringBuffer anotherName=name;
//do a lot of things
anotherName.append("is my gf");你可能写得爽,一时痛快就这么写了,你也知道是什么人在什么时候修改了对象,但是别人呢?
要知道,这里可能不是相隔几行代码这么简单,可能是嵌套了好几层函数调用!你把那个anotherName传到第5层函数里面,然后丧心病狂的修改了那个对象,除了天知地知你知,鬼
都看不出来!
全部回答
引用 我们写个例子 1. 新建个 user 对象 public class user{     private string name;     public user(string name){         this.name = name;     }     public string getname(){         return name;     }     public void setname(string name){...展开引用 我们写个例子 1. 新建个 user 对象 public class user{     private string name;     public user(string name){         this.name = name;     }     public string getname(){         return name;     }     public void setname(string name){         this.name = name;     } } 2.      public static void main(string[] args){         user user = new user("feilong");         map map = new hashmap();         map.put("user", user);         //***********修改         user value = (user) map.get("user");         value.setname("fl");         //*************************         system.out.println(user.getname());     } 输出: fl 3.表明 是引用, 如果元素内容修改了, 那么 原始对象数据输出的就是同样变更的内容 收起
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
“圣人者,必圣其时、必圣其地、必圣其人,复
翡翠幼儿园(铜仁德江县)地址在什么地方,我要
祛风湿药的药性大多为A.甘寒滋润B.辛温性燥C.
女命丁丑,打算在2020年农历11月十三曰寅时结
金果果幼儿园(铜仁德江县)怎么去啊,我要去那
精纯琥珀这个地址在什么地方,我要处理点事
西游大战僵尸2怎么回法和回血啊?
我开了一家干果店,现在需要铺货了不知道哪里
启航幼儿园(铜仁德江县)地址有知道的么?有点
北郊幼儿园(铜仁德江县)地址在哪,我要去那里
祥聚商行地址在哪,我要去那里办事
我想咨询一下我种的桃树枣树国家征地赔偿多少
人在高速行驶的列车上跳起来后会落在何处原理
云联惠是不是骗局揭秘
新星幼儿园(铜仁德江县)地址有知道的么?有点
推荐资讯
尚舞艺术培训中心地址在什么地方,我要处理点
缤纷博罗连锁总店地址在哪,我要去那里办事
如何从男朋友手机里的微信和QQ里面试探出他的
伊力特在哪里啊,我有事要去这个地方
用水,动物,森林,空气,地球写五句环保标语
k550次列车11车厢是1列车长办公席么?尾号多
腾冠食品地址在什么地方,想过去办事
三人行美业地址有知道的么?有点事想过去
已知实系数方程 的两个实数根分别是 ,且
在大白菜中自带的dg分区工具重新快速分区后,
吉祥装饰店怎么去啊,有知道地址的么
英语导游资格证怎么考,需要先考导游资格证吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?