String equal hashcode

package Test;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class TestString {
	/*
	 * 基本数据类型,==等比的是值
	 * 对象,==对比的是内存地址
	 * equals 默认是对比内存地址,除非此类重写了equals方法,比如String,Integer,Date类
	 * */
	public static void main(String args[]){
		String s1 = "Monday";
		//在字符串缓冲区找到相同值的对象,所以直接引用
		String s2 = "Monday";
		//new 的话,会新建一个对象,所以==比较不相等
		String s3 = new String("Monday");
		System.out.println(s1==s2);//true ==对比的是内存的地址
		System.out.println(s1==s3);//false
		System.out.println(s1.equals(s3)); //String类重新了equals方法,它会对比字符串的值是否完全相等
		
		//StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。
		//String的操作都是改变赋值地址而不是改变值操作。 
		//如果经常需要对一个字符串进行修改,使用StringBuffer要更加适合一些。
		
		StringBuffer s4 = new StringBuffer("Monday");
		s4.append("1");  
		s4.insert(6, "happy");
		System.out.println(s4);//Mondayhappy1
		
		//StringBuffer和StringBuilder类功能基本相似,
		//主要区别在于StringBuffer类的方法是多线程、安全的
		//而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。
		//对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。 
		StringBuilder s5 = new StringBuilder("Tuesday");
		s5.append("2");
		System.out.println(s5); //Tuesday2
		
		//hashcode
		//hashcode方法只有在set集合中用到,若hash值一样,则认为是相同对象,不会重复放入set集合中
		LinkedList<Student> list = new LinkedList<Student>();  
        Set<Student> set = new HashSet<Student>();  
        Student stu1  = new Student(3,"张三");  
        Student stu2  = new Student(3,"张三");  
        System.out.println("stu1 == stu2 : "+(stu1 == stu2));//stu1 == stu2 : false
        System.out.println("stu1.equals(stu2) : "+stu1.equals(stu2));//stu1.equals(stu2) : true
        list.add(stu1);  
        list.add(stu2);  
        System.out.println("list size:"+ list.size()); //list size:2        
        set.add(stu1);  
        set.add(stu2);
        System.out.println("set size:"+ set.size());//set size:1
        set.remove(stu1);
        System.out.println("set size:"+ set.size());//set size:0
	}
}
//学生类
class Student {
	private int age;
	private String name;
	public Student() {
	}
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		System.out.println("hashCode : "+ result);
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}	
}

猜你喜欢

转载自yangeoo.iteye.com/blog/2217095