Java에서 char[] 출력이 메모리 주소가 아닌 이유 상세 정보

앞말
Java에는 모두 8가지 기본 데이터 형식이 있습니다:byte,int,short,long,float,double,char,boolean.
컴퓨터의 기초 데이터 단위는bit, 1byte=8bit이다.
데이터 유형
스토리지 크기
예를 들다
메모
포장류
byte
1byte

바이트
Byte
int
4byte

정수
Integer
short
2bytes

단정수
Short
long
8bytes

긴 정수
Long
float
4bytes
1.3
단정밀도 부동점형
Float
double
8bytes
1.2
이중 정밀도 부동점형
Double
char
2bytes
‘a'
문자
Char
boolean
1bit
true
부울 값
Boolean
이 8가지 기본 데이터 유형은 매우 간단합니다. 예제에서 응용해 보겠습니다.

public class Test {
 public static void main(String[] args){
 System.out.println("8 ");
 int a=5;
 System.out.println(a);
 char b='z';
 System.out.println(b);
 boolean d=false;
 System.out.println(d);
 byte e=3;
 System.out.println(e);
 short f=4;
 System.out.println(f);
 long g=32000000;
 System.out.println(g);
 float h=5;
 System.out.println(h);
 double i=6;
 System.out.println(i);
 }
}
간단한 출력 코드로 인쇄 결과를 보십시오.

8 
5
z
false
3
4
32000000
5.0
6.0
출력 결과는 문제없다는 것을 볼 수 있다.
기본 데이터 유형 및 객체 참조
기본 데이터 형식은 창고에서 만들어집니다. 기본 형식을 설명할 때 new가 필요하지 않습니다.

int a=1;
창고의 읽기 속도가 더미보다 빠르다.기본 형식이 성명되면 자바는 창고에 직접 저장되기 때문에 기본 형식의 변수는 데이터 자체를 나타낸다.
만약 기본 유형의 포장 클래스를 호출하여 대상을 만들면, 무더기에서 만들 것입니다.

Employee a=new Emploee(1.4);
등호 오른쪽new Double().이 new는 메모리의 더미에서 대상을 위한 컨트롤을 열고 대상의 데이터와 방법을 저장합니다.
등호 왼쪽 Double a.a는 더블의 대상을 가리키는데 대상 인용이라고 하는데 이 대상 인용은 창고에서 만든 것이다.실제로 a는 대상 자체가 아니라 주소를 가리키는 데 쓰인다.
부치이것은 바로 대상의 주소를 a에게 부여하는 것이다.
이때 출력 a는 메모리 주소입니다.흥미가 있는 학생은 스스로 해 보아라.
이 곳에서는 사용자 정의 대상이 다시 쓰기 .toString 방법을 사용한다면 사용자 정의 다시 쓰기 방법의 출력 값을 보여 줍니다.
자바의 기본 형식 포장 클래스에서 이 방법을 다시 썼기 때문에print 방법을 호출할 때 자동으로 toString() 방법을 호출합니다.

public class Wrapper {
 static class Employee{
 static int age;
 Employee(int a){
  age=a;
 }
 }
 static class Employer{
 static int year;
 Employer (int y){
  year=y;
 }
 @Override
 public String toString() {
  return "Employer's year="+year;
 }
 }
 public static void main(String[] args){
 Employee e=new Employee(4);
 System.out.println("e="+e);
 Employer f=new Employer(5);
 System.out.println("f="+f);
 }
}
위의 예에서 Employee의 toString() 방법은 다시 쓰지 않았고, Employer의 toString() 방법은 다시 썼다.
출력 결과를 보려면 다음과 같이 하십시오.

e=Wrapper$Employee@1b6d3586
f=Employer's year=5
전자는 여전히 메모리 주소이고, 후자는 우리가 다시 쓰는 방법이다.
print 방법은 호출에 있습니다. 만약에 클래스 중의 toString() 방법이 다시 쓰여지지 않으면 전영String.valueof() 방법(뒤에 설명이 있습니다), 다시 쓰면 toString 방법을 호출합니다.
모든 패키지 클래스(Integer, Boolean 등)는 toString 방법을 다시 썼기 때문에 메모리 주소를 출력하지 않고 정확한 값을 출력합니다.
다음은 Double 클래스의 방법입니다.

private final double value;
public String toString() {
 return toString(value);
 }
성형 데이터 형식 값 범위
byte가 8위를 차지하면 그 수치 범위는 2의 8차방, 즉 -128~127이어야 한다. 이 구간을 초과하면 오류가 발생한다. 예를 들어

byte a=128;
컴파일러에서 오류를 보고합니다. int를byte로 변환할 수 없습니다. 128이byte의 범위를 넘어섰기 때문입니다.
마찬가지로 다른 값의 수치 범위를 추정할 수 있다.
기본 형식의 그룹 출력 값

public class TestOne {
 public static void main(String[] args) {
 int a=127;
 System.out.println(a);
 int[] b=new int[]{1,2,3};
 System.out.println(b);
 int[] c=new int[100];
 System.out.println(c);
 int[] d={1,2,3};
 System.out.println(d);
 boolean e=false;
 System.out.println(e);
 boolean[] f={false,false,true};
 System.out.println(f);
 char g='a';
 System.out.println(g);
 char[] h={'a','b','c'};
 System.out.println(h);
 char[] i=new char[]{'a','b','c'};
 System.out.println(i);
 float j=1.2f;
 System.out.println(j);
 float[] k={1.2f,1.3f,1.4f};
 System.out.println(k);
 }
}
인쇄 결과를 보려면 다음과 같이 하십시오.

127
[I@15db9742
[I@6d06d69c
[I@7852e922
false
[Z@4e25154f
a
abc
abc
1.2
[F@70dea4e
결과에서 모든 기본 형식은 출력할 수 있고, 그룹 형식은char 그룹만 출력할 수 있으며, 다른 것은 메모리 주소입니다.
원본 코드를 보십시오.print 함수에서

public void print(char c) {
 write(String.valueOf(c));
 }
이 char는 String 형식으로 변환된 다음wirte 방법:

private void write(String s) {
 try {
  synchronized (this) {
  ensureOpen();
  textOut.write(s);
  textOut.flushBuffer();
  charOut.flushBuffer();
  if (autoFlush && (s.indexOf('
') >= 0)) out.flush(); } } catch (InterruptedIOException x) { Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } }
여기서 버퍼 출력을 즉시 보냅니다.
모든 기초 유형에 대해 구체적인 값을 출력합니다. 이것은 문제없습니다. 그러나 수조에 대해서는 왜char의 수조 유형만 정확한 결과를 출력하고 출력 메모리 주소가 없습니까?
이 문제를 가지고 우리가 알아보자.
int형 그룹에 대해 자바가 호출하는 방법은 다음과 같다.

public void println(Object x) {
  String s = String.valueOf(x);
  synchronized (this) {
   print(s);
   newLine();
  }
 }
이 배열은 Object 형식으로 여겨지고 호출된 것은

public static String valueOf(Object obj) {
  return (obj == null) ? "null" : obj.toString();
 }
이 세 가지 표현식은 공백을 판별한 다음 obj.toString() 방법을 보십시오.

public String toString() {
  return getClass().getName() + "@" + Integer.toHexString(hashCode());
 }
여기를 보면 왜 출력이 되는지 알 수 있을 거예요.I@1b6d3586자, I가 대표하는 클래스의 이름입니다.
그렇다면char수조 유형에 대한 호출은 횟수 룸메이트 현기의:

public void println(char x[]) {
  synchronized (this) {
   print(x);
   newLine();
  }
 }
여기서 호출된 것은 println(char x[]) 이 함수입니다. 그러면 이것char x[]은 어떤 귀신입니까?
사실은 자바의 수조 초기화로 char[] x 에 해당한다.
그리고 print(x) 함수를 보십시오.

public void print(char s[]) {
  write(s);
 }
마지막으로 write() 함수:

private void write(char buf[]) {
  try {
   synchronized (this) {
    ensureOpen();
    textOut.write(buf);
    textOut.flushBuffer();
    charOut.flushBuffer();
    if (autoFlush) {
     for (int i = 0; i < buf.length; i++)
      if (buf[i] == '
') out.flush(); } } } catch (InterruptedIOException x) { Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } }
여기까지 왔는데 왜 다른지 아세요? 다른 종류의 수조는 모두 Object 형식으로 여겨지기 때문에 메모리 주소를 출력합니다.char[] 호출 방법은char라는 그룹의 모든 값을 출력하는 것이기 때문에 메모리 주소가 아닙니다.
총결산
이상은 바로 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있기를 바랍니다. 만약에 의문이 있으면 여러분은 댓글을 남겨 교류할 수 있습니다. 저희에 대한 지지에 감사드립니다.

좋은 웹페이지 즐겨찾기