[java] 자바의 숨겨진 기능

C #의 숨겨진 기능을 읽은 후 Java의 숨겨진 기능은 무엇입니까?



답변

Double Brace Initialization 은 몇 달 전에 처음 발견했을 때 놀랐습니다.

ThreadLocals 는 일반적으로 스레드 별 상태를 저장하는 방법으로 널리 알려져 있지 않습니다.

JDK 1.5 Java는 잠금을 뛰어 넘어 매우 잘 구현되고 강력한 동시성 도구를 가지고 있기 때문에 java.util.concurrent에 있으며 특히 흥미로운 예는 비교 를 구현하는 스레드 안전 기본 요소를 포함 하는 java.util.concurrent.atomic 서브 패키지입니다. 스왑 작업을 수행하고 이러한 작업의 실제 기본 하드웨어 지원 버전에 매핑 할 수 있습니다.


답변

유형 모수 분산의 합집합 :

public class Baz<T extends Foo & Bar> {}

예를 들어 Comparable과 Collection 모두의 매개 변수를 사용하려는 경우 :

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

이 고려 된 메소드는 주어진 두 컬렉션이 같거나 그 중 하나에 주어진 요소가 포함되어 있으면 true를, 그렇지 않으면 false를 반환합니다. 주목할 점은 인수 b1 및 b2에 대해 Comparable 및 Collection의 메소드를 호출 할 수 있다는 것입니다.


답변

다른 날 인스턴스 초기화 프로그램에 놀랐습니다. 코드 접힌 메소드를 삭제하고 여러 인스턴스 이니셜 라이저를 만들었습니다.

public class App {
    public App(String name) { System.out.println(name + "'s constructor called"); }

    static { System.out.println("static initializer called"); }

    { System.out.println("instance initializer called"); }

    static { System.out.println("static initializer2 called"); }

    { System.out.println("instance initializer2 called"); }

    public static void main( String[] args ) {
        new App("one");
        new App("two");
  }
}

main메소드를 실행하면 다음 이 표시됩니다.

static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called

여러 생성자가 있고 공통 코드가 필요한 경우 유용 할 것입니다.

또한 수업 초기화를 위해 구문 설탕을 제공합니다.

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

Map<String,String> codes = new HashMap<String,String>(){{
  put("1","one");
  put("2","two");
}};


답변

JDK 1.6_07 +에는 VisualVM (bin / jvisualvm.exe)이라는 앱이 포함되어 있습니다.이 도구는 많은 도구 위에있는 멋진 GUI입니다. JConsole보다 포괄적 인 것 같습니다.


답변

Java 6 이후의 클래스 경로 와일드 카드

java -classpath ./lib/* so.Main

대신에

java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main

http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html을 참조하십시오.


답변

대부분의 사람들에게 Java 개발자 입장에서 인터뷰 한 블록은 매우 놀랍습니다. 예를 들면 다음과 같습니다.

// code goes here

getmeout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                //do something here
                break getmeout;
            }
        }
    }
}

goto자바에서 누가 키워드라고 했습니까? 🙂


답변

방법에 대한 공변 반환 형식 JDK 1.5부터 장소에왔다? 그것은 섹시하지 않은 추가이기 때문에 꽤 잘 알려지지 않았지만, 이해하기 때문에 제네릭이 작동하려면 절대적으로 필요합니다.

본질적으로, 컴파일러는 이제 서브 클래스가 재정의 된 메소드의 리턴 유형을 원래 메소드의 리턴 유형의 서브 클래스로 좁힐 수있게합니다. 따라서 이것은 허용됩니다.

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

당신은 서브 클래스의 호출 할 수있는 values방법 및 정렬 된 스레드 안전 확보 SetString의를 다운 캐스트하지 않고도 받는 사람 ConcurrentSkipListSet.