package com.lesson10.example;
/*
* 二、比较属性
* 1、string.equals(str) 判断两个字符串是否相等
* (1)参数:String
* (2)返回值:boolean
* 2、string.compareTo(str) 比较两个字符串,得到字符串之间的差值
* (1)参数:String
* (2)返回值:int 两个字符串的差值
* 0 string==str
* >0 string>str
* <0 string<str
* ---------------------------------------------------
* 注意:equals和compareTo都区分大小写,如果判断时需要忽略大小写,就使用
* equalsIgnoreCase()和compareToIgnoreCase()进行比较
* */
class Value{ //自定义类,用于EqualsExample中的例子
int i;Object o;public Value(Object o){
this.o = o;
}
}
class EqualsExample{//比较 == 和 equals的用法
/*
* 基本类型比较:只能使用 == ,不能使用equals
* */
public void compare1(){
int a = 1;int b = 1;byte c = 1;System.out.println("a == b " + (a == b));// trueSystem.out.println("a == b " + (a == c));// true//System.out.println(a.equals(b));//error,equals不能比较数值型
}
/*
* 字符串类型比较(最好使用equals比较)
* 1、== 比较变量本身的值,即两个变量在内存中的首地址
* 2、equals 比较变量的内容
* */
public void compare2(){
String str1 = "abc";String str2 = "abc";String str3 = new String("abc");char a = 'a';String str4 = a + "bc";//这种方法是不放入字符串池的System.out.println("str1 == str2 " + (str1 == str2));// true// 在JVM内存在字符串池,保存着很多String对象,可以被共享使用
//新建"abc"字符串时,系统会先到内存中查找是否存在'a'、'b'、'c',如果存在则直接引用,否则新建//索引str1和str2引用的是同一个字符串System.out.println("str1 == str3 " + (str1 == str3));// false//每new一次分配一块新的内存,是一个新的对象System.out.println("str1 == str4 " + (str1 == str4));// falseSystem.out.println("str1.equals(str2) " + (str1.equals(str2)));// trueSystem.out.println("str1.equals(str3) " + (str1.equals(str3)));// trueSystem.out.println("str1.equals(str4) " + (str1.equals(str4)));// true
}
/*
* 对象类型比较
* == 和 equals都是判断是否指向同一个对象(如果重写equals方法,则可设置equals比较对象的内容)
* */
public void compare3(){
Value v1 = new Value("ab");Value v2 = new Value("ab");Value v3 = new Value("abc");v1.i = v2.i = 100;//v1和v2不是同一个对象,所以v1.i和v2.i也不是同一个变量
System.out.println("v1 == v2 " + (v1 == v2));//falseSystem.out.println("v1.equals(v2) " + (v1.equals(v2)));//false//如果在自定义类中设置新的equals方法,则可以用来比较对象的内容。//但是Value没有重写equals,所以只能比较地址v3 = v1; //v3执行v1对象,则v3和v1是同一个对象System.out.println("v1 == v3 " + (v1 == v3)); //trueSystem.out.println("v1.equals(v3) " + (v1.equals(v3))); //true}
}
class CompareExample{//了解compareTo()方法的用法
/*
* 【compareTo()方法的比较方法】
* 1、从两个字符串的第一个字符开始比较,结果为两个字符的ASCII码值的差,如果前一个字符比较的字符差值为0,
* 再比较下一个字符,依次类推。(如果字符ASCII码的差值不为0,则比较结束,返回该ASCII码差值)
* 2、如果当其中一个字符串已经结束,还没有比较出大小(即前面所有比较的字符都相同),则返回字符串的长度差
* ---------------------------------------------------------------
* 【总结】优先依次比较字符ASCII码差值,ASCII码差值相同再比较长度差
* */
public void compare(){
String str1 = "abc";String str2 = "bcd";String str3 = "abef";String str4 = "abc1234";String str5 = "Abc";System.out.println("abc和bcd的compareTo值为:"+str1.compareTo(str2));//-1,差值为第一个字母的ASCII码的差值'a'-'b'=-1System.out.println("abc和abef的compareTo值为:"+str1.compareTo(str3));//-2,差值为第三个字母的ASCII码的差值'c'-'e'=-2System.out.println("abc和abc1234的compareTo值为:"+str1.compareTo(str4));//-4,差值为两个字符串的长度差,因为"abc"-"abc"=0,所以返回长度差System.out.println("abc和Abc的compareTo值为:"+str1.compareTo(str5));//32,差值为'a'-'A'=32,compareTo区分大小写System.out.println("abc和Abc的compareToIgnoreCase值为:"+str1.compareToIgnoreCase(str5));//0,compareToIgnoreCase可以忽略大小写
}
}
public class StringExample3 {
public static void main(String args[]){
//equals()方法EqualsExample ee = new EqualsExample();ee.compare1();//比较基本类型ee.compare2();//比较字符串类型ee.compare3();//比较对象类型//compare()方法CompareExample ce = new CompareExample();ce.compare();
}
}