switch-case 문에서 String 을 비교하는 방법
public class SwitchStudy {
public static void main(String[] args) {
String value = "AAA";
switch (value) {
case "AAA":
System.out.println("A");
case "BBB":
System.out.println("B");
}
}
}
INVOKEVIRTUAL java/lang/String.hashCode ()I
LOOKUPSWITCH
64545: L2
65538: L3
default: L4
String hashCode 를 생성해 int 를 비교한다.
for 문 내부에서 주의할 점
불필요한 size() 메서드를 반복해서 호출하지 않는다.
ArrayList<Object> list = new ArrayList<>();
// list.size();
for (int i = 0; i < list.size(); i++) {
System.out.println("do something");
}
반복 구문에서 필요 없는 반복 피한다.
reflection 관련 클래스를 사용해 클래스 정보를 얻는 것은 유용하나 Class 인스턴스화를 해가며 반드시 필요한 작업인가? 고민을 해봐라
예시
this.getClass().getName()
getClass()
메서드를 호출하면 Class 객체를 만들고, 그 개체의 이름을 가져오는 메서드를 수행하는 시간과 메모리를 사용할 뿐이다.interrupt()
이 메서드는 해당 스레드가 block
되거나 특정 상태에서만 작동한다.synchronized
는 각각의 객체에 대한 동기화를 하는 것이다. 아래 코드는 amount
클래스 변수에 대한 동기화가 되지 않는다. public class Contribution{
private static int amount = 0;
public synchronized void denote(){
amount++;
}
public int getTotal(){
return amount;
}
}
아래처럼 denote()
메서드도 static
을 선언해야 amount
클래스 변수 동기화가 된다. public class Contribution{
private static int amount = 0;
public static synchronized void denote(){
amount++;
}
public int getTotal(){
return amount;
}
}
allocateDirect()
를 호출하면 DirectByteBuffer
를 생성한다.
이 메서드는 데이터를 JVM 에 올려서 사용하는 것이 아니라, OS 메모리에 할당된 메모리를 Native로 한 JNI로 처리하는 DirectByteBuffer
객체를 생성한다.
필요할 때마다 매번 생성해서는 안된다.
reserveMemory()
메서드에서는 JVM 에 할당된 메모리보다 더 많은 메모리를 요구할 경우 System.gc()
를 호출하도록 되어 있다.
서블릿은 요청당 새로 생성되는게 아니라 생성해둔 서블릭 객체를 사용하니
static 변수나 멤버 변수를 선언하여 지속적으로 변경하는 작업은 피하자.