면접의 기초, 면접관은 항상 왜 문자열을 부탁?

면접의 기초이지만, 분명히 할 수없는 어린이 신발의 많은 거기에 자바 문자열에 대해,이 문서에서는 문자열을 혼동하게하는 간단하고 철저한에서 설명 할 것이다

자바에서는 문자열을 만드는 두 가지 방법이 있습니다

String x = "abc";
String y = new String("abc");

일반적인 종종 첫 번째 쓰기, 두 번째는 드물지만 인터뷰는 항상 같은 질문을 큰 따옴표 생성자의 차이점은 무엇 문자열의 두 가지 형태가 결국 만들?

예를 참조하십시오

예 1

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a == b점 A 및 B의 결과 때문에, 사실 메소드 영역 (메소드 영역) 리터럴 문자열은 메모리 참조 같다

반복 할 때마다 다른 문자열 값의 하나의 복사본 만 리터럴 매장 같은 문자열을 생성한다. 이것은라고 문자열 존재 / 유지 , 자바는 모든 문자열 상수가 자동으로 존재입니다 컴파일

예 2

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==d이는 참조하는 거짓, C 및 D로 평가 스택 다른 개체,不同的对象肯定有不同的内存引用

인용 두 가지 예는, 텍스트 설명 바보 비트? 우리는 그래픽으로 위의 두 사례를 이해하려고 :

아마도 당신이 가지고, 하나를 보면 方法区, 하나에 , JVM이 모델을이 차트를 보면 어쩌면 당신은 종종 인터뷰를하는 동안 그것에 대해 물어 두 개의 서로 다른 영역은 다음과 같습니다

나중에 당신이 잘 구별 할 수 있도록 다시 한번 말씀 드리지만 모든 새로운 객체는 힙에있을 것입니다

실행 문자열 존재

말했다 위는 컴파일시에 문자열의 존재, 당신은 그것을 실행할 수 있습니까? 대답은 '예, 우리는 도움이되는 기능을 필요로한다

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

참조 c == d영역에서 구금의 방법을 만들 동일한 문자열처럼, 인턴 () 메서드를 호출하여 역할의 (영어 구금, 가택 연금을 의미 한) 당신이 인턴을 이해한다, true로 평가를

인터뷰에서 당신은 다음과 같은 코드가 여러 개체를 만듭니다 당신에게 요청할 수 있습니다 :

String d = new String("abcd")
  1. 메소드 영역이 이미 "ABCD"를 존재하는 경우, 만 새로운 String의 객체를 생성
  2. 메소드 영역은 "ABCD"이 아닌 경우, 힙에서 두 개체, 지역의 방법을 만들

따라서, 일반적으로 다음 우리는이 여분의 쓸모없는 객체를 가질 가능성이있는 한, 생성자를 사용하여 객체를 만들 필요가 없습니다,하지만 예외가 아있다, 우리는 다음과 같이 말했다

String s = "abcd";
s = s.concat("ef");

우리는 문자열의 모자이크 "EF"이 때문에 String 객체의 생성에 힙에서 새로운 개체, 새로운 객체의 생성 기준점을 만들 때 다시 생각하면, 불변 너무 String 클래스 모든 방법 (빠른 동작 문자열의 각 방법은 결국이 반환 새 문자열 단어를 반환하는 여부를 확인하려면, 당신의 IDE를 엽니 다) 자체를 변경할 수 있지만, 새로운 문자열을 반환하지 않습니다 여기에 당신은 또한 이해해야합니다, 진실 :

우리가 수정 될 문자열을 필요로하는 경우에, 우리는 더 나은 새로운 객체를 생성합니다 때문에 각 캐릭터의 동작에, 그렇지 않으면 StringBuffer를 또는 StringBuilder에 사용했고, 기존의 객체에 대한 참조 지점이없는, 그래서 우리는 가비지 컬렉션을 많이 낭비 것 시간

문자열이 설정됩니다 왜 당신이 이제까지 마지막으로 제조 / 궁금해, 여기 끝이 아니다?

왜 String 클래스는 최종 수정입니다

우리는 약간의 생각에 대해 생각하는 상호 억제 또는 아래로 밀어 필요 질문에 켜기

문자열 풀 필요

문자열 풀 (문자열 인턴 풀) 저장 영역은 특별한 영역 방법이다. 당신이 문자열을 만들 때 문자열이 이미 풀에 존재하는 경우, 다음이 아니라 새로운 객체를 만드는 대신 문자열로 기존의 참조로 돌아갑니다. 문자열이 가변 인 경우에 따라서, 그 잘못된 값 취득 원래 값 기준점 발생하는 기준 값을 변경

캐시 해시 코드

해시 코드 문자열은 종종 자바에 사용됩니다. 예를 들어, HashSet의 또는 HashMap에있다. 당신이 변화의 두려움없이 현금 수 있도록 보장 불변의 해시 코드는 항상 동일합니다. 이것은이 해시 코드 사용을 계산 때마다 필요하지 않음을 의미한다. 이것은 더 효율적입니다. 그래서 당신은 String 클래스에 다음 멤버 변수의 정의를 볼 수 있습니다 :

/** Cache the hash code for the string */
private int hash; // Default to 0

보안

문자열은 널리 네트워크 연결, 열린 파일과 같은 자바 클래스 많은 매개 변수로 사용됩니다. 문자열을 변경할 수없는 경우, 연결 또는 파일은 심각한 보안 위협으로 이어질 수있는 변경됩니다. 는 IT가 컴퓨터에 연결되어있는 방법,하지만 않았습니다. 매개 변수가 문자열이기 때문에 string 변수는, 반사에 보안 문제가 발생할 수 있습니다 .

불변의 객체는 본질적으로 스레드 안전

불변의 객체가 변경 될 수 없기 때문에, 그래서 그들은 자유롭게 여러 스레드간에 공유 할 수 있습니다. 이 동기화 할 필요가 없습니다.

즉, 효율성 및 안전성의 이유로, 문자열은 불변 수 있도록 설계되었습니다. 일반적으로, 불변 클래스는 선택의 원인이 이유입니다.

추가 정보

약 불변의 객체와 불변의 참조는 항상 혼동 일부 학생입니다

final User user = new User();

위의 코드는 다른 주소의 메모리를 가리 키도록 변경 될 수없는 사용자 참조를 의미하지만, 사용자가 변수 객체이기 때문에, 우리는 그 속성을 수정할 사용자의 setter 메소드를 호출 할 수 있습니다

많은 지식이 면접관이 물었다 내가 문자열을 좋아하는 이유는 주로 기본적인 기술에있다 JVM 모델의 이해를 포함하여, String 클래스에 포함

영혼 질문

  1. 같은 정수와 긴 같은 문자열 및 원시 래퍼 클래스는 최종 수정되어 있지만 인수 동기화 동기화 블록을 적용 할 이유는 사용하지 않는 것이 좋습니다?
  2. 자동 포장의 기본 유형의 당신은 무슨 일이 있었는지 알아? 그리고 관련 문제에

생산성 도구 향상

재료 테마 UI

이다 테마 IDEA, 설치 후, 인 - 플러그 선택한 Material Palenight다음 설정을하는 동안, 테마

설정 후, 당신의 생각은 극단적 인 편안함을 일으키는이있다


추천 도서


계속 공공 우려 번호에 오신 것을 환영합니다 ". 아치 일 군인"

  • 드라이 최첨단 Java 기술 공유
  • 생산성 도구 요약 | 회신 "도구"
  • 인터뷰 질문과 답변의 분석
  • 기술 데이터 수집 | 회신 "정보"

복잡한 문제, 문제 진보적 인 기술적 인 문제의 원칙의 고유의 추상 그래픽 분해의 간소화에 맞춰, 재미 학습 자바 기술 스택 관련 지식을 생각 탐정 소설을 읽기 쉬운, 기술 업데이트 계속 지켜봐 주시기 바랍니다 ......

추천

출처www.cnblogs.com/FraserYu/p/11462859.html