java基础知识篇

1.“==”与“equals()”的区别”
 == 判断的是两个对象的地址是否相等,判断两个对象是不是同一个对象,基本数类型==比较的是值,
 引用数据类型==比较的是内存地址,当比较两个引用数据类型时,示例如下:
  String s="abc";
  String b=ab+"c";
  String a=new String("abc");
  String c=new String("abc");
  System.out.println(s==b);
  System.out.println(a==c);
上述代码中,第一次输出返回结果为true,String虽然是引用数据类型,但是创建的变量,指向的是常
量池中 存储的“abc”地址值,而第二种编译时“ab+'c'” 为"abc",二者变量存储的是相同的地址值,所以返
回结果是true。new String则是从堆内存中重新开辟一块空间用于存储常量池中的地址,而a,c变量指向
堆内存中重新开辟的空间的地址,二者的比较返回结果是true。
  
hashcode
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数,该整数即就是对象
的内部地址转换成一个整数。
       ①在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致
地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一
 次执行到同一应用程序的另一次执行,该整数无需保持一致。 
      ②如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 
hashCode方法都必须生成相同的整数结果。 
     ③ 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调
用hashCode 方法不要求一定生成不同的整数结果。
equals方法
String中的equals方法被重写,Object中的equals方法比较的是对象的内存地址值,而String中
的equals方法继承自Object,但是重写了equals方法,比较的是对象的值,当创建String对象时,
jvm虚拟机会在常量池中查找已存在的值和要创建的值相同的对象,如果没有就在缓冲池中重新创建
一个String对象。
java中的clone方法深拷贝与浅拷贝以及cloneable接口

使用clone方法为了复制一个对象,调用clone方法时,分配的内存和源对象相同,然后在使用原对象中
对应的各个域,填充新对象的域,填充完成之后,clone方法返回,一个新的对象被创建,同时把新对象
的引用对外公布。
cloneable接口
public interface Cloneable
此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 如果
在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致CloneNotSupportedException 
异常。按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 
方法是反射性调用的,也无法保证它将获得成功。
浅拷贝:被复制对象的所有值属性都含有与原来对象的相同,而所有的对象引用属性仍然指向原来的对象,代码如下:
     Dog d=new Dog("哈士奇","黄色",1);
     Dog f=(Dog).d.clone();
     System.out.println(d);
     System.out.println(f);
这种浅拷贝属于引用的复制,调用了父类中clone方法,它们都指向相同的对象Dog("哈士奇","黄色"),
返回的地址是相同的。
深拷贝:在浅拷贝的基础上,所有引用其他对象的变量也进行了clone,并指向被复制过的新对象,实现代码如下:
  如果要实现深拷贝就需要实现cloneable接口,如果没有实现该接口或者对象的类不能实现该接口,就
  会抛出CloneNotSupportedException 异常,要在clone对象时进行深拷贝, 那么就要Clonable接口,覆
  盖并实现clone方法,除了调用父类中的clone方法得到新的对象, 还要将该类中的引用变量也clone出
  来。如果只是用Object中默认的clone方法,是浅拷贝。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值