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;
}
}