찾다
Javajava지도 시간JAVA에서 문자열과 배열의 매개변수 전달에 대해 이야기해 보겠습니다.

이 기사는 Java 문자열 및 배열의 ​​매개변수 전달과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. Java가 값으로만 ​​전달하는 이유를 살펴보겠습니다.

JAVA에서 문자열과 배열의 매개변수 전달에 대해 이야기해 보겠습니다.

추천 학습: "java 학습 튜토리얼"

먼저 분명히 해야 할 것은 Java에는 값 전달만 있다는 것입니다! 값만 전달됩니다! 이론적 근거는 "think in java"에서 비롯됩니다. 다음 단계는 Java가 값으로만 ​​전달하는 이유를 자세히 설명하는 것입니다.
자바에는 기본형과 참조형, 그리고 특수형인 문자열이라는 두 가지 데이터 유형이 있기 때문에 크게 세 가지 측면으로 설명할 수 있습니다.

1. 기본 데이터 유형

코드를 먼저 살펴보세요

public class Demo01 {
    
    public void change(int a) {
        System.out.println("副本a 的初始值" + a);
        a = 20;
        System.out.println("副本a 的新值值" + a);
    }

    public static void main(String[] args) {
        int a = 10;
        Demo01 d = new Demo01();
        d.change(a);
        System.out.println("change方法执行后的值" + a);
    }
}

분석:

                                              기본 데이터 유형은 값 전송을 따르므로 객체 d가 변경() 메서드를 호출하면 원본 데이터의 복사본을 방법 in의 매개변수에 대해 처음에는 원래 값과 copy a의 값이 모두 10입니다. a=20을 실행한 후에는 copy a의 값이 20이 됩니다.

따라서 실행 결과는 다음과 같습니다.

원칙은 아래 그림을 참조하세요

2. 참조 데이터 유형

코드를 먼저 살펴보세요

public class Demo02 {

    char[] ch = {'a', 'b', 'c'};

    public void change(char ch[]) {
        System.out.println("方法中ch[0]的初始值:" + ch[0]);
        ch[0] = 'g';
        System.out.println("方法中ch[0]执行后的新值:" + ch[0]);
    }

    public static void main(String[] args) {
        Demo02 d = new Demo02();
        System.out.println("对象d中数组的初始值是:"+d.ch);
        d.change(d.ch);
        System.out.println("对象d中数组的最终值是:"+d.ch);
    }
}

분석:

매개변수인 경우 값이기도 합니다. 전달되는 것은 주소 값의 복사본이지만 두 주소는 동일한 위치를 가리킵니다. 복사 주소가 변경되지 않은 경우 복사 주소가 가리키는 데이터에 대한 작업은 원본 데이터의 값에 영향을 미칩니다. 메서드의 ch[] 배열과 원래 ch[] 배열은 동일한 데이터를 가리키므로 초기 단계에서는 ch[0]이 'a'를 가리키고 복사본의 ch[0]에 새 값이 할당됩니다. 'g'가 되는 것.
따라서 실행 결과는 다음과 같습니다.

원리는 아래 그림을 참조하세요.

3. 문자열의 매개변수 전달

코드를 먼저 보세요

public class Demo03 {
    public void change(String str2) {
        System.out.println("方法中str2初始值" + str2);
        System.out.println("方法中str2初始hashcode值" + str2.hashCode());
        str2 = "bbb";
        System.out.println("方法中str2赋值后:" + str2);
        System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode());
    }

    public static void main(String[] args) {
        String str1 = new String("aaa");
        System.out.println("原始字符串str1的hashcode值:" + str1.hashCode());
        Demo03 d = new Demo03();
        d.change(str1);
        System.out.println("方法调用后str1的值" + str1);
    }
}

분석:

문자열은 특별합니다. 데이터 유형은 하단 레이어가 최종 char[] 배열이므로 변경할 수 없으므로 문자열을 매개변수로 전달하면 동일한 방식으로 원본 객체를 복사하여 특수 배열로 작동할 수 있습니다. 이렇게 하면 복사 개체의 참조와 원본 개체의 참조가 모두 원본 문자열의 위치를 ​​가리키는 경우, 즉 str2가 처음 초기화될 때 가리키는 주소는 원본 객체 str1이 가리키는 위치, 즉 str2의 초기 해시코드 값은 원본 객체 str1의 해시코드 값과 동일합니다. 문자열에서 str2는 새 개체 참조를 가리킵니다. 즉, str2는 "bbb" 위치를 가리킵니다. str2의 해시코드 값은 변경되지만 str1의 원래 개체 참조는 변경되지 않았으며 "aaa"도 변경되지 않았으므로 str1은 여전히 ​​"aaa"를 가리킵니다. 실행 결과는 다음과 같습니다.

다음으로 좀 더 구체적인 문자열 예를 살펴보겠습니다.

public class Demo04 {

    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("hi");
        test(s, s2);
        System.out.println("方法調用后s的值:" + s);
        System.out.println("方法調用后s2的值:" + s2);
    }

    static void test(StringBuffer s3, StringBuffer s4) {
        System.out.println("方法初始化時s3的值" + s3);
        System.out.println("方法初始化時s4的值" + s4);
        s4 = s3;
        s3 = new StringBuffer("new");
        System.out.println("第一步变化后s3的值" + s3);
        System.out.println("第一步变化后s4的值" + s4);
        s3.append("boy");
        s4.append("gril");
        System.out.println("第二步变化后s3的值" + s3);
        System.out.println("第二步变化后s4的值" + s4);

    }
}
이번에는 결과를 먼저 살펴봅니다.


그런 다음 분석합니다.

메서드가 실행되기 전에, 문자열 s1과 s2가 가리키는 위치는 각각 "hello"와 "hi"입니다.

(1) 그런 다음 메서드의 매개 변수 s3 및 s4가 에서와 동일하게 초기화됩니다. 위의 예에서는 s1s2와 동일한 위치를 가리키거나 s1s2가 s3s4에 대한 개체 참조 복사본을 제공합니다. 이때 s3s4의 값은 "hello" 및 "hi"

입니다.

(2) 그런 다음 s4=s3을 실행합니다. 이 작업은 s3의 개체를 s4로 참조합니다. s4가 "hello"인 경우 이 작업은 s3에 a를 제공하는 것과 동일합니다. new 객체 참조이고 s3는 문자열이 "new"인 위치를 가리키므로 이때 s3 = "new", s4 = "hello"

(3) 그런 다음 s3.append("boy"); Append("gril"); StringBuffer의 추가 메소드는 s3s4가 새 객체 참조를 가리키므로 작동하지 않으며 이는 원래 기반으로 작동하므로 작업 후 s3 = "newboy", s4 = "hellogril "

(4) 이 시점에서 메서드 호출이 완료되었습니다. 돌아가서 프로세스에서 s3s4가 s1s2에 미치는 영향을 검토해 보겠습니다.
——- A. 먼저 s3는 s1처럼 "hello"를 가리키기 시작한 다음 s3에 대한 새 객체 참조 "new"를 생성합니다. 이때 s3와 s1은 더 이상 반센트 관계를 갖지 않으며 s3는 추가(boy) 수행 마지막으로 s3 = "newboy";
——– B. s4와 s2는 모두 처음에 "hi"를 가리키고 s3는 초기 값(즉, s1의 복사본)을 s4에 제공합니다. 이때 s4는 "hello"를 가리키며(이것은 s4와 s1 사이의 관계를 생성합니다), s4와 s1이 동일한 위치를 가리키기 때문에 추가(그릴) 작업을 수행합니다. s4=s1="hellogrill"로 변경하세요.
——- C. 그러면 s2가 가리키는 객체 "hi"는 변경되지 않았으며 s1이 가리키는 "hello"는 추가("grill") 작업에서 "hellogril"이 되었다는 것이 분명해집니다.

4. 요약

  • 기본 데이터 유형을 메소드의 형식 매개변수로 사용하는 경우 메소드 본문의 형식 매개변수를 수정해도 실제 매개변수의 값에 영향을 미치지 않습니다.

  • 참조 데이터 유형을 사용할 때 메소드 형식 매개변수로서 메소드 본문의 형식 매개변수가 가리키는 데이터 내용을 수정하면 형식 매개변수 변수와 실제 매개변수 변수가 동일한 힙 영역을 공유하기 때문에 실제 매개변수 변수의 값에 영향을 미칩니다.

  • 참조 데이터 유형을 사용할 때 메소드의 형식 매개변수로 사용되는 경우 메소드 본문에서 형식 매개변수 변수의 방향이 변경되어도 실제 매개변수 변수의 값에는 영향을 미치지 않습니다. 매개변수 변수와 실제 매개변수 변수는 각각 다른 힙 영역을 가리킵니다. 마지막 예가 가장 생생한 설명입니다.

  • 문자열 매개변수에 관해서도 매개변수 변수 지정이 변경되었는지 여부에 따라 달라집니다. 왜냐하면 String의 맨 아래 레이어는 최종 유형 char[]이기 때문입니다. String s = "aaa" 또는 String s = new String ( "aaa"), s에 대한 새 개체 참조가 생성됩니다. 그러나append() 메서드가 호출되면 새 개체를 가리키지 않고 원래 가리킨 개체가 변경되고 공유되는 개체 참조도 변경됩니다.

  • 마지막으로 반복되는 점은 Java에는 참조 전송이 없고 값 전송만 있다는 것입니다. 참조 유형은 특수한 값 전송입니다(해당 주소의 복사본이 매개변수에 제공되지만 기본 데이터와는 다릅니다). 주소가 가리키는 객체가 변경되면 공유 사유로 인해 원래 객체도 변경됩니다.

추천 학습: "java tutorial"

위 내용은 JAVA에서 문자열과 배열의 매개변수 전달에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 CSDN에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Java는 여전히 새로운 기능을 기반으로 좋은 언어입니까?Java는 여전히 새로운 기능을 기반으로 좋은 언어입니까?May 12, 2025 am 12:12 AM

javaremainsagoodlugageedueToitscontinuousevolutionandrobustecosystem.1) lambdaexpressionsenhancececeadeabilitys.2) Streamsallowforefficileddataprocessing, 특히 플레어로드 라트 웨이션

Java가 위대하게 만드는 이유는 무엇입니까? 주요 기능과 이점Java가 위대하게 만드는 이유는 무엇입니까? 주요 기능과 이점May 12, 2025 am 12:11 AM

javaisgreatduetoitsplatform incendence, robustoopsupport, extensibraries 및 strongcommunity.1) platforminceptenceviajvmallowscodetorunonvariousplatforms.2) oopeatures inncapsulation, Nheritance, and Polymorphismenblularandscode.3)

상위 5 개의 Java 기능 : 예와 설명상위 5 개의 Java 기능 : 예와 설명May 12, 2025 am 12:09 AM

Java의 5 가지 주요 특징은 다형성, Lambda Expressions, Streamsapi, 제네릭 및 예외 처리입니다. 1. 다형성을 사용하면 다른 클래스의 물체가 공통 기본 클래스의 물체로 사용될 수 있습니다. 2. Lambda 표현식은 코드를보다 간결하게 만듭니다. 특히 컬렉션 및 스트림을 처리하는 데 적합합니다. 3.StreamSapi는 대규모 데이터 세트를 효율적으로 처리하고 선언적 작업을 지원합니다. 4. 제네릭은 유형 안전 및 재사용 성을 제공하며 편집 중에 유형 오류가 잡히립니다. 5. 예외 처리는 오류를 우아하게 처리하고 신뢰할 수있는 소프트웨어를 작성하는 데 도움이됩니다.

Java의 최고 기능은 성능과 확장 성에 어떤 영향을 미칩니 까?Java의 최고 기능은 성능과 확장 성에 어떤 영향을 미칩니 까?May 12, 2025 am 12:08 AM

java'stopfeaturessificeNificeLynitySteperformanceandscalibers

JVM Internals : Java Virtual Machine에 깊숙이 다이빙JVM Internals : Java Virtual Machine에 깊숙이 다이빙May 12, 2025 am 12:07 AM

JVM의 핵심 구성 요소에는 클래스 로더, runtimedataarea 및 executionEngine이 포함됩니다. 1) 클래스 로더는 클래스 및 인터페이스로드, 연결 및 초기화를 담당합니다. 2) runtimedataarea에는 Methodarea, 힙, 스택, Pcregister 및 NativeMethodStacks가 포함되어 있습니다. 3) ExecutionEngine은 바이트 코드의 실행 및 최적화를 담당하는 통역사, JitCompiler 및 GarbageCollector로 구성됩니다.

자바를 안전하고 안전하게 만드는 기능은 무엇입니까?자바를 안전하고 안전하게 만드는 기능은 무엇입니까?May 11, 2025 am 12:07 AM

Java'sSafetyandsecurityArebolsteredBy : 1) 강력한, reventStype relatedErrors; 2) AutomaticMemoryManagementViageGageCollection; 3) 샌드 박스, 고립 코드 프롬 시스템; 및 4) 강도 핸드 링, 보장

필수 Java 기능 : 코딩 기술 향상필수 Java 기능 : 코딩 기술 향상May 11, 2025 am 12:07 AM

javaoffersseveralkeyfeaturestenhancecodingskills : 1) 객체 지향적 인 프로그래밍 allowsmodelingreal-worldentities, 예시적인 혈관 림 모르 즘 .2) 예외적 인 handlingprovidesrobusterrormanagement.3) LambdaexorsionssimplifyOperations, 개선

JVM 가장 완전한 가이드JVM 가장 완전한 가이드May 11, 2025 am 12:06 AM

thejvmisacrucialcomponentsThrunsjavacodebacodebybacodebytranslatingitintintintincinomachine-specificinstructions, 영향력 성능, 보안 및 포트 가능성

See all articles

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경