范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

吊打面试官深拷贝浅拷贝引用拷贝的区别

  #头条创作挑战赛#引用拷贝
  引用拷贝: 引用拷贝不会在堆上创建一个新的对象,只 会在栈上生成一个新的引用地址,最终指向依然是 堆上的同一个对象 。 //实体类 public class Person{     public String name;//姓名     public int height;//身高     public StringBuilder something;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getHeight() {         return height;     }      public void setHeight(int height) {         this.height = height;     }      public StringBuilder getSomething() {         return something;     }      public void setSomething(StringBuilder something) {         this.something = something;     }      public Person(String name, int height, StringBuilder something) {         this.name = name;         this.height = height;         this.something = something;     }  }  //测试类 public class copyTest {     public static void main(String[] args) {         Person p1 = new Person("小张", 180, new StringBuilder("今天天气很好"));         Person p2 = p1;          System.out.println("对象是否相等:"+ (p1 == p2));         System.out.println("p1 属性值=" + p1.getName()+ ","+ p1.getHeight() + ","+ p1.getSomething());         System.out.println("p2 属性值=" + p2.getName()+ ","+ p2.getHeight() + ","+ p2.getSomething());           // change         p1.name="小王";         p1.height = 200;         p1.something.append(",适合出去玩");         System.out.println("...after p1 change....");          System.out.println("p1 属性值=" + p1.getName()+ ","+ p1.getHeight() + ","+ p1.getSomething());         System.out.println("p2 属性值=" + p2.getName()+ ","+ p2.getHeight() + ","+ p2.getSomething());      } }
  结果: 对象是否相等:true
  p1 属性值=小张,180,今天天气很好
  p2 属性值=小张,180,今天天气很好
  ...after p1 change....
  p1 属性值=小王,200,今天天气很好,适合出去玩
  p2 属性值=小王,200,今天天气很好,适合出去玩
  before change:
  after change:
  我们可以看出 由于2个引用p1,p2 都是指向堆中同一个对象,所以2个对象是相等的,修改了对象p1,会影响到对象p2 需要注意的 name属性,虽然她是引用类型,但她同时也是String类型,不可变,对其修改,JVM会默认在堆上创建新的内存空间,再重新赋值 int weight=180; 是成员变量,存放在堆中,不是所有的基本类型变量 都存放在JVM栈中
  注意与这篇文章得区分开来 https://mp.weixin.qq.com/s/6qRspyLAsoBxttGwGtxsAA,int num1 = 10;是基本类型的局部变量, 存放在栈中 浅拷贝
  浅拷贝 :浅拷贝会在堆上创建一个新的对象, 新对象和原对象不等,但是新对象的属性和老对象相同 。 其中: 如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值。 如果属性是引用类型(除了基本类型都是引用类型),拷贝的就是引⽤数据类型变量的地址值,⽽对于引⽤类型变量指向的堆中的对象不会拷贝。
  如何实现浅拷贝呢?也很简单, 就是在需要拷贝的类上实现Cloneable接口并重写其clone()方法 。 @Override protected Object clone() throws CloneNotSupportedException {        return super.clone();  }
  在使用的时候直接调用类的clone()方法即可 //实体类 继承Cloneable public class Person implements Cloneable{     public String name;//姓名     public int height;//身高     public StringBuilder something;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getHeight() {         return height;     }      public void setHeight(int height) {         this.height = height;     }      public StringBuilder getSomething() {         return something;     }      public void setSomething(StringBuilder something) {         this.something = something;     }      public Person(String name, int height, StringBuilder something) {         this.name = name;         this.height = height;         this.something = something;     }        @Override     public Person clone() throws CloneNotSupportedException {         return (Person) super.clone();     }  }  //测试类 public class shallowCopyTest {      public static void main(String[] args) throws CloneNotSupportedException {         Person p1 = new Person("小张", 180, new StringBuilder("今天天气很好"));         Person p2 = p1.clone();          System.out.println("对象是否相等:"+ (p1 == p2));         System.out.println("p1 属性值=" + p1.getName()+ ","+ p1.getHeight() + ","+ p1.getSomething());         System.out.println("p2 属性值=" + p2.getName()+ ","+ p2.getHeight() + ","+ p2.getSomething());           // change         p1.setName("小王");         p1.setHeight(200);         p1.getSomething().append(",适合出去玩");         System.out.println("...after p1 change....");          System.out.println("p1 属性值=" + p1.getName()+ ","+ p1.getHeight() + ","+ p1.getSomething());         System.out.println("p2 属性值=" + p2.getName()+ ","+ p2.getHeight() + ","+ p2.getSomething());      } }
  结果: 对象是否相等:false
  p1 属性值=小张,180,今天天气很好
  p2 属性值=小张,180,今天天气很好
  ...after p1 change....
  p1 属性值=小王,200,今天天气很好,适合出去玩
  p2 属性值=小张,180,今天天气很好,适合出去玩
  before change:
  after change:
  我们可以看出: 当我们修改对象p1的weight属性时,由于p2的height属性 是直接复制修改前的p1的height属性,所以还是180。 当我们修改对象p1的name属性 时,String name指向一个新的内存空间,但对象p2的name还是指向旧的内存空间,所以对象p2的name属性还是"小张"。 由于对象p1的something属性和对象p2的something属性指向是同一个内存空间,当我们修改对象p1的something属性,会影响到对象p2的something属性,所以对象p2的something属性变为"今天天气很好,适合出去玩"。 深拷贝
  深拷贝 :完全拷贝⼀个对象,在堆上创建一个新的对象,拷贝被拷贝对象的成员变量的值,同时堆中的对象也会拷贝。 需要重写clone方法     @Override     public Person clone() throws CloneNotSupportedException {         //return (Person) super.clone();         Person person = (Person) super.clone();         person.setSomething( new StringBuilder(person.getSomething()));//单独为引用类型clone         return person;     }
  shallowCopyTest测试类的结果: 对象是否相等:false
  p1 属性值=小张,180,今天天气很好
  p2 属性值=小张,180,今天天气很好
  ...after p1 change....
  p1 属性值=小王,200,今天天气很好,适合出去玩
  p2 属性值=小张,180,今天天气很好
  这时候对象p1和对象p2互不干扰了
  before change:
  after change:
  但这样也有个小问题,对象每有一个引用类型,我们都得重写其clone方法,这样会非常麻烦,因此我们还可以借助 序列化 来实现对象的深拷贝 //实体类 继承Cloneable public class Person implements Serializable{     public String name;//姓名     public int height;//身高     public StringBuilder something;  ...//省略 getter setter       public Object deepClone() throws Exception{         // 序列化         ByteArrayOutputStream bos = new ByteArrayOutputStream();         ObjectOutputStream oos = new ObjectOutputStream(bos);              oos.writeObject(this);              // 反序列化         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());         ObjectInputStream ois = new ObjectInputStream(bis);              return ois.readObject();     }  }  //测试类,这边类名笔者就不换了,在之前的基础上改改 public class shallowCopyTest {      public static void main(String[] args) throws Exception {         Person p1 = new Person("小张", 180, new StringBuilder("今天天气很好"));         Person p2 = (Person)p1.deepClone();          System.out.println("对象是否相等:"+ (p1 == p2));         System.out.println("p1 属性值=" + p1.getName()+ ","+ p1.getHeight() + ","+ p1.getSomething());         System.out.println("p2 属性值=" + p2.getName()+ ","+ p2.getHeight() + ","+ p2.getSomething());           // change         p1.setName("小王");         p1.setHeight(200);         p1.getSomething().append(",适合出去玩");         System.out.println("...after p1 change....");          System.out.println("p1 属性值=" + p1.getName()+ ","+ p1.getHeight() + ","+ p1.getSomething());         System.out.println("p2 属性值=" + p2.getName()+ ","+ p2.getHeight() + ","+ p2.getSomething());      } }
  这样也会得到深拷贝的结果 小结引用拷贝: 引用拷贝不会在堆上创建一个新的对象,只 会在栈上生成一个新的引用地址,最终指向依然是 堆上的同一个对象 。 浅拷贝 :浅拷贝会在堆上创建一个新的对象, 新对象和原对象不等,但是新对象的属性和老对象相同 。
  其中: 如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值。 如果属性是引用类型(除了基本类型都是引用类型),拷贝的就是引⽤数据类型变量的地址值,⽽对于引⽤类型变量指向的堆中的对象不会拷贝。
  3.深拷贝 :完全拷贝⼀个对象,在堆上创建一个新的对象,拷贝被拷贝对象的成员变量的值,同时堆中的对象也会拷贝。
  本篇文章到这里就结束啦,如果我的文章对你有所帮助,还请帮忙一键三连: 点赞、关注、收藏 ,你的支持会激励我输出更高质量的文章,感谢!
  计算机内功、JAVA源码、职业成长、项目实战、面试相关等更多高质量文章,首发于公众号「小牛呼噜噜」,我们下期再见。

女人再忙,家里这4个地方也要保持干净,日子才会顺风顺水都说家是温暖的港湾,大多数人的一生有超过一半的时间都要在家中度过,一生中见过的人与自己相处时间最长的也是自己的家人。家里面到环境情况能够反映出一个人的生活状态,干净而又整洁的家居环宣恩首创!旅游行业地方标准获批准二宣恩县抢抓湖北省建设全国构建发展格局先行区和恩施州打造国家全域旅游示范区等重大机遇,乘势而上顺势而为,进一步擦亮旅游名片。据此,恩施土家族苗族自治州市场监督管理局批准发布仙山贡水旅我的乡村我的家流水潺潺入暖泉村庄档案暖泉村,位于临泽县鸭暖镇境内,辖17个合作社,786户,2696人,耕地面积12653亩,以玉米制种甜叶菊红辣椒芦笋等作物种植为主导产业,2021年全村农民人均纯收入1。7活着就是福气很喜欢一句话一个人脾气来的时候,福气就走了,你做对了,没有必要生气,做错了没有资格生气,这样想就不会生气了。深以为然。生气一方面是对自己无能的一种愤慨,另一方面多是自私自利的表现,藕断丝连似是分离,实则相连一个女子被丈夫遗弃了,可她还是依恋着丈夫,她对丈夫说你的心啊,就象我梳妆匣中的镜子一样,破了就不能复原了。可我的心啊,却象藕里面的丝一样,藕断了丝还连着。我那里会想到,一个驾着车子达里诺尔(30)201705克什克腾旗在赤峰市区的西北部,达里诺尔湖又在克什克腾旗的西部,这里到锡林浩特只有不到一百公里的距离。达里诺尔湖宽广辽阔,水面清澈,蓝天白云映照下好像再次来到青海湖畔,只是湖边没有连立创文旅行业恋游强大背景背后,当真实力雄厚还是另有隐情?目前,全国各地都在推进乡村振兴战略特色发展,建设乡村塑性,加强乡村治理铸魂,提升乡村服务水平。通过深入调研分析了解,乡村振兴需要的是高质量重创新所打造的合作平台。细化政策强化乡村对昌乐旅游线上线下联动宣传营销,获社会广泛关注昌乐县文旅局以2022年度潍坊旅游十佳评选活动为契机,在积极参与评选活动的同时,不断创新宣传营销手段,广泛发动社会力量参与,以线上线下联动方式,借助新媒体平台,大力开展新媒体宣传营睢宁一村庄入选国家级名录扬子晚报10月31日讯(记者马志亚)近日,住房和城乡建设部发布了关于拟列入第六批中国传统村落名录村落名单的公示,江苏睢宁姚集镇黄山前村成功入选。睢宁县姚集镇黄山前村隶属于姚集镇,与浙江工业大学公布新发明一种利用水库的浮力储能装置据中国专利公布公告网显示,由浙江工业大学申请专利的新发明一种利用水库的浮力储能装置在近日公布。该专利公布了一种利用水库的浮力储能装置,可通过浮体在水中的上下移动来实现存储和释放能量惨不忍睹!印度拉索桥断裂塌陷,致141人死亡意外真的无处不在,躲也躲不了,明天和意外不知道哪一个先来。前一秒是快乐,后一秒就是悲哀。印度的百年拉索桥,突然断裂塌陷,导致141人丧失生命。这是一座一百多年的桥,一百多年的风风雨
一棵梧桐树的遐想李金山遥望着湛蓝的天穹,面对浩渺的长空。让美丽的思绪,随着时光流动。红尘蒙蒙,季节变更,风一程云一程,只为寻觅美丽的梦。阳光明媚,月色晶莹。凸凹不平,深浅遗影。错过了如水流逝,人间朋友圈最符合心情的唯美句子一我们这么拼,这么努力赚钱,就是为了要用老子有钱四个字,去堵住所有人的嘴。二人和人终究是不同的,有人风雨中送来的晚餐,却不及某人一句随口说出的晚安。三越长大越不敢依赖别人,怕人心会中国美丽古村苏龙口爱木图中国美丽古村苏龙口爱木图中视新闻观察员郑志东原平风华正茂,木图秋月最美。9月8日,人们走进山西省忻州市原平苏龙口镇木图村,中秋喜迎乡村振兴爱木图推介会暨相聚原平牵手大会。喜气洋洋的上海冷门的千年古镇,被称为浦南第一镇,已修缮完毕免费开放大多数人对上海的第一印象是一座时尚繁华的现代都市。实际上,上海并非只有城市风光,还有惬意质朴的江南水乡。在上海的西南角距离东海的海岸线不过十几公里的地方,坐落着一座低调隐世的千年古假期观潮指南来了!强烈建议选择公共交通出行,务必注意安全中秋假期,除了赏月,最让人期待的就是观潮了。八月十八潮壮观天下无,小伙伴们可以参考下方的潮汐预报,挑选合适的时间和位置,观赏壮观的钱江潮。观潮活动期间,杭州公安交警也将对部分路段进中国唯一泡在泉水里的城市,潇洒似江南,舒服到不想离开泉池河湖四者具备,它是北方唯一的水城!济南,中国唯一一座泡在泉水里的城市。这里家家泉水,户户垂杨,潇洒似江南,却又没有江南的脾气,在这生活实在舒服!有人只喜欢济南的秋冬,但它夏天的张家口这座千年古城的前世今生李爱萍提起这座古城的兴衰史,也让人有点心酸。有些事情往往就是这样,当初因为某人的一句话,或某一个事件,就改变了一座古城的历史走向,兴也好,衰也罢,不以这里的人的意志为转移,兴,让人走进神州水乡第一镇甪直甪直镇位于苏州城东南,距今已有2500多年历史,古称甫里,因河道街形状象甪字,改现名。古镇甪直被誉为神州水乡第一镇。甪直地处太湖流域,素有五湖之厅六泽之冲的美誉。古镇人贴水成街,枕抬头!看抬头!看!9月10日晚在江苏省南京市拍摄的圆月与阅江楼。新华社发(方东旭摄)今天是中秋节而17时59分也是中秋满月最圆的时刻一切的一切都是那么地恰到好处从古至今人们对月亮有着许许多莆田的这座千年古邑到底有多美?游洋镇,隶属福建省莆田市仙游县,地处仙游县东北部,东毗涵江区庄边镇城厢区常太镇,南靠钟山镇,西邻石苍乡,北接福州市永泰县梧桐镇。双峰村许武摄游洋镇唐设镇,宋元明设县,迄今为止己有一环华旅行,行走抚州,空气太好,美食太爽,简直扛不住啊分享你最喜欢的照片一个偶然的机会来到江西抚州,刚下高铁出站时就被广告牌上的无霾之城吸引,这里空气真这么好?出站后,空气中透着夏日的晚间的凉意,吹着晚风,清爽宜人,进城后,看到一家火