String이 Java에 문자가 존재하는 유일한 클래스 인 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1404887

  •  05-07-2019
  •  | 
  •  

문제

java.lang.String 두 가지 창조 방식이 존재하는 유일한 클래스 :

1) 정상적인 방법으로 "new"키워드.

String s = new String("abc");

2) String 리터럴 (이용 가능 String 수업)

String s = "abc";

그래서 왜 거기에 있습니다 String 다른 클래스에 대한 리터럴과 리터럴 없음 ??

도움이 되었습니까?

해결책

String은 일반적인 클래스이지만 프로그래밍의 기본 요소 중 하나를 나타냅니다 (다른 것들은 숫자와 부울 값)를 나타냅니다. 따라서 Java는 문자열 객체를 첫날부터 반 프라이드 변수로 간주하여 허용했습니다.

나중에 자동 복싱이 표준 컴파일러의 일부가되면 이런 식으로 숫자 래퍼 객체를 빌드 할 수도 있습니다.

Integer i = 123;

Tom Hawtin-Tackline이 질문에 대한 의견에 언급 한 것처럼.

다른 팁

언어 디자이너가 느낌이 들기 때문에 짧은 대답.

문자열이 공통 계급이라고 생각합니다. 다른 유사한 예외도 있다고 확신합니다 (Tom Hawtins 의견 참조)

자서전을 제외하고 (IMO를 계산하지 않는다 - 리터럴은 클래스가 아닌 원시 유형을위한 것입니다. 래퍼 클래스로의 암시 적 변환이 있습니다), String(String) 생성자는 실제로 유용합니다. 문자 데이터의 사본이 필요합니다. 즉 원래의 문자열은 작지만 큰 후원이 있습니다 char[], 새 문자열은 그것과 독립적입니다.

예를 들어 파일에서 짧은 줄을 읽는 경우 중요 할 수 있습니다.

문자열 리터럴이있는 이유 : 유용하기 때문입니다. 대신 무엇을 원하십니까? 개발자가 사용하도록 강요 하시겠습니까?

String x = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

그리고 동시에 인턴이되지 않습니까?

다른 수업은 문자를 원하십니까? 지도와 목록에 대한 리터럴은 유용 할 것입니다. Java 7에 오는지 여부를 기억할 수 없습니다. 배열 초기화기를 객체 초기화를위한 속기라는 점에서 "문자 그대로 비슷한"것으로 생각할 수 있습니다.

문자열은 기본 데이터 유형과 같기 때문에 프리미티브와 동일한 수준으로 간주합니다.

btw,

new String("abc");

실제로 2 개의 문자열을 만듭니다.

  1. 참조를 잃은 인턴 된 사람
  2. 동일한 콘텐츠를 가진 새 인스턴스

개인적으로, 나는 String의 생성자를 사용할 필요가 없습니다.

리터럴이있는 객체 유형은 다음과 같습니다 문자열, 없는 그리고 클래스 리터럴.

이니셜 라이저를 사용할 수도 있습니다 배열 그리고 원시 리터럴은 또한 초기 라이저로 사용되는 경우 객체를 만드는 데 사용될 수 있습니다. 이는 진정한 리터럴이없는 간단한 구문에서 "두 가지 방법"에 맞는 "두 가지 방법"에 맞습니다 (객체 표현식이라는 모든 장소보다는 값을 초기화하는 데 사용할 수 있습니다. 발생할 수 있습니다 ).

직렬화 및 반사와 같은 다른 기술을 사용하는 경우 "두 가지 창조 방식"을 깨뜨릴 수 있습니다.

Java 7은 배열 리터럴과 매우 유사한 리터럴을 통해 초기 컬렉션을 제공 할 수있는 능력을 제공 할 예정입니다.

마지막으로 확인했습니다.

Integer wInt = 1;

잘 작동합니다.

후자의 창조 형태는 또한 현악 인턴과 관련이 있습니다. 즉, 코드가있는 경우 :

String s = "abc";
String t = "abc";

컴파일러는 이것을 최적화하고 동일한 문자열 객체에 대한 두 참조를 얻습니다. (s == t는 사실입니다).

문자열 인턴은 문자열 표현식에도 작동합니다.

물론 모든 원시 숫자 유형에 대한 리터럴과 부울은 참과 거짓, 숯이 있습니다. 나는 당신이 당신의 질문에서 당신이 기술적으로 "다른 사람을위한 리터럴은 없다고 대답 할 수 있다고 생각합니다. 클래스"좋아요. 누군가"널 "이 문자 그대로의 대상이라고 지적 했으므로, 당신의 진술은 기술적으로 부정확하지만, 그것이 유일한 다른 예라고 생각합니다.

그러나 다음 분명한 질문은, 다른 수업은 어떤 다른 수업을 원하십니까? 언어를 설계하고 있다면 BufferedReader 문자가 어떻게 생겼습니까? 아니면 결과 세트 문자 그대로? 아니면 jcheckbox?

예를 들어, "파일 리터럴"은 "$/home/bob/myfile.txt $"와 같은 특수 구분 기자로 둘러싸인 파일 이름이라고 이론적으로 말할 수 있습니다. 그러나 누군가 JBUTTON에 대해 어떻게 말할 수 있습니다. 우리는 버튼의 텍스트와 같은 문자를 만들 수 없었습니다. 그리고 소켓은 어떻습니까? 우리는 호스트 이름을 특별한 구분 기호 등에 넣을 수 없었습니다. 나는 구두점으로 사용하기 위해 구두점 마크가 빠르게 떨어질 것이라는 것이 분명하다고 생각합니다. 그래서 우리는 파일 ( "/home/bob/myfile.txt") 또는 소켓 ( "www.example.com", 631을 말하는 것과 같이 우리가 말하는 클래스를 식별하기 위해 일종의 텍스트를 작성해야합니다. ). 그러나 그것은 생성자처럼 끔찍한 것처럼 보이며, 우리는 Java의 저자들이 실제로 한 일로 돌아갈 것입니다.

값의 특성 (예 : 모든 숫자는 숫자 문자를 만듭니다) 또는 구두점을 가진 "사물"의 수는 키보드에 다시 적합 할 수있는 구두점 마크의 수에 의해 상당히 제한됩니다. 그리고 당신이 이야기하고 싶은 모든 종류의 다른 종류에 대한 600 개의 특수 아이콘이있는 키보드를 원하십니까? 단어는 훨씬 쉽고 유연합니다.

문자열은 일반적으로 사용되며 대안은 너무 어색하여 특별한 경우를 만드는 것이 합리적이었습니다.

문자열 리터럴은 잘 확립 된 우선 순위 (C)와 구문이있는 편리한 바로 가기입니다. Java 디자이너가 C ++ 프로그래머를 유혹하기를 원한다면 문자열 리터럴이 있어야했습니다. 다행스럽게도 문자열 처리는 C ++보다 Java에서 훨씬 더 넓습니다.

다른 표준 객체에는 사실상 구문이 없었습니다.지도 문자를 어떻게 작성 하시겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top