71. Enum에 대한 toString() 메서드를 재정의하지 않으면 어떻게 됩니까?
다음 열거형이 있다고 가정해 보겠습니다 .public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
학생 에 대해 toString()을 호출하여 콘솔에 학생을 표시해 보겠습니다 .
System.out.println(Role.STUDENT.toString());
콘솔 결과:
72. Enum 내부에 생성자를 지정할 수 있나요?
물론이지. 내부 열거형 변수의 값은 생성자를 통해 설정됩니다. 예를 들어, 각 역할의 연령 범위를 나타내기 위해 이전 열거형 ( ageFrom 및 ageTo )에 두 개의 필드를 추가해 보겠습니다 .public enum Role {
STUDENT(5,18),
TEACHER(20,60),
DIRECTOR(40,70),
SECURITY_GUARD(18,50);
int ageFrom;
int ageTo;
Role(int ageFrom, int ageTo) {
this.ageFrom = ageFrom;
this.ageTo = ageTo;
}
}
73. ==와 같음()의 차이점은 무엇입니까?
이것은 가장 일반적인 Java 개발자 인터뷰 질문 중 하나입니다. 간단한 값( int , char , double ...) 을 비교할 때 변수에 특정 값이 포함되어 있고 비교할 수 있으므로 == 를 사용하여 비교한다는 사실부터 시작하겠습니다 . 그리고 기본 변수는 완전한 개체가 아닙니다. Object 에서 상속되지 않으며 equals() 메서드가 없습니다 . 객체를 참조하는 변수를 비교하는 경우 ==는 동일한 객체를 참조하는지 여부에 관계없이 참조 값만 비교합니다. 그리고 한 객체가 다른 객체와 동일하더라도 ==를 통한 비교는 다른 객체이기 때문에 부정적인 결과( false )를 제공합니다. 아시다시피, equals() 메소드는 참조 변수를 비교하는 데 사용됩니다 . 이는 객체를 완전히 비교하는 데 필요한 Object 클래스 의 표준 메서드 중 하나입니다 . 그러나 즉시 명확히 할 가치가 있습니다. 이 메서드가 올바르게 작동하려면 이 클래스의 개체를 비교하는 방법을 정확하게 작성하여 재정의해야 합니다. 메서드를 재정의하지 않는 한 기본적으로 == 로 개체를 비교합니다 . IntelliJ IDEA 에서는 IDEA 도구를 사용하여 자동으로 재정의할 수 있습니다. -> alt + insert , 나타나는 창에서 equals() 및 hashCode() 선택 -> 참여할 클래스 필드 선택 -> 짜잔, 자동 구현 방법이 완료되었습니다. 다음은 int age 및 String name 이라는 두 개의 필드가 있는 간단한 Cat 클래스에 대해 자동으로 생성된 equals 메소드 가 어떻게 보이는지에 대한 예입니다 .@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
final Cat cat = (Cat) o;
return this.age == cat.age &&
Objects.equals(this.name, cat.name);
}
enums 에 대한 == 와 같음의 차이점에 대해 이야기하면 그다지 많지 않습니다. 결국 enum은 상수를 저장하고 ==를 사용하여 유사한 값을 비교할 때에도 참조는 항상 동일한 객체에 대한 것이기 때문에 true를 받게 됩니다 . 글쎄요, equals를 사용할 때 기능도 올바르게 작동할 것입니다. 특히 enum 에 대한 equals 메소드 의 본문으로 들어가면 Enum 클래스에서 메소드 구현이 다음과 같은 것을 볼 수 있습니다 . 내부 - 참조로 좋은 오래된 비교! 요약하자면, enum 의 경우 == 및 같음을 통한 비교가 정확합니다.
74. Enum에서 ordinal() 메소드는 무엇을 합니까?
열거 형 요소 에 대해 int ordinal() 메서드를 호출할 때 일반적인 열거형 시리즈에서 이 값의 0부터 서수를 가져옵니다. 앞서 설명한 열거형 의 한 요소 인 Role에 대해 이 메서드를 사용해 보겠습니다 .System.out.println(Role.DIRECTOR.ordinal());
따라서 콘솔에 다음이 표시됩니다.
75. Java에서 TreeSet 또는 TreeMap과 함께 Enum을 사용할 수 있습니까?
TreeSet 및 TreeMap 에서 열거형 유형을 사용할 수 있습니다. 그리고 우리는 다음과 같이 쓸 수 있습니다:TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
콘솔에는 다음이 표시됩니다.
76. Enum에서 ordinal()과 CompareTo() 메소드는 어떤 관련이 있나요?
앞에서 설명한 것처럼 ordinal()은 일반 열거 목록에 있는 값의 서수를 반환합니다. 또한 이전 질문을 분석하면서 예를 들어 TreeSet (정렬된 집합)에 있는 열거형 요소가 enum 에서 선언된 순서를 따른다는 것을 확인했습니다 . 우리가 알고 있듯이 TreeSet 과 TreeMap은 Comparable 인터페이스 의 CompareTo() 메서드 를 호출하여 요소를 정렬합니다 . 이것으로부터 우리는 Enum 클래스가 Comparable 인터페이스를 구현하고 , 이를 CompareTo() 메소드에서 구현하고 , ordinal()이 정렬 순서를 설정하는 데 사용된다고 가정할 수 있습니다. Enum 클래스 에 들어가면 다음 사항이 확인됩니다. 그리고 메서드 자체의 본문은 다음과 같습니다. 여기서 ordinal() 메서드는 호출되지 않습니다. 대신, 열거 형 요소의 서수인 서수 변수가 사용됩니다. ordinal() 메서드 자체는 ordinal 변수 에 대한 getter에 지나지 않습니다 .77. EnumM 예제 작성
위에서 논의한 질문에서 나는 이미 열거형의 예를 제시했지만 코드를 복제하는 것이 의미가 없다고 생각합니다(예: 열거형의 생성자에 대한 질문 번호 72).78. 스위치 케이스에 Enum을 사용할 수 있나요?
가능하고 필요합니다! 내 실습을 되돌아보면 enum을 사용하는 가장 일반적인 장소 중 하나가 switch 와 같은 논리적 구성이라는 것을 알게 되었습니다 . 이 경우 가능한 모든 케이스 변형을 제공할 수 있으며 모든 열거형 값 에 대한 논리를 작성한 후 기본 연산자를 사용할 필요조차 없습니다! 결국, 문자열 이나 숫자 값(예: int 유형)을 사용하는 경우 예상치 못한 값을 받을 수 있으며, 이는 enum을 사용하여 불가능합니다 . 앞서 설명한 예에서 스위치는 어떤 모습일까요 ?public void doSomething(Role role) {
switch (role) {
case STUDENT:
// некая логика для STUDENT
break;
case TEACHER:
// некая логика для TEACHER
break;
case DIRECTOR:
// некая логика для DIRECTOR
break;
case SECURITY_GUARD:
// некая логика для SECURITY_GUARD
break;
}
}
79. Enum 인스턴스에서 사용 가능한 모든 값을 얻는 방법은 무엇입니까?
열거형의 모든 인스턴스를 가져와야 하는 경우 특정 열거형 의 사용 가능한 모든 값의 배열을 자연 순서( enum 에 지정된 순서대로 )로 반환하는 value() 메서드가 있습니다 . 예:Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
콘솔에 다음 출력이 표시됩니다.
스트림 API
80.Java에서 Stream이란 무엇인가요?
Java Stream은 데이터 스트림과 상호 작용하는 비교적 새로운 방법으로, 이를 통해 대용량 데이터를 보다 편리하고 컴팩트하게 처리할 수 있을 뿐만 아니라 특정 개수의 스레드 간에 데이터 처리를 병렬화하여 사용 성능을 향상시킬 수 있습니다. 기능. 이 주제는 간단히 말해서 더 깊이 논의할 수 없으므로 여기 에 이 주제를 자세히 알아보는 데 도움이 될 수 있는 기사 링크를 남겨 두겠습니다 .81. 거래의 주요 속성은 무엇입니까?
주제는 Stream API라고 하는데 문제는 트랜잭션에 관한 것입니다. 흠... 먼저 트랜잭션이 무엇인지 알아보겠습니다. 트랜잭션은 데이터 작업의 논리적 단위를 나타내는 순차적 데이터베이스 작업 그룹입니다. 트랜잭션은 병렬로 실행되는 다른 트랜잭션과 독립적으로 데이터 무결성을 유지하면서 완전히 성공적으로 완료될 수도 있고, 전혀 완료되지 않을 수도 있습니다. 이 경우 아무런 효과가 없습니다. 따라서 트랜잭션에는 줄여서 ACID 라고 하는 네 가지 주요 속성이 있습니다 . 이 약어의 각 문자가 어떻게 나타나는지 살펴보겠습니다. A - 원자성 - 원자성 - 이 속성은 트랜잭션이 시스템에 부분적으로 기록되지 않음을 보장합니다. 모든 하위 작업이 수행되거나 아무 것도 수행되지 않습니다( 모두 또는 전혀 수행되지 않음 ). C - 일관성(Consistency) - 일관성은 성공적인 각 트랜잭션이 유효한 결과만 기록하도록 보장하는 속성입니다. 즉, 이는 성공적인 거래의 경우 시스템이 특정 데이터에 부과하는 모든 규칙과 제한 사항이 충족된다는 보장입니다. 그렇지 않으면 거래가 완료되지 않고 시스템의 데이터가 이전 상태로 돌아갑니다. 상태. I - 격리 - 격리는 트랜잭션 실행 중에 병렬 트랜잭션이 결과에 영향을 주어서는 안 된다는 속성입니다. 이 속성은 자원 집약적이므로 일반적으로 특정 단열 문제를 해결하는 특정 수준의 단열을 허용하여 부분적으로 구현됩니다. 이에 대해서는 다음 질문에서 더 자세히 논의하겠습니다. D - 내구성 - 이 속성은 사용자가 시스템으로부터 트랜잭션이 완료되었다는 확인을 받은 경우 자신이 수행한 변경 사항이 일부 오류로 인해 취소되지 않을 것임을 확신할 수 있도록 보장합니다. 즉, 귀하가 거래가 성공적으로 완료되었다는 확인을 이미 받은 경우 일종의 운영 체제 오류가 귀하의 데이터에 아무런 영향을 미치지 않는다는 것을 확신할 수 있습니다.82. 트랜잭션 격리 수준은 무엇입니까?
앞서 말했듯이 ACID 격리를 제공하는 것은 리소스 집약적인 프로세스입니다. 따라서 이 속성은 부분적으로 만족됩니다. 격리 수준은 다양하며, 수준이 높을수록 생산성에 미치는 영향은 더 커집니다. 트랜잭션 격리 수준으로 이동하기 전에 트랜잭션 격리 부족으로 인한 다양한 문제를 살펴봐야 합니다 .-
팬텀 리딩(phantom reading) - 동일한 트랜잭션 내에서 동일한 샘플(동일한 쿼리)이 반복적으로 호출되는 경우, 수신된 데이터가 달라지는 현상은 다른 트랜잭션에 의한 데이터 삽입으로 인해 발생합니다.
-
비반복 읽기 - 동일한 트랜잭션 내에서 동일한 샘플(동일한 쿼리)이 반복적으로 호출되는 경우 수신된 데이터가 다릅니다. 이는 다른 트랜잭션에 의한 데이터 변경(업데이트) 및 삭제로 인해 발생합니다.
-
더티 읽기 - 나중에 확인되지 않은(롤백) 트랜잭션에 의해 추가되거나 변경된 데이터를 읽는 프로세스입니다. 잘못된 데이터를 읽는 중입니다.
-
업데이트 손실 - 서로 다른 트랜잭션이 동일한 데이터를 동시에 변경하면 마지막 변경 사항을 제외한 모든 변경 사항이 손실됩니다(멀티 스레드 환경의 "경합 조건" 문제를 연상시킵니다).
격리 수준 | 환상의 독서 | 비반복 읽기 | 더러운 독서 | 업데이트 손실 |
---|---|---|---|---|
직렬화 가능 | + | + | + | + |
반복 읽기 | - | + | + | + |
커밋된 내용을 읽었습니다. | - | - | + | + |
커밋되지 않은 읽기 | - | - | - | + |
없음 | - | - | - | - |
83. Statement와 ReadyStatement의 차이점은 무엇입니까?
그리고 여기서 JDBC 기술 의 기능으로의 전환은 그다지 원활하지 않습니다 . 그럼 먼저, 실제로 State가 무엇인지 알아봅시다 . SQL 쿼리를 생성하는 데 사용되는 개체입니다. JDBC는 세 가지 유형 ( Statement , preparedStatement 및 CallableStatement) 을 사용합니다 . 오늘은 CallableStatement를 보지 않을 것입니다 . Statement 와 ReadyStatement 의 차이점에 대해 이야기해 보겠습니다 .-
명령문은 동적으로 삽입된 매개변수 없이 간단한 SQL 쿼리를 실행하는 데 사용됩니다. prepareStatement는 입력 매개변수를 동적으로 삽입하는 기능과 함께 사용됩니다.
-
preparedstatement 에서 매개변수를 설정하기 위해 요청의 입력 매개변수는 물음표로 작성된 다음 setDouble() , setFloat() , setInt() , setTime() .. 과 같은 다양한 설정자를 사용하여 값 대신 일부 값을 삽입합니다 . .. 결과적으로 잘못된 유형의 데이터를 쿼리에 삽입하지 않게 됩니다.
-
PreparedStatement 는 "사전 컴파일"되어 캐싱을 사용하므로 해당 실행은 명령문 개체 에서 쿼리하는 것보다 약간 더 빠를 수 있습니다 . 결과적으로 자주 실행되는 SQL 쿼리는 성능 향상을 위해 preparedStatement 객체로 작성됩니다 .
-
명령문은 SQL 주입에 취약한 반면, ReadyStatement는 SQL 주입을 방지합니다. 이 기사 에서 SQL 주입 제거 및 Java 보안의 기타 모범 사례에 대해 자세히 알아보세요 .
GO TO FULL VERSION