String 객체 타입은 Java 언어에서 특혜를 심하게 받고 있는 객체이다.
그만큼 사용 빈도가 많다는 말씀..
■ Java 문서에서의 정의
The String class represents character strings. All string literals in Java programs,
such as "abc", are implemented as instances of this class.
Strings are constant; their values cannot be changed after they are created.
String buffers support mutable strings. Because String objects are immutable they can be shared. For example:
String str = "abc";
is equivalent to:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
■ String 리터럴 사용 ( new 객체 생성 없이 )
-> string constant pool 영역을 공용으로 사용
* hashcode : Returns a hash code value for the object.
This method is supported for the benefit of hash tables such as those provided by HashMap.
해시코드는 어떤 객체를 구분/정의 할 수 있는 정수값이다.
이 정수값으로 해당 객체가 동일한지의 여부를 파악할 수 있다.
알쓸신자 : String 의 hashcode 는 Object 의 hashcode 를 @override 하여 재정의하였다.
-> 이런 이유로 String 의 hashcode 는 String 객체주소가 아닌, String 객체의 값을 hashcode 로 return 한다.
String 객체의 원 hashcode 값을 구할때는 identityHashCode 를 사용해야 한다.
* identityHashCode : Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
hashcode vs identityHashCode
-> hashcode 는 @override가 가능하며, 실제 객체의 주소를 리턴 시 객체의 값을 리턴하는 경우가 있다. (String 경우)
-> identityHashCode 는 @override 가 불가하여, 실제 해당 객체의 주소를 리턴해준다.
따라서, 위와 같이 메모리의 주소만을 가져올경우 identityHashCode 를 사용하는것이 정확성이 높다.
■ String new 객체 사용
-> Heap 메모리의 공간을 할당하여 사용
String - immutable (불변객체)
String buffer - mutable (변하는객체)
* String 객체는 불변객체로 그 값의 변경이 빈번할 경우 메모리를 새로 할당받게 되며
기존 할당받은 메모리는 gc(garbage collection) 의 처리시까지 메모리에 남겨지게 된다.
이런 이유로 예전에는 메모리를 귀하게 생각해서 String buffer 를 사용했었다.
지금은 메모리가 모자라지 않아서...
String vs StringBuffer
-> 예전에는 메모리가 귀해서, String 의 사용이 엄격한 편이었음
-> 지금은 메모리 걱정이 없어서, 굳이 StringBuffer 를 사용할 이유가 있을까 싶음.
마무리...
String 은 자바가 숨겨논 자식인것 같음...
소스코드
public class _String {
public static void main(String[] args) {
/* 리터럴 표현 , Heap 메모리 - string constant pool 를 이용한다. */
String str1 = "홍길";
System.out.printf("str1.hashcode %s \n", System.identityHashCode(str1));
String str2 = "홍길";
System.out.printf("str2.hashcode %s \n", System.identityHashCode(str2));
String str3 = "홍길동";
System.out.printf("str3.hashcode %s \n", System.identityHashCode(str3));
str2 = "홍길동";
System.out.printf("str2.hashcode %s \n", System.identityHashCode(str2));
System.out.println("---------------------------------------------------");
/* new 객체 생성 , Heap 메모리 - 공간 할당 . */
String nstr1 = new String("홍길");
System.out.printf("nstr1.hashcode %s \n", System.identityHashCode(nstr1));
String nstr2 = new String("홍길");
System.out.printf("nstr2.hashcode %s \n", System.identityHashCode(nstr2));
String nstr3 = new String("홍길동");
System.out.printf("nstr3.hashcode %s \n", System.identityHashCode(nstr3));
nstr2 = "홍길동";
System.out.printf("nstr2.hashcode %s \n", System.identityHashCode(nstr2));
System.out.println("---------------------------------------------------");
/* new 객체 생성 , Heap 메모리 - 공간 할당 . */
StringBuffer sb1 = new StringBuffer("홍길");
System.out.printf("sb1.hashcode %s \n", System.identityHashCode(sb1));
StringBuffer sb2 = new StringBuffer("홍길");
System.out.printf("sb2.hashcode %s \n", System.identityHashCode(sb2));
sb2.append("홍길동");
System.out.printf("sb2.hashcode %s \n", System.identityHashCode(sb2));
}
}
'Java > java.lang.Object' 카테고리의 다른 글
== equals 무엇이 다른 것인가 ?? (0) | 2021.06.24 |
---|---|
java.lang.Object 의 위치(Position) (0) | 2021.06.24 |
Object class , 숨겨진 최상위 객체 (0) | 2021.06.20 |