String literal 과 new String() 의 차이
String s1 = new String("java");
String s2 = new String("java");
String s3 = "java";
String s4 = "java";
s3과 s4 (String literal)은 같은 곳을 가리키고 있다. String literal은 같은 문자열인 경우에는 메모리 전체에서 하나만 존재한다. 반면에 s1과 s2는 같은 문자열이지만 서로 다른곳을 가리키고 있다. new 연산자를 통해서 String 객체를 만들면 문자열이 같아도 매번 다른 공간에 문자열이 생긴다.
동일과 동등 둘 다 "같다"라고 표현하지만 뜻은 다르다. 동일성에서의 같음은 두 참조변수가 가리키는 곳이 메모리의 같은 부분임을 뜻한다. 동등성에서의 같음은 두 참조변수가 메모리상에서 어디를 가리키느냐는 상관 없고 특정 기준에 따라 같은 것으로 볼 수 있는지에 달려있다.
s3과 s4는 동일하고 s1과 s2는 동일하지 않다. s1과 s2 그리고 s3과 s4는 동등하다. 동등하지 않으면 동일할 수 없지만 동일하지 않아도 동등 할 수는 있다.
동일한지를(메모리주소 비교) 따질때는 == 연산자를 사용하고 동등한지를 따질때는 s1.equals(s2) 를 사용한다.
String str = "abcde";
str.length() // str 길이 반환
str.isEmpty() // str 길이 0 이면 true , 아니면 false
str.charAt(0) // str 인덱스로 문자 찾기 0번째 문자 반환
str.indexOf("a") // 문자로 첫번째 인덱스 찾기 , 0 반환
str.lastIndexOf("d") // 해당 문자를 뒤에서 부터 찾는다
str.substring(1) // 1부터 끝까지의 문자열 "bcde" 반환
str.substring(1,3) // 1~2 위치의 문자열 "bc" 반환
str.replace('c','r') // c를 r로 변경
str.equals("abcde") // str과 abcde 비교해서 같으면 true 아니면 false
str.contains("bc") // str에 bc가 포함되어 있으면 true 아니면 false
str.split(" ") // 띄어쓰기로 구분된 문자열 str을 분리해서 String[] 배열 반환
str.split() // 띄어쓰기 없는 문자열 str을 한 문자씩 분리해서 String[] 배열 반환
str.trim() // str의 앞뒤 공백 제거, 문자열 사이 공백은 제거 x
str.toLowerCase() // 대문자를 모두 소문자로 변경
str.toUpperCase() // 소문자를 모두 대문자로 변경
str.compareTo("abcdd")
/*
str과 abcdd가 같으면 0
str이 abcdd보다 사전순으로 앞이면 -1
str이 abcdd보다 사전순으로 뒤면 1
여기선 결과 -> 1
*/
Integer.parseInt("1") // 문자열을 숫자로 변환
Integer.toString(1) // 숫자를 문자열로 변환
string은 불변 객체 즉 한 번 생성되면 변경이 불가능하다
str1 += str2; 는 새로운 string 객체 생성하는 것이다. 즉, 새로운 문자열 객체가 생성되며 str끼리 더하는 행위는 메모리 할당과 해제를 발생시키며 더하는 연산이 많아지면 성능 저하된다.
위 방식처럼 +를 사용하면 이전 문자열은 쓰레기 값이 된다. (GC가 이후 처리)
StringBuilder는 String과 달리 변경 가능하고 글자를 붙일 때 새로운 객체를 생성하지 않고 기존의 데이터에 더하는 것이어서 메모리 관리에 더 효율적이다.
StringBuilder sb = new StringBuilder();
sb.append("abc") // 문자열 추가
sb.insert(2,"aa") // 인덱스 2에 aa 삽입
sb.delete(0,2) // 0~1 위치의 문자열 삭제 -> c
sb.deleteCharAt(2) // 2위치의 문자 삭제 -> ab
sb.setCharAt(0,'h') // 0위치의 문자를 h로 변경 -> hbc
sb.setLength(2) // 문자열 길이를 2로 줄임
sb.setLength(4) // 문자열 길이를 4로 늘림 -> 뒤가 공백으로 채워짐
List<String> list = new ArrayList<>();
list.add("서울") // list의 가장 뒤에 서울 삽입
list.add(1, "대구") // 1위치에 대구 삽입
list.addAll(list2) // list의 뒤에 list2의 모든 값 삽입
list.get(0) // 0위치의 값 반환
list.set(0, "대전") // 0 위치의 값을 대전으로 변경
list.indexOf("대구") // 대구의 첫번째 인덱스 반환
list.lastIndexOf("대구") // 대구의 마지막 인덱스 반환
list.remove(0) // 0 위치의 값 삭제
list.remove("대구") // 첫번째 대구 삭제
list.removeAll(list2) // list에서 list2에 들어있는 모든 값을 삭제
list.retainAll(list2) // list에서 list2에 들어있는 값을 제외한 모든 값을 삭제
list.clear() // 전체 값 삭제
list.isEmpty() // 길이가 0이면 true 아니면 false
list.size() // 길이
list.contains("서울") // 서울이 list에 있으면 true , 없으면 false
list.containsAll(list2) // list에 list2의 모든 값이 포함되어 있으면 true 아니면 false
list.removeIf(k -> k % 2 != 0 ) // 람다식으로 홀수를 list에서 모두 제거
//배열을 문자열로
String[] temp = {"a", "b", "c", "d", "e"};
String str = Arrays.toString(temp);
// 문자열 배열을 List로 변환
String temp = "abcde";
String[] tempArray = temp.split("");
List<String> list = new ArrayList<>(Arrays.asList(tempArray));
//정수 배열을 List로 변환
int[] temp = { 1,2,3,4,5];
List<Integer> list = new ArrayList<>(Arrays.asList(temp));
//List를 정수 배열로 변환
List<Integer> list = new ArrayList<>();
int[] temp = list.stream().mapToInt(i->i).toArray();
mapToInt 는 스트림을 IntStream으로 변환 해준다.
int[] a = {1,2,3,4,5}; // 초기화 및 한번에 생성
int[] s = new int[5]; //크기 5인 int형 배열 생성
s[0] = 1; // 값 저장
s.length // 배열 s의 길이 즉 값은 5
//출력
System.out.println(Arrays.toString(s));
/*복사 ( 배열은 한번 선언되고 나면 공간 자체를 직접 늘릴수는 없다
그래서 간접적으로 늘려야 한다) */
int[] arr1 = {1,2,3,4,5};
int[] arr2 = new int[arr1.length * 2];
arr2 = Arrays.copyOf(arr1,arr1.length); // arr1 배열을 해당 길이만큼 복사
//정렬
Arrays.sort(arr1); // 오름차순 정렬( 배열 반환 x)
Arrays.sort(arr1, Collections.reverseOrder());
//비교
Arrays.equals(arr1,arr2);