모든 클래스의 최고 조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용 가능
두 객체의 같고 다름을 참조변수의 값(주소)으로 판단한다.
그렇기 때문에 서로 다른 두 객체를 equals로 비교하면 항상 false를 반환한다.
주소값이 아니라 객체가 가지고 있는 값(value)을 비교하려면 equals메서드를 오버라이딩해야한다. String클래스는 같은 문자열을 가지면 true를 반환하도록 오버라이딩되어있다.
해싱(hashing)기법에 사용되는 해시함수를 구현한 것이다.
해싱은 데이터 관리기법 중의 하나인데 다량의 데이터를 저장하고 검색하는데 유용하다.
해시 함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드를 반환한다.
오버라이딩하지않으면 기본적으로 클래스이름@주소값을 반환한다.
String클래스는 오버라이딩되어 있기 때문에 담고있는 문자열 내용을 반환해준다.
변경불가능한 (immutable) 클래스이다.
한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수 없다.
String a = "a";
String b = "b";
a = a+b;
예를 들어 위와 같이 +연산자를 이용하여 a = "ab";를 만들어보자
이때, 인스턴스내의 문자열이 바뀌는 것이 아니라 새로운 문자열("ab")이 담긴 String 인스턴스가 생성된다.
그렇기 때문에 메모리 공간을 위해 결합 횟수는 줄이는 것이 좋다.
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
// == : 등가 연산자로 주소를 비교한다.
System.out.println(str1.equals(str2)); //true
System.out.println(str1==str2); //true
System.out.println(str3.equals(str4)); //true
System.out.println(str3==str4); //false
String클래스의 생성자를 이용한 경우에는 new연산자에 의해서 메모리 할당이 이루어지기 때문에 항상 새로운 인스턴스가 생성된다. 하지만 "abc"처럼 문자열 리터럴은 이미 존재하는 것을 재사용한다.
→ 즉, str1과 str2가 가리키는 주소값은 "abc"를 저장하고 있는 주소로 같은 값을 가진다.
하지만 str3과 str4는 각각 다른 주소값을 가르킨다.
문자열 리터럴은 한번만 저장된다. 문자열은 immutable하기 때문에 내용을 변경할 수 없으니 하나의 인스턴스를 공유해도 괜찮기 때문이다.
String s = ""; //빈 문자열로 초기화 (char[] chArr = new char[0];)
char ch = ' '; //공백으로 초기화
문자열은 길이가 0일 수 있지만 char는 불가능하다.
1. join
String animals = "dog,cat,rabbit";
String[] arr = animals.split(",");
String str = String.join("-",arr); //dog-cat-rabbit
2. StringJoiner
StringJoiner sj = new StringJoiner(",","[","]");
String[] arr = {"aaa","bbb","ccc"};
for (String s: arr)
sj.add(s.toUpperCase());
System.out.println(sj.toString()); // [AAA,BBB,CCC]
int i = 100;
String str1 = i+"";
String str2 = String.valueOf(i);
int i = Integer.parseInt("100");
int i2 = Integer.valueOf("100");
String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 버퍼를 가지고 있다.
버퍼의 크기는 인스턴스를 생성할 때 지정해줄 수 있는데 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다. 기본 크기는 16이다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123"); // abc123
StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 주소값으로 비교한다.
toString메서드는 오버라이딩되어 있기때문에 담고 있는 문자열의 내용을 반환한다.
그래서 두 문자열의 내용을 비교하고 싶다면 두 메서드를 조합해서 사용해야한다.
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
String s1 = sb1.toString();
String s2 = sb2.toString();
System.out.println(s1.equals(s2));
멀티 쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 성능을 떨어뜨린다.
그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다.
1. ceil() : 올림
2. floor() : 버림
3. round() : 반올림
4. abs() : 절댓값
5. max,min() : 두 수 중 최대, 최소
6. random() : 랜덤
기본형 변수를 객체로 다룰 때 사용하는 클래스이다.
래퍼 클래스들은 모두 equals()가 오버라이딩되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.
Integer i = new Integer(100);
//auto-boxing
Integer i = 10;
//unboxing
System.out.println(i.intValue());
//auto-unboxing
int b = i;