Siner's Blog

about me


JAVA 자료구조 정리

java data structure cheat sheet

2021/12/29


String

String은 리터럴로 표기가 가능하지만 primitive 자료형은 아니다. String은 리터럴 표현식을 사용할 수 있도록 자바에서 특별 대우 해 주는 자료형이다.

String a = "happy java"String a = new String("happy java") 는 같은 값을 갖게 되지만 완전히 동일하지는 않다. 첫번째 방식을 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 위 예에서 리터럴 표기법은 "happy java" 라는 문자열을 intern pool 이라는 곳에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 두번째 방식은 항상 새로운 String 객체를 만든다.

문자열의 값을 비교할때는 반드시 equals 를 사용해야 한다. == 연산자를 사용할 경우 다음과 같은 경우가 발생할 수 있다.

String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b));  // true
System.out.println(a==b);  // false

StringBuffer

insert 메소드는 특정 위치에 원하는 문자열을 삽입할 수 있다.

StringBuffer sb = new StringBuffer();
sb.append("jump to java");
sb.insert(0, "hello ");
System.out.println(sb.toString());

StringBuffer.append vs String + String

아래의 두 예시 모두 hello jump to java를 출력하지만 내부적으로 객체가 생성되고 메모리가 사용되는 과정은 다르다.

첫번 째 예제의 경우 StringBuffer 객체는 한번만 생성된다. 두번 째 예제는 String 자료형에 + 연산이 있을 때마다 새로운 String 객체가 생성된다(문자열 간 + 연산이 있는 경우 자바는 자동으로 새로운 String 객체를 만들어 낸다). 두번 째 예제에서는 총 4개의 String 자료형 객체가 만들어지게 된다.

StringBuffer sb = new StringBuffer();  // StringBuffer 객체 sb 생성
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result);
String result = "";
result += "hello";
result += " ";
result += "jump to java";
System.out.println(result);

Array

사실 python과 js와 같은 언어에서는 동적으로 길이가 변하는 List를 배열이라고 부르고 있었다. java에서는 Array와 List가 모두 자료형으로 존재한다. 고정된 길이의 배열을 사용해야 할 때에는 Array를(아래의 예시) 사용하자.

String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";

ArrayList

ArrayList를 사용하기 위해서는 아래와 같이 import를 해줘야한다.

import java.util.ArrayList;

method

arr.get(2); // 두번째 요소에 접근
arr.size(); // ArrList의 갯수
arr.contains("123"); // 포함여부. return boolean
arr.remove("123"); // 값들 중 "123"인 항목을 삭제하고 결과를 true,false로 리턴
arr.remove(0); // 0번 인덱스를 삭제하고 삭제된 항목 리턴

join

import java.util.ArrayList;
import java.util.Arrays;

ArrayList<String> arr1 = new ArrayList<>(Arrays.asList("1", "2", "3"));
String joined1 = String.join(",", arr1);

String[] arr2 = new String[]{ "1", "2", "3" };
String joined2 = String.join(",", arr2);

order

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

ArrayList<String> arr = new ArrayList<>(Arrays.asList("1", "2", "3"));
arr.sort((Comparator.naturalOrder()); // Comparator.reverseOrder()

생성

import java.util.ArrayList;
import java.util.Arrays;

// way 1
ArrayList<String> arr1 = new ArrayList<>();
arr1.add("1");
arr1.add("2");

// way2
String[] data = { "1", "2" };
ArrayList<String> arr2 = new ArrayList<>(Arrays.asList(data));

HashMap

// put, get, size, containsKey, remove
import java.util.HashMap;
HashMap<String, String> map = new HashMap<>();
map.put("key", "value");
map.get("key"); // value
map.size(); // 1
map.containsKey("key"); // true
map.remove("key"); // "value"
// keySet
import java.util.HashMap;
HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.keySet(); // [key1, key2]
  • LinkedHashMap: 입력된 순서대로 데이터를 저장한다
  • TreeMap: key의 오름차순 순서로 데이터를 저장한다

HashSet

import java.util.HashSet;

HashSet<String> set = new HashSet<>(Arrays.asList("h", "e", "l", "l", "o")); // [e, h, l ,o]
// retainAll, addAll, removeAll
import java.util.HashSet;
import java.util.Arrays;

HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(2,3,4));

new HashSet<>(s1).retainAll(s2); // [2, 3] 교집합
new HashSet<>(s1).addAll(s2); // [1, 2, 3, 4] 합집합
new HashSet<>(s1).removeAll(s2); // [1] 차집합
// add, addAll
import java.util.HashSet;
import java.util.Arrays;

HashSet<String> set = new HashSet<>();
set.add("1");
set.addAll(Arrays.asList("2", "3");

enum

enum Language {
  ENGLISH,
  KOREAN,
  JAVA
};
for (Language language: Language.values()) {
  // ...
}