Day13

Clone

  • 重写父类的clone对象
  • 实现cloneable接口

String

理解String=和new String

String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象

使用字符串常量池每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)。

image-20210114155706261

上面都是别人的

自己的理解:

第一次用String simple="a";会先判断常量池中是否已经存在a,(第一次使用应该是不存在的),不存在就创建一个对象在常量池中(没有使用new,不在堆上),存在就返回常量池中的引用。

String simple2="a"; 这次使用常量池中就一定存在了,所以返回的的相同的,所以simple==simple2会返回true

如果不使用=的形式,不管是+-、sub等等操作,都是返回new String(...);!!!new 一个对象,是在方法区开辟空间,所以一定会新建一个对象,这个对象再指向常量池(如果有的话);比如

String simple3 = new String("a");尽管常量池中已经存在了,但是new一定会再堆上开辟空间。

String simple="a";//假设不存在,就需要创建,创建之后引用地址为0x001
String simple2="a";//检测常量池中是否存在,已经存在,返回0x001
String  simple3 = new String("a");//先在堆上创建对象,对象地址为0xabc,然后指向常量池中的0x001 
//源代码中是这样写的  this.value = original.value;   就是把常量池中创建的char[]地址传给当前对象的char
//这样 simple=0x001,simple2 = 0x001, simple3 = 0xabc
//如果直接用simple2==simple3比较地址肯定是不相等的
posted @ 2021-01-14 16:45  多米_dmxq#top  阅读(112)  评论(0)    收藏  举报