자바 String 학교 면접 문제 과정 상세 설명
package String_test;
public class test_1 {
public static void main(String[] args) {
String str1 = "HelloWorld";
String str2 = "HelloWorld";
String str3 = new String("HelloWorld");
String str4 = "Hello";
String str5 = "World";
String str6 = "Hello" + "World";
String str7 = str4 + str5;
System.out.println("str1 == str2 result: " + (str1 == str2)); //1. true
System.out.println("str1 == str3 result: " + (str1 == str3)); //2. false
System.out.println("str1 == str6 result: " + (str1 == str6)); //3. true
System.out.println("str1 == str7 result: " + (str1 == str7)); //4. false
System.out.println("str1 == str7.intern() result: " + (str1 == str7.intern())); //5. true
System.out.println("str3 == str3.intern() result: " + (str3 == str3.intern())); //6.false
}
}
메모리 그림 을 그 려 서 각 상황 을 하나씩 분석 합 니 다.첫 번 째:str 1 과 str 2 는 같은 주 소 를 가리 키 기 때문에 같 습 니 다.두 번 째:new 대 표 는 대상 을 만 들 었 습 니 다.str 3 은 메모리 의 인용 을 가리 키 기 때문에 str 1 과 str 3 이 가리 키 는 주소 가 다 릅 니 다.주의해 야 할 것 은 문자열 상수 탱크 에 같은 문자열 값 이 두 개 있 을 수 없습니다.메모리 가 가리 키 는 실제 값 을 쌓 을 지,실행 할 때 상수 탱크 의 HelloWorld 값 을 쌓 을 지 여부 입 니 다.
세 번 째:"Hello"와"World"는 상수 이기 때문에+번호 로 컴 파일 할 때 String str 6="Hello World"로 자동 으로 컴 파일 되 기 때문에 두 인용 은 모두 상수 풀 의 주 소 를 가리 키 는 것 입 니 다.
네 번 째:관건 은 String str 7=str4+str 5 를 이해 하 는 것 이다.jdk 문서 에 이런 말 이 있 습 니 다.
자바 언어 는 문자열 직렬 연산 자 특수 지원(+)을 제공 하고 다른 대상 과 문자열 로 변환 합 니 다.문자열 연결 은 StringBuilder 를 통 해(또는 StringBuffer)클래스 와 append 방법 을 실행 합 니 다.문자열 의 변환 은 방법 toString 을 통 해 실 시 됩 니 다.Object 와 계승 하 는 모든 종류의 자바 입 니 다.
이 를 통 해 jvm 은 더미 에 str 4 를 기반 으로 하 는 StringBuilder 대상 을 만 들 고 append 방법 으로 추가 하 며 마지막 으로 tosting()을 통 해 String 대상 을 되 돌려 줍 니 다.그러므로 str 7 은 메모리 의 대상 을 가리 키 고 str 1 은 상수 탱크 의 주 소 를 가리 키 며 이들 이 가리 키 는 주 소 는 다르다.
다섯 번 째:intern 방법 사용:빈 문자열 풀 로 클래스 String 에서 혼자 유지 합 니 다.intern 방법 을 호출 할 때 풀 에 이 String 대상 과 같은 문자열(equals(oject)방법 으로 확인)이 포함 되 어 있 으 면 풀 에 있 는 문자열 을 되 돌려 줍 니 다.그렇지 않 으 면 이 String 대상 을 풀 에 추가 하고 이 String 대상 의 인용 을 되 돌려 줍 니 다.여기 str 1 은 상수 탱크 의'Hello World'대상 을 가리 키 고 str7.intern():이때 상수 탱크 에'Hello World'문자열 값 이 있 기 때문에 주 소 는 같 습 니 다.
여섯 번 째:str 3 은 메모 리 를 쌓 는 것 을 가리 키 고 str3.intern()은 상수 탱크 에 있 는 문자열 인'Hello World'의 인용 을 되 돌려 주 므 로 이들 이 가리 키 는 주 소 는 다르다.
면접 문제 2:자바 의 String 은 왜 final 클래스 로 디자인 되 었 습 니까?
1.String 대상 캐 시 를 허용 합 니 다 hashCode 값:자바 에서 String 형식 은 매우 자주 사용 되 며,대량의 추가 삭제 와 검 사 를 포함 합 니 다.문자열 의 불변성 은 hashCode 의 유일 성 을 보장 합 니 다.이것 은 최적화 수단 으로 매번 hash 값 을 계산 하지 않 아 도 된다 는 것 을 의미 합 니 다.이것 은 HashMap 이 String,Integer 와 같은 가 변 대상 을 Key 값 으로 사용 하 는 것 을 권장 하 는 이유 입 니 다.
2.문자열 상수 탱크 필요:자바 는 문자열 상수 탱크 에 문자열 값 을 저장 합 니 다.String 대상 이 가 변 적 이면 많은 논리 적 오류 가 발생 합 니 다.예 를 들 어 대상 을 바 꾸 면 다른 독립 대상 에 영향 을 줄 수 있 습 니 다.
3.보안:네트워크 주소 의 url,파일 경로 path 는 일반적으로 String 형식 으로 저장 되 며,고정 적 으로 변 하지 않 으 면 많은 보안 위험 이 발생 할 수 있 습 니 다.
면접 문제 3:String 을 바 꿀 수 있 는 방법 은 무엇 입 니까?
이것 을 물 으 면 어색 하 다.sun 회사 가 특별히 디자인 한 가 변 적 이지 않 고 강제로 바 꾸 려 면 이런 소동 을 반사 할 수 밖 에 없다.
package String_test;
import java.lang.reflect.Field;
public class test_2 {
public static void main(String[] args) throws Exception {
String str = " ";
System.out.println("str=: "+str);
// value
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
field.set(str, new char[]{' ',' ',' ',' ',' ',' '});
System.out.println("str=: "+str);
}
}
면접 문제 4:다음 코드 는 몇 개의 대상 을 만 들 었 습 니까?
String st1 = new String(“abc”);
상수 탱크 는'abc'대상 이 고'abc'대상 이 쌓 여 있 으 며 모두 두 개 입 니 다.
String st1 = new String(“abc”);
String st2 = new String(“abc”);
세 대상.문자열 은 상수 탱크 에서 유일한 것 입 니 다.메모리 에 두 개,상수 탱크 중 하나 입 니 다.면접 문제 5:String,StringBuilder,StringBuffer 의 차 이 를 말 해 볼 까요?
1.String 클래스 는 문자열 상수 이 고 StringBuilder 와 StringBuffer 는 문자열 변수 입 니 다.전 자 는 변 할 수 없고 후 자 는 변 할 수 있다.
2.StringBuilder 는 동기 화 되 지 않 습 니 다.StringBuffer 류 의 API 는 모두 synchronized 동기 화 수식 을 채 웠 기 때문에 StringBuffer 는 다 중 스 레 드 장면 에서 사용 하기에 적합 합 니 다(실제 사용 하지 않 음).StringBuilder 류 는 단일 스 레 드 에서 사용 하기에 적합 합 니 다.이 두 가지 방법 은 append 와 insert 방법 입 니 다.
그것 의 세 가지 적용 장면 을 보면 알 수 있 습 니 다https://www.zhihu.com/question/20101840
소결:
String 클래스 와 그 구성원 에 대한 방법 은 모두 final 에 의 해 수 정 된 것 으로 Strin 클래스 가 계승 되 지 않 음 을 의미 합 니 다.String 바 텀 은 문자 배열 로 데 이 터 를 조작 합 니 다.String 에 관 한 모든 작업 jdk 바 텀 은 new 의 새로운 String 대상 을 바탕 으로 작 동 합 니 다.그래서 String 은 변 하지 않 습 니 다.
String 에 관 한 기본 적 인 이론 은 대체적으로 이런 것들 이 고 문자열 의 일부 알고리즘 도 고찰 할 수 있 습 니 다.이 부분 도 공략 해 야 할 난점 입 니 다!!
참조 링크:https://www.jb51.net/article/102181.htm
참조 링크:https://www.jb51.net/article/124070.htm
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.