Java学习day15-==操作符与equals方法;String对象的创建
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java学习day15-==操作符与equals方法;String对象的创建,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5155字,纯文字阅读大概需要8分钟。
内容图文
一、==操作符
1.基本类型比较值:只要两个变量的值相等,即为true。
例如int a = 5;System.out.println(a == 5);//true
2.引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。
例如 Person p1 = new person(); Person p2 = new person(); System.out.println(p1 == p2);//false
注意:用“==”进行比较时符号两边的数据类型必须兼容(可自动转换的数据类型除外),否则编译出错。
二、equals方法
格式:obj1.aquals(obj2)
1.equals():所有类都继承了Object,也就获得了equals()方法。还可以重写。
2.equals()在一般情况下,只能比较引用类型,其作用与“==”相同,比较是否指向同一对象。
例如: Person p1 = new person(); Person p2 = new person(); System.out.println(p1.equals(p2));//false
注意:当用equals()方法进行比较时,对类File、类String、类Data以及包装类(Wrapper Class)来说,是比较类型和内容,不考虑引用的是否是同一对象。原因是在这些类中,重写了Object类的equals()方法。
例如:String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1.equals(s2));//true
结论:对于对象来说,特殊的类,如String、File、Data,使用==比较的是对象(即对象的内存地址),使用equals()则比较的是内容。
普通的类,==和equals()比较的都是对象(即对象的内存地址)。
如果你想改变某一个类的equals()方法,不想用equals()来比较对象的内存地址,就需要重写equals()方法。
三、String对象的创建
1.字面量创建String对象
String s1 = “abc”;//常量池中添加“abc”对象,返回引用地址给s1对象;
String s2 = “abc”;//通过equals()方法判断常量池中已有值为abc的对象,直接返回相同的引用地址给s2对象;
System.out.println(s1 == s2);//true--所以s1 == s2。
2.new创建String对象
String s3 = new String("def");//在常量池中添加“def”对象,在堆中建值为“def”的对象s3,返回引用地址给s3对象;
String s4 = new String("def");//常量池中已有值为“def”的对象,不做处理,但在堆中创建值为“def”的对象s4,返回引用地址给s4对象。
3.String s5 = “x” + “y”;//经过JVM优化后,会直接在常量池中添加“xy”对象,返回引用地址给s5对象。
4.String s6 = new String("1") + new String("1") + new String("2");//通过StringBuilder实现,在常量池中添加“1”和“2”两个对象,并在堆中创建值为“112”的对象,把引用地址返回给s6对象。
如图所示:
例题:1.编写Order类,有int型的orderId,String型的orderName,相应的getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:public boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。
1 package day14; 2 3 public class Order { 4 public Order(int orderId,String orderName){ 5 this.orderId = orderId; 6 this.orderName = orderName; 7 }//两个参数的构造器 8 9 int orderId; 10 String orderName; 11 12 public int getOrderId() { 13 return orderId; 14 } 15 public void setOrderId(int orderId) { 16 this.orderId = orderId; 17 } 18 public String getOrderName() { 19 return orderName; 20 } 21 public void setOrderName(String orderName) { 22 this.orderName = orderName; 23 } 24 25 public boolean equals(Object obj) { 26 boolean flag = false;//先给一个初始化的值,flag是标识位 27 if(obj instanceof Order){//判断obj是不是Order类 28 Order o = (Order) obj;//如果是,把obj强转成Order类型 29 30 if(this.orderId == o.orderId && this.orderName.equals(o.orderName)){//比较当前Order类的orderId与传入的orderId是否相等,String类型的orderName则用equals()方法比较值 31 flag = true; 32 } 33 } 34 35 return flag; 36 } 37 38 }
在test中赋值测试
package day14; public class Test { public static void main(String[] args){ Order o1 = new Order(123,"a001"); Order o2 = new Order(123,"a001"); System.out.println(o1.equals(o2)); } }
打印结果为:true。
更改赋值再次测试
package day14; public class Test { public static void main(String[] args){ Order o1 = new Order(123,"a001"); Order o2 = new Order(123,"a002"); System.out.println(o1.equals(o2)); } }
打印结果为:false。
例题2:请根据以下代码自行定义能满足需要的MyData类,在MyData类中覆盖equals()方法,使其判断当两个MyData类型对象的年月日都相同时,结果为true,否则为false。
public boolean equals(Object o)
package day14; public class MyDate { public MyDate(int year, int month, int day){ this.year = year; this.month = month; this.day = day; } int year; int month; int day; public boolean equals(Object obj) {//重写equals方法 int flag = 1;//初始化flag=1,第一层判断,如果传进来的obj不是MyDate类型,跳过第一个if,直接进行true or false的判断。 if(obj instanceof MyDate){ MyDate md = (MyDate) obj;//强制转换成MyDate类型 flag = 0;//如果传进来的obj是MyDate类型,则把flag初始化为0 if(this.year != md.year){ flag +=1;//如果有一组不相等,就会flag+1 } if(this.month != md.month){ flag +=1;//两组不相等,flag的值就是2 } if(this.day != md.day){ flag +=1;//全都不相等,flag就是3 } } if(flag == 0){//只有全部相等,flag才是0 return true; }else{ return false; } } }
赋值测试
package day14; public class Test { public static void main(String[] args){ MyDate m1 = new MyDate(2030,11,23); MyDate m2 = new MyDate(2030,11,23); System.out.println(m1.equals(m2)); } }
打印结果为:true
再次赋值测试
package day14; public class Test { public static void main(String[] args){ MyDate m1 = new MyDate(2030,11,23); MyDate m2 = new MyDate(2050,11,23); System.out.println(m1.equals(m2)); } }
打印结果为:false
内容总结
以上是互联网集市为您收集整理的Java学习day15-==操作符与equals方法;String对象的创建全部内容,希望文章能够帮你解决Java学习day15-==操作符与equals方法;String对象的创建所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。