Java 클래식 사용법 요약
이루다
1. 현재 equals()
class Person {
String name;
int birthYear;
byte[] raw;
public boolean equals(Object obj) {
if (!obj instanceof Person)
return false;
Person other = (Person)obj;
return name.equals(other.name)
&& birthYear == other.birthYear
&& Arrays.equals(raw, other.raw);
}
public int hashCode() { ... }
}
class Person {
String a;
Object b;
byte c;
int[] d;
public int hashCode() {
return a.hashCode() + b.hashCode() + c + Arrays.hashCode(d);
}
public boolean equals(Object o) { ... }
}
class Person implements Comparable<Person> {
String firstName;
String lastName;
int birthdate;
// Compare by firstName, break ties by lastName, finally break ties by birthdate
public int compareTo(Person other) {
if (firstName.compareTo(other.firstName) != 0)
return firstName.compareTo(other.firstName);
else if (lastName.compareTo(other.lastName) != 0)
return lastName.compareTo(other.lastName);
else if (birthdate < other.birthdate)
return -1;
else if (birthdate > other.birthdate)
return 1;
else
return 0;
}
}
원래 유형의 Comparable가 아닌 범용 버전의 Comparable를 항상 구현합니다.이렇게 하면 코드의 양을 절약하고 불필요한 번거로움을 줄일 수 있기 때문이다.결과를 되돌려 주는 마이너스 번호 (마이너스/0/정) 에만 관심을 가지며, 그것들의 크기는 중요하지 않다.
Comparator.compare () 의 실현은 이것과 유사합니다.
4. clone 구현()
class Values implements Cloneable {
String abc;
double foo;
int[] bars;
Date hired;
public Values clone() {
try {
Values result = (Values)super.clone();
result.bars = result.bars.clone();
result.hired = result.hired.clone();
return result;
} catch (CloneNotSupportedException e) { // Impossible
throw new AssertionError(e);
}
}
}
1. 예방 검사(Defensive checking) 수치
int factorial(int n) {
if (n < 0)
throw new IllegalArgumentException("Undefined");
else if (n >= 13)
throw new ArithmeticException("Result overflow");
else if (n == 0)
return 1;
else
return n * factorial(n - 1);
}
int findIndex(List<String> list, String target) {
if (list == null || target == null)
throw new NullPointerException();
...
}
void frob(byte[] b, int index) {
if (b == null)
throw new NullPointerException();
if (index < 0 || index >= b.length)
throw new IndexOutOfBoundsException();
...
}
그래서 주어진 그룹 인덱스가 경계를 넘지 않는다고 생각하지 마세요.그것을 현저하게 검사해야 한다.4. 예방적 검측 수조 구간
void frob(byte[] b, int off, int len) {
if (b == null)
throw new NullPointerException();
if (off < 0 || off > b.length
|| len < 0 || b.length - off < len)
throw new IndexOutOfBoundsException();
...
}
주어진 그룹 구간 (예를 들어,off부터,len 요소를 읽는 것) 이 경계를 넘지 않는다고 생각하지 마세요.그것을 현저하게 검사해야 한다.셋, 수조
1. 배열 요소 채우기
순환 사용:
// Fill each element of array 'a' with 123
byte[] a = (...);
for (int i = 0; i < a.length; i++)
a[i] = 123;
( ) :
Arrays.fill(a, (byte)123);
2. 범위 내의 그룹 요소 복사순환 사용:
// Copy 8 elements from array 'a' starting at offset 3
// to array 'b' starting at offset 6,
// assuming 'a' and 'b' are distinct arrays
byte[] a = (...);
byte[] b = (...);
for (int i = 0; i < 8; i++)
b[6 + i] = a[3 + i];
( ) :
System.arraycopy(a, 3, b, 6, 8);
3. 배열 크기 조정순환 사용(확장):
// Make array 'a' larger to newLen
byte[] a = (...);
byte[] b = new byte[newLen];
for (int i = 0; i < a.length; i++) // Goes up to length of A
b[i] = a[i];
a = b;
순환 사용(규모 축소):
// Make array 'a' smaller to newLen
byte[] a = (...);
byte[] b = new byte[newLen];
for (int i = 0; i < b.length; i++) // Goes up to length of B
b[i] = a[i];
a = b;
(우선순위) 표준 라이브러리 사용 방법:
1a = Arrays.copyOf(a, newLen);
4. 4바이트 포장(packing)을 하나의 int로 한다
int packBigEndian(byte[] b) {
return (b[0] & 0xFF) << 24
| (b[1] & 0xFF) << 16
| (b[2] & 0xFF) << 8
| (b[3] & 0xFF) << 0;
}
int packLittleEndian(byte[] b) {
return (b[0] & 0xFF) << 0
| (b[1] & 0xFF) << 8
| (b[2] & 0xFF) << 16
| (b[3] & 0xFF) << 24;
}
5. int를 4바이트로 분해(Unpacking)
byte[] unpackBigEndian(int x) {
return new byte[] {
(byte)(x >>> 24),
(byte)(x >>> 16),
(byte)(x >>> 8),
(byte)(x >>> 0)
};
}
byte[] unpackLittleEndian(int x) {
return new byte[] {
(byte)(x >>> 0),
(byte)(x >>> 8),
(byte)(x >>> 16),
(byte)(x >>> 24)
};
}
항상 기호가 없는 오른쪽 이동 조작부호(>>)를 사용하여 위치를 포장(packing)하고 산수 오른쪽 이동 조작부호(>>)를 사용하지 마십시오.이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.