Programming/JAVA
JAVA.LANG PACKAGE
gyu0
2020. 7. 7. 23:23
equals()
equals test
Value(int Value){
this.Value = Value;
}
}
public class EqualsEx1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if(v1.equals(v2)) {
System.out.println("v1과 v2는 같습니다.");
}
else {
System.out.println("v1과 v2는 다릅니다.");
}
}//메인
}//java.lang.package equals test.
equals test (overriding)
class Person{
long id;
public boolean equals(Object obj) {
if (obj instanceof Person) {
return id == ((Person)obj).id;
//obj가 object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다.
}
else {
return false;
}
}
Person(long id){
this.id=id;
}
}
public class EqualsEx2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);
if(p1==p2)
System.out.println("p1과 p2는 같은 사람 입니다.");
else
System.out.println("p1과 p2는 다른 사람 입니다.");
if(p1.equals(p2))
System.out.println("p1과 p2는 같은 사람 입니다.");
else
System.out.println("p1과 p2는 다른 사람 입니다.");
}
}
오버라이딩을 한 것과 안한 것의 차이는 그냥 단순 변수로만 비교되었을 때는 서로의 주솟값을 비교한다.
하지만 equals 를 오버라이딩해서 확인 한 결과 equals의 메서드는 서로 그 주소값이 아닌 내부값을 직접 비교한다.
hashcode()다량의 데이터를 저장하고 검색하는 데 유용하다. 찾고자하는 값을 입력하면 그 데이터가 저장된 위치를 알려주는 해시코드를 반환한다.
hashcode를 오버라이딩 하지 않는다면 모든 객체가 서로다른 해시코드값을 가질 것이므로, 같은 객체라면 적절하게 오버라이딩해서 같은 객체가 서로 같은 값을 가질 수 있도록 오버라이딩한다.
public class HashCode1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));//print equals messages
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
//equals를 적절하게 오버라이딩해서 같은 객체의 문자열이 같을 경우 같은 해시값을 도출한다.
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
//반면 object class 에서 identityHashCode는 서로 다른 주솟값에 대해 해시코드를 도출한다.
}
}
equals를 적절하게 오버라이딩 한 equals , hashcode는 객체의 문자열이 같을 경우 같은 해시값을 도출하며
반면에 object class 에서 identityHashCode는 서로 다른 주솟값에 대해 해시코드를 생성한다.
tostring()
class Card{
int number;
String kind;
Card(){
this("SPADE",1);
}
Card(String kind, int number){
this.kind=kind;
this.number=number;
}
}
public class CardToString {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.toString());
System.out.println(c2.toString());
}
/*public string tostring(){
* return getclass().getname()+"@"+Integer.tohexstring(hashcode());
* {
* 이런 식으로 되어있어서 저 문자를 출력시 Card@hashcode 이런식으로 서로다른 값을 띈다.
* 클래스 네임은 같아도 다른 객체인 것을 확인하는 문제.
* 객체 자체의 string 문자열이 있어야 그것을 문자열로 반환한다.
*/
}
public string tostring(){
*return getclass().getname()+"@"+Integer.tohexstring(hashcode());
{
* 이런 식으로 되어있어서 저 문자를 출력시 Card@hashcode 이런식으로 서로다른 값을 띈다.
* 클래스 네임은 같아도 다른 객체인 것을 확인하는 문제.
* 객체 자체의 string 문자열이 있어야 그것을 문자열로 반환한다.
오버라이딩 후
class Card {
int number;
String kind;
Card(){
this("SPADE",1);
}
Card(String kind, int number){
this.kind=kind;
this.number=number;
}
public String toString() {
return "kind : "+kind+",number : "+number;
//card인스턴스 kind와 number를 문자열로 반환한다. 적절한 오버라이딩
}
}
public class CardToString2 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card("HEART",10);
System.out.println(c1.toString());
System.out.println(c2.toString());
}
/*
* 1번을 오버라이딩 한 코드.
*/
}