Java 초보자가 자주 묻는 질문(추천)

6348 단어 javaFAQ
본고는 자바 초보자들이 자주 묻는 질문들을% 로 소수로 나눌 수 있습니까?a+=b와 a=a+b의 효과는 차이가 있습니까?하나의 그룹을 설명하는 데 왜 많은 시간이 필요합니까?왜 자바 라이브러리는 무작위 pivot 방식의 빠른 정렬을 사용하지 않습니까?
기본 데이터 유형
Q. 왜-0/3 결과는 0이고 -0.0/3.0 결과는 -0.0입니까?(뒤에 결과 0에 음수 기호 있음)
A. Java에서 정수는 부호로 표시됩니다.보충 부호에서 0은 단지 하나의 표현 방법만 있다.다른 한편, 부동점수는 IEEE 표준으로 표시되는데 0에 대해서는 두 가지 표현 방법이 있는데 0과 0이다.
Q. 소수점 하나로% 를 나눌 수 있나요?
A.그럼요.예를 들어 angle이 음수가 아니라면, angle% (2* Math.PI) 는 angle을 0에서 2π 사이로 변환합니다.
Q. ab가 모두 기본 유형 변수일 때 a+=b와 a=a+b의 효과는 차이가 있습니까?
A. a와 b의 유형이 같지 않으면 그 두 문장의 효과는 차이가 있을 수 있다.a+=b는 a=(int)(a+b)와 같고 이런 상황에서 a는 int형이고 b는float형일 수 있다.그러나 동등한 상황에서 a=a+b는 오류를 컴파일할 수 있다. 
조건문과 순환문
Q. 문자열이 동일하다고 판단하는 이유는 ==?
A. 이는 기본 유형(int, double, boolean)과 참조 유형(String)의 차이를 나타냅니다.
Q. 어떤 상황에서 한 문장 블록의 괄호를 생략할 수 없는 것은 없습니까?
A. 아래의 예에서 첫 번째 코드는 합법적이며 두 번째 코드는 컴파일 오류를 일으킬 수 있습니다.기술적으로 말하자면 그 문장은 변수 성명이지 문장이 아니기 때문에 오류를 보고할 수 있다.

// legal 
for (int i = 0; i <= N; i++) { 
 int x = 5; 
} 
// illegal 
for (int i = 0; i <= N; i++) 
 int x = 5; 
Q. 아래 두 단락의 코드에서 효과가 다른가요?

for (<init stmnt> <boolean expr>; <incr stmnt>) { 
 <body statements> 
} 
<init stmnt>; 
while (<boolean expr>) { 
 <body statements> 
 <incr stmnt> 
} 
A. 있어요.순환 블록에서continue 문장을 사용하면for의 코드에 계수기가 1을 추가합니다.while 코드에서는continue에 의해 생략되었기 때문에 계수기는 하나를 추가하지 않습니다. 
수조
Q. 일부 Java 개발자는 int[]a 대신 int[]a를 사용하여 그룹을 설명합니다.이 두 가지는 어떤 차이가 있습니까?
A. 자바에서 이 두 가지 용법은 모두 합법적이며 그들의 역할은 모두 같다.전자는 C에서 그룹을 정의하는 방법이다.후자는 JAVA가 추천하는 방법이다. 왜냐하면 그의 작법 int[]는 이것이 int의 수조라는 것을 더욱 잘 나타낼 수 있기 때문이다.
Q. 왜 수조 아래에 1부터 시작하는 것이 아니라 0부터 시작하는 것을 표시합니까?
A. 이런 전통은 기계 언어의 프로그래밍 방법에서 기원한다.기계 언어에서, 수조 아래 표시는 원소의 위치와 첫 번째 원소 사이의 편이량을 계산하는 데 사용된다.1부터 시작하면 편이를 계산할 때 감법 연산을 해야 하는데 낭비다.
Q. 만약 내가 음수를 수조로 표시한다면 무슨 일이 일어날까요?
A. 아래 표식이 0보다 작거나 그룹 길이보다 크면 JAVA가 실행될 때 Array Index Out OfBounds Exception 이상을 던져 프로그램 실행을 중단합니다.
Q. 그룹을 사용할 때 주의해야 할 다른 함정이 있나요?
A. JAVA는 그룹을 만들 때 초기화한다는 것을 기억해야 합니다. 따라서 그룹을 만드는 데 O(N)가 필요하다는 것을 설명합니다. 
Q. a[]가 하나의 그룹인데 왜 System인가.out.println(a)은 그룹 요소를 출력하지 않고 @f62373처럼 16진수를 출력합니까?
A. 네.이 문장은 메모리에 있는 그룹의 주소를 출력합니다. 시스템은 자동으로 그룹의 toString () 방법을 호출합니다. 이 문제는 toString () 방법의 원본을 볼 수 있습니다.
함수 호출
Q. 수조를 함수로 호출할 때의 매개 변수로 사용할 때 나는 항상 의심을 느낀다.
A.네.값 매개 변수 (매개 변수는 기본 변수 유형) 와 인용 매개 변수 (예를 들어 그룹) 간의 차이를 명심해야 한다.
Q. 그런데 왜 모든 매개 변수를 전가의 방식으로 사용하지 않습니까?
A. 그러나 수조가 크면 수조를 복제하는 데 많은 성능 비용이 필요합니다.이 때문에 절대 다수의 언어는 수조를 함수에 전송하는 것을 지원하지만 복사본을 복사하지 않는다. - MATLAB 언어를 제외한다.
귀속 호출
Q. 순환만 하고 귀속은 안 되는 경우가 있나요?
A. 불가능합니다. 모든 순환은 귀속으로 대체할 수 있습니다. 대부분의 경우 귀속은 추가 메모리가 필요합니다.
Q. 귀속만 할 수 있고 순환을 할 수 없는 경우는 없나요?
A. 불가능합니다. 모든 귀속 호출은 순환으로 표시할 수 있습니다.예를 들어 당신은 while 방식으로 창고를 실현할 수 있습니다.
Q. 그럼 어떤 것을 선택해야 하나요, 돌아가는 방식인가요, 순환하는 방식인가요?
A. 코드의 가독성과 효율성을 기준으로 합니다.
Q. 귀속 코드를 사용할 때 공간 비용과 중복 계산이 걱정됩니다(예를 들어 귀속으로 Fibonacci를 풀기).다른 걱정할 거 없어요?
A. 귀속 코드에서 빅데이터 유형(예를 들어 수조)을 만들 때 추가로 주의해야 한다. 귀속이 추진됨에 따라 메모리 사용이 신속하게 증가하고 메모리 사용이 증가하기 때문에 운영체제가 메모리를 관리하는 시간 비용도 증가한다.
정렬 및 찾기
Q. 왜 우리는 하나의 프로그램이 정확하다는 것을 증명하기 위해 큰 그림을 써야 합니까?
A. 잘못된 결과를 방지하기 위해.2분 찾기가 하나의 예다.이제 2점 찾기의 원리를 알게 되면 귀속 형식의 2점 찾기를 순환 형식의 2점 찾기로 바꿀 수 있다.Knuth 교수는 1946년에 2점 찾기 논문을 발표했지만 첫 번째 정확한 2점 찾기 프로그램은 1962년에 등장했다.
Q. JAVA 내 라이브러리에 정렬하고 찾는 함수가 있습니까?
A. 있어요.자바에 있어요.util.Arrays에는 Arrays가 포함되어 있습니다.sort() 및 Arrays.binarySearch () 방법.Comparable 형식은 병합 정렬을 사용하고 기본 데이터 형식은 빠른 정렬을 사용합니다.기본 유형은 값 전달이기 때문에 빠른 정렬은 병합 정렬보다 빠르고 추가 공간이 필요하지 않습니다.
Q. 왜 JAVA 라이브러리는 무작위 pivot 방식의 빠른 정렬을 사용하지 않습니까?
A. 네.일부 프로그래머들이 코드를 디버깅할 때 확실한 코드 구현이 필요할 수 있기 때문이다.무작위 pivot를 사용하는 것은 이 원칙에 위배된다.
스택 및 대기열
Q. 자바 라이브러리에서 Stacks와queues에 대한 구현이 있습니까?
A. Java 라이브러리에 java가 내장되어 있습니다.util.Stack, 하지만 진정한 창고가 필요하다면 사용하지 말아야 합니다.그것은 N번째 요소에 접근하는 것과 같은 추가 기능을 실현했기 때문이다.또한 창고 밑에 요소를 삽입하는 것도 지원하기 때문에 대기열처럼 보인다.비록 이러한 추가 기능을 실현하면 프로그래머에게 가산점이 되지만, 우리가 데이터 구조를 사용하는 것은 모든 기능을 사용하고 싶을 뿐만 아니라, 우리가 마침 필요로 하는 그런 구조가 필요하다.JAVA가 창고에 대한 실현은 전형적인 넓은 인터페이스의 예이다.
Q. 범주를 포함하는 창고를 표시하기 위해 그룹을 사용하고 싶은데 다음 코드가 잘못 컴파일되었습니다.왜?

private Item[] a = new Item[max]; 
oldfirst = first; 
A. 좋은 시도.불행하게도 Java 1.5에서 범용 그룹을 만드는 것은 지원되지 않습니다.예를 들어 아래의 글쓰기를 사용하면cast를 사용할 수 있습니다.

private Item[] a = (Item[]) new Object[max]; 
oldfirst = first; 
근본적인 원인은 JAVA의 수조가'협동적(covariant)'이기 때문이다. 그러나 범형은 그렇지 않다.예를 들어 String[]은 Object[]의 피드 유형이지만 Stack은 Stack의 피드 유형이 아닙니다.많은 프로그래머들은 "협동적"수조는 JAVA가 데이터 유형에 있어서의 단점이라고 생각한다.그러나 만약에 우리가 범형을 고려하지 않는다면'협동적'수조는 유용하다. 예를 들어 Arrays를 실현하는 것이다.sort(Comparable[]) 메서드, 그리고 매개 변수가 String[]일 때도 정상적으로 호출될 수 있습니다.
Q. 배열에서 foreach 방식을 사용할 수 있습니까?
A. 가능합니다.다음 코드를 참조하십시오.

public static void main(String[] args) { 
  for (String s : args) 
  StdOut.println(s); 
} 
Q. linked list에서 iterator를 사용하는 것이 순환이나 귀속보다 효율적이지 않나요?
A. 컴파일러는 번역할 때 그'꼬리 귀속'형식을 등가의 순환 형식으로 번역할 수 있습니다.그래서 관측할 수 있는 성능이 향상되지 않았을 수도 있다.
끝부분의 귀속은 일종의 프로그래밍 기교이다.만약 귀속 함수에서 귀속 호출이 되돌아오는 결과가 항상 직접 되돌아온다면 꼬리 귀속이라고 부른다.꼬리 귀속은 매우 중요하다. 꼬리 귀속을 사용하지 않고 함수의 창고 소모는 가늠하기 어려워 중간 함수의 창고를 많이 보존해야 한다.예를 들어 f(n,sum)= f(n-1)+value(n)+sum;n개의 함수 호출 창고를 저장하고 f(n,sum) = f(n-1,sum+value(n)를 사용합니다.이렇게 하면 다음 함수 창고만 보류하면 되고 이전의 최적화는 삭제할 수 있다.
Q. 자동 포장 메커니즘은 다음 상황을 어떻게 처리합니까?

Integer a = null; 
int b = a;
A. 실행 중 오류가 반환됩니다.기본 형식은 그에 대응하는 컨테이너 형식의 값을null로 허용하지 않습니다. 
Q. 왜 첫 번째 그룹은 true를 인쇄하지만 다음 두 그룹은 false를 인쇄합니까?

Integer a1 = 100; 
Integer a2 = 100; 
System.out.println(a1 == a2);  // true 
Integer b1 = new Integer(100); 
Integer b2 = new Integer(100); 
System.out.println(b1 == b2);  // false 
Integer c1 = 150; 
Integer c2 = 150; 
System.out.println(c1 == c2);  // false
A. 두 번째 코드 인쇄false는 b1과 b2가 서로 다른 Integer 대상을 가리키기 때문에 인용됩니다.1조와 3조는 자동 포장 메커니즘에 의존한다.의외로 첫 번째 그룹이true를 인쇄한 것은 -128과 127 사이의 값이 자동으로 같은immutable형의 Integer 대상으로 변환되기 때문이다.그 범위를 초과한 수에 대해 Java는 각 수에 대해 새로운 Integer 객체를 만듭니다.
위에서 말한 것은 편집자가 여러분께 소개한 자바 초보자가 자주 묻는 질문입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기