一、==和equals的区别
==:
- 基本类型,值相等即返回true
- 引用类型:比较栈(stack)内存的地址是否相等,相等即可返回true(string和integer除外,由于两个对象在jvm中存储不同)
equals:
- 不能比较基本类型,只能比较两个对象,堆(heap)内存中的值是否相等,如果相等返回true
- 一般需要自定义,重写该方法,主要有业务决定
int t1=1;
int t2=2;
Person p1=new Person();
Person p2=new Person();
t1==t2 //true
p1==p2 //false
p1.equals(p2) //true
此处重点说明string和integer对象
String内存位置说明
- 显式的String常量
详解string内存空间
String a1 = “holten”;
String b1 = “holten”;
第一句代码执行后就在常量池(java7前在方法区中,java7后移至对堆里)中创建了一个值为holten的String对象;
第二句执行时,因为常量池中存在holten所以就不再创建新的String对象了。
此时该字符串的引用在虚拟机栈里面。
另外:
String s1=”a”;
String s2=s1+”b”;
System.out.println(s2==”ab”);//输出false
这里s2地址和”ab”地址不一致,所以输出false
String对象
String a2 = new String(“holtenObj”);
String b2 = new String(“holtenObj”);
Class被加载时就在常量池中创建了一个值为holtenObj的String对象,第一句执行时会在堆里创建new String(“holtenObj”)对象;
第二句执行时,因为常量池中存在holtenObj所以就不再创建新的String对象了,直接在堆里创建new String(“holtenObj”)对象。
此时:
a1==b1 //true 常量池值不变
a2==b2 //false 比较栈内存地址
a1.equals(b1) //true 比较string对象值
a2.equals(b2) //true 比较new string()对象在堆内存中的值
integer:
在interger类中,为了初始化方便,提供-128-127之间的数创建对象时直接创建在常量池中,其他对象会建立堆内存中
integer t1=new integer(1);
integer t2=new integer(1);
integer t3=new integer(128);
integer t4=new integer(128);
Integer c = 3;
Integer d = 3;
c==d //true jvm底层在常量池建立一个integer对象
c.equals(d) //true 值相等
t1==t2 //true
t1.equals(t2) //true
t3==t4 //false 地址不一致
t3.equals(t4) //true 堆内存中对象值相等
int i=2017:
Integer j=2017;
i==j //true
i.equals(j) //true 实际对象值相等
接口和抽象类的区别
共同点:
都不能创建实例化对象,且可包含抽象方法
不同点:
第一:从接口和类的角度
- 类中可以有静态方法和普通方法的实现,静态变量和普通变量,构造器和普通代码块,而接口都没有
- 接口可以支持实现多个接口,类不能多继承。
第二:从设计思想的角度
- 接口体现一种规范,系统的总览,规定了实现者向外提供的服务,规定了调用者可以调用的方法和如何访问该方法
- 抽象类体现一种模板式设计,即多个子类调用同一个父类,可以作为系统实现过程中的中间产品,这个产品已经实现了部分功能,但是又有部分功能没有实现,即这个产品不是最终产品。