목차
st1과 st2는 동일합니까?

" >st1과 st2는 동일합니까?

到底创建了几个对象? " >到底创建了几个对象?
st1和st2是否相等? " >st1和st2是否相等?
判断一下st2和st3是否相等 " >判断一下st2和st3是否相等
Java Java인터뷰 질문들 5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)

Aug 23, 2023 pm 02:49 PM
자바 면접 질문

Java StringJava String类的 5 道面试题,这五道题,我自己在面试过程中亲身经历过几道题目,本篇就带你了解这些题的答案为什么是这样。

st1和st2是否相等?

public class Demo2_String { 
  public static void main(String[] args) {
    String st1 = "abc";
    String st2 = "abc";
    System.out.println(st1 == st2);
    System.out.println(st1.equals(st2));
  }
}
로그인 후 복사

输出结果:

  • 第一行:true
  • 第二行:true

分析

先看第一个打印语句,在Java中==这个符号是比较运算符,它可以基本数据类型和引用数据类型是否相等,如果是基本数据类型,==比较的是值是否相等,如果是引用数据类型,== 카테고리의 5가지 면접 질문. 저는 면접 과정에서 이 5가지 질문 중 몇 가지를 개인적으로 경험했습니다. 이 기사는 이러한 질문에 대한 답변이 왜 이런 것인지 이해하는 데 도움이 될 것입니다.

st1과 st2는 동일합니까?

String st1 = new String(“abc”);
로그인 후 복사
로그인 후 복사
🎜출력 결과: 🎜
  • 첫 번째 줄: true
  • 두 번째 줄: true
🎜 분석🎜🎜먼저 Java ==이 기호는 기본 데이터 유형과 참조 데이터 유형이 동일한지 여부를 판별할 수 있는 비교 연산자입니다. 기본 데이터 유형인 경우 == 값이 같은지 비교합니다. 참조 데이터 유형인 경우 , ==는 메모리 주소가 두 개체는 동일합니다. 🎜🎜문자열은 8가지 기본 데이터 유형에 속하지 않습니다. 위에서 문자열 객체는 참조 데이터 유형에 속합니다. 위에서 "abc"는 두 문자열 객체 st1과 st2에 동시에 할당되어 동일한 주소를 가리킵니다. first print 문에서 == 비교의 출력 결과가 true입니다. 그런 다음 두 번째 print 문에서 같음 비교를 살펴보겠습니다. 우리는 같음이 상위 클래스 Object의 메서드이고 이 같음 메서드가 String 클래스에서 다시 작성되었음을 알 수 있습니다. 🎜🎜🎜

在JDK API 1.6文档中找到String类下的equals方法,点击进去可以看到这么一句话“将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的String 对象时,结果才为 true。” 注意这个相同字符序列,在后面介绍的比较两个数组,列表,字典是否相等,都是这个逻辑去写代码实现。

由于st1和st2的值都是“abc”,两者指向同一个对象,当前字符序列相同,所以第二行打印结果也为true。下面我们来画一个内存图来表示上面的代码,看起来更加有说服力。

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)

内存过程大致如下:

1)运行先编译,然后当前类Demo2_String.class文件加载进入内存的方法区

2)第二步,main方法压入栈内存

3)常量池创建一个“abc”对象,产生一个内存地址

4)然后把“abc”内存地址赋值给main方法里的成员变量st1,这个时候st1根据内存地址,指向了常量池中的“abc”。

5)前面一篇提到,常量池有这个特点,如果发现已经存在,就不在创建重复的对象

6)运行到代码 Stringst2 =”abc”, 由于常量池存在“abc”,所以不会再创建,直接把“abc”内存地址赋值给了st2

7)最后st1和st2都指向了内存中同一个地址,所以两者是完全相同的。

到底创建了几个对象?

String st1 = new String(“abc”);
로그인 후 복사
로그인 후 복사

答案是:在内存中创建两个对象,一个在堆内存,一个在常量池,堆内存对象是常量池对象的一个拷贝副本。

分析

我们下面直接来一个内存图。

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)

当我们看到了new这个关键字,就要想到,new出来的对象都是存储在堆内存。然后我们来解释堆中对象为什么是常量池的对象的拷贝副本。

“abc”属于字符串,字符串属于常量,所以应该在常量池中创建,所以第一个创建的对象就是在常量池里的“abc”。

第二个对象在堆内存为啥是一个拷贝的副本呢,这个就需要在JDK API 1.6找到String(String original)这个构造方法的注释:初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。所以,答案就出来了,两个对象。

st1和st2是否相等?

package string;
public class Demo2_String {
   public static void main(String[] args) {
     String st1 = new String("abc");
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}
로그인 후 복사

答案:false 和 true 由于有前面两道题目内存分析的经验和理论,所以,我能快速得出上面的答案。

==比较的st1和st2对象的内存地址,由于st1指向的是堆内存的地址,st2看到“abc”已经在常量池存在,就不会再新建,所以st2指向了常量池的内存地址,所以==判断结果输出false,两者不相等。

第二个equals比较,比较是两个字符串序列是否相等,由于就一个“abc”,所以完全相等。

内存图如下

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)

st1和st2是否相等?

public class Demo2_String { 
   public static void main(String[] args) {
     String st1 = "a" + "b" + "c";
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}
로그인 후 복사

答案是:true 和 true 分析:“a”,”b”,”c”三个本来就是字符串常量,进行+符号拼接之后变成了“abc”,“abc”本身就是字符串常量(Java中有常量优化机制),所以常量池立马会创建一个“abc”的字符串常量对象,在进行st2=”abc”,这个时候,常量池存在“abc”,所以不再创建。所以,不管比较内存地址还是比较字符串序列,都相等。

判断一下st2和st3是否相等

public class Demo2_String {
 
   public static void main(String[] args) {
     String st1 = "ab";
     String st2 = "abc";
     String st3 = st1 + "c";
     System.out.println(st2 == st3);
     System.out.println(st2.equals(st3));
   }
}
로그인 후 복사

答案:

  • falsefalse
  • true
true

analytic

위의 첫 번째 대답은 false이고 두 번째는 true이고 두 번째는 true입니다. 비교 중 하나는 "abc"이고 다른 하나는 접합하여 얻은 "abc"이므로 동등 비교입니다. , 이것은 출력이 사실입니다. 우리는 그것을 매우 잘 이해합니다.

그래서 첫 번째 판단이 왜 거짓인지, 우리는 혼란스럽습니다. 마찬가지로 아래에서는 API 주석과 메모리 다이어그램을 사용하여 이것이 동일하지 않은 이유를 설명합니다.

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)먼저 JDK API 1.6의 String 소개를 열고 아래 그림에서 문장을 찾아보세요.

핵심은 빨간색 원 안의 문장입니다. 모든 데이터와 문자열은 더하기 기호(+) 연산을 거쳐 최종 결과가 이어진 새 문자열이라는 것을 알고 있습니다. + 연산의 역할은 정확히 무엇인가요? 읽기를 권장합니다.

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)위 댓글은 이 스플라이싱의 원리를 설명하면 내부의 StringBuilder 또는 StringBuffer 클래스와 Append 메서드가 스플라이싱을 구현한 후 toString()을 호출하여 스플라이싱된 객체를 문자열 객체로 변환하고 마지막으로 주소를 할당한다는 것입니다. 문자열 객체를 변수로 변환합니다. 이러한 이해를 바탕으로 분석을 위한 메모리 다이어그램을 그려보자.

메모리 프로세스에 대하여

1) 상수 풀은 "ab" 객체를 생성하여 st1에 할당하므로 st1은 "ab"를 가리킵니다.

2) 상수 풀은 "abc" 객체를 생성하여 할당합니다. st2이므로 st2는 "abc"를 가리킵니다

3) 여기서는 + 스플라이싱 방법을 사용하므로 세 번째 단계는 StringBuffer 클래스의 추가 방법을 사용하여 "abc"를 가져오는 것입니다. 이때 메모리 0x0011은 a를 나타냅니다. StringBuffer 개체입니다. String 개체가 아닙니다.

4) StringBuffer 객체를 String 객체로 대체하기 위해 Object의 toString 메소드가 호출됩니다.

5) st3🎜🎜에 String 객체(0x0022)를 할당합니다. 따라서 st3과 st2의 == 판단 결과는 두 객체의 메모리 주소가 다르기 때문에 동일하지 않습니다. 🎜

Summary

올바른 결과를 얻으려면 JDK API의 일부 주석과 원리, 메모리 그래프 분석을 숙지해야 합니다. 메모리 그래프를 그리는 것이 이해하는 데 도움이 되었다고 인정합니다. 대답..왜 그러는거야?

위 내용은 5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

인터뷰어: Spring Aop 공통 주석 및 실행 순서 인터뷰어: Spring Aop 공통 주석 및 실행 순서 Aug 15, 2023 pm 04:32 PM

Spring을 알아야 하므로 Aop의 모든 알림 순서에 대해 이야기해 보겠습니다. Spring Boot 또는 Spring Boot 2는 Aop의 실행 순서에 어떤 영향을 줍니까? AOP에서 직면한 함정에 대해 알려주십시오.

특정 그룹과의 인터뷰: 온라인에서 OOM을 발견하면 어떻게 문제를 해결해야 합니까? 어떻게 해결하나요? 어떤 옵션이 있나요? 특정 그룹과의 인터뷰: 온라인에서 OOM을 발견하면 어떻게 문제를 해결해야 합니까? 어떻게 해결하나요? 어떤 옵션이 있나요? Aug 23, 2023 pm 02:34 PM

OOM은 코드나 JVM 매개변수 구성으로 인해 프로그램에 취약점이 있음을 의미합니다. 이 기사에서는 Java 프로세스가 OOM을 트리거할 때 문제를 해결하는 방법에 대해 독자에게 설명합니다.

초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS 초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS Aug 24, 2023 pm 03:09 PM

자바 동시 프로그래밍 시리즈의 추가 챕터인 C A S(비교 및 교환)는 여전히 이해하기 쉬운 스타일로 그림과 텍스트를 포함해 독자들이 면접관과 열띤 대화를 나눌 수 있도록 해준다.

Ele.me의 필기 시험 문제는 간단해 보이지만 많은 사람들을 당황하게 합니다. Ele.me의 필기 시험 문제는 간단해 보이지만 많은 사람들을 당황하게 합니다. Aug 24, 2023 pm 03:29 PM

많은 회사의 필기 시험 문제를 과소평가하지 마십시오. 함정이 있으며 우연히 함정에 빠질 수 있습니다. 이런 주기에 관한 필기시험 문제를 접하게 된다면 차분하게 생각하고 차근차근 풀어나가시길 권합니다.

지난주에 XX보험 인터뷰했는데 멋있었어요! ! ! 지난주에 XX보험 인터뷰했는데 멋있었어요! ! ! Aug 25, 2023 pm 03:44 PM

지난 주에 그룹의 한 친구가 Ping An Insurance와 인터뷰를 하러 갔습니다. 결과는 다소 아쉽지만, 말씀하신 것처럼 기본적으로 모든 질문에 낙담하지 않기를 바랍니다. 면접 질문을 외워야 면접이 해결될 수 있으니, 열심히 해주세요!

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함) 5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함) Aug 23, 2023 pm 02:49 PM

​이 기사에서는 Java String 클래스에 관한 5가지 면접 질문을 살펴보겠습니다. 저는 인터뷰 과정에서 이 5가지 질문 중 몇 가지를 직접 경험했습니다. 이 기사는 이러한 질문에 대한 답변이 왜 이런지 이해하는 데 도움이 될 것입니다.

100개의 Linux 인터뷰 질문과 답변을 수집하는 것이 좋습니다 100개의 Linux 인터뷰 질문과 답변을 수집하는 것이 좋습니다 Aug 23, 2023 pm 02:37 PM

이 기사에는 Linux 개요, 디스크, 디렉토리, 파일, 보안, 구문 수준, 실제 전투, 파일 관리 명령, 문서 편집 명령, 디스크 관리 명령, 네트워크 통신 명령, 시스템 관리 명령, 백업을 다루는 총 30,000 단어가 넘습니다. 압축 명령 등 Linux 지식 포인트 해체.

메이투안, 대답할 수 있는지 볼까? 메이투안, 대답할 수 있는지 볼까? Aug 24, 2023 pm 03:51 PM

메이투안, 대답할 수 있는지 볼까?

See all articles