자바의 문자열 비교

Java에서 String클래스는 char. 간단히 말해서, String단어, 문장 또는 원하는 기타 데이터를 구성하는 데 사용되는 문자 배열입니다.

캡슐화는 객체 지향 프로그래밍에서 가장 강력한 개념 중 하나입니다. 캡슐화 때문에 String 클래스가 어떻게 작동 하는지 알 필요가 없습니다 . 인터페이스에서 어떤 방법을 사용 할지 알아야 합니다 .

StringJava 에서 클래스 를 보면 배열 char이 캡슐화되는 방식을 볼 수 있습니다 .

 public String(char value[]) { this(value, 0, value.length, null); } 

캡슐화를 더 잘 이해하려면 물리적 객체 인 자동차를 고려하십시오. 운전하기 위해 자동차가 후드 아래에서 어떻게 작동하는지 알아야합니까? 물론 그렇지는 않지만 자동차의 인터페이스 (가속기, 브레이크, 스티어링 휠 등)가 무엇을하는지 알아야합니다. 이러한 각 인터페이스는 가속, 브레이크, 좌회전, 우회전 등 특정 작업을 지원합니다. 객체 지향 프로그래밍에서도 마찬가지입니다.

Java Challengers 시리즈 의 첫 번째 블로그 에서는 String클래스가 광범위하게 사용 하는 기술인 메서드 오버로딩을 소개 했습니다. 오버로딩은 다음을 포함하여 클래스를 매우 유연하게 만들 수 있습니다 String.

 public String(String original) {} public String(char value[], int offset, int count) {} public String(int[] codePoints, int offset, int count) {} public String(byte bytes[], int offset, int length, String charsetName) {} // And so on…... 

String이 Java Challenger는 클래스가 작동 하는 방식을 이해하려고 시도하는 대신 그것이 수행하는 작업과 코드에서 사용 하는 방법 을 이해 하는 데 도움이됩니다 .

문자열 풀이 란 무엇입니까?

StringJava에서 가장 많이 사용되는 클래스 일 수 있습니다. 를 사용할 때마다 메모리 힙에 새 객체가 생성 String되면 많은 메모리를 낭비하게됩니다. String풀은 각각 단지 하나의 오브젝트를 저장함으로써이 문제를 해결 String아래와 같이 값.

라파엘 치넬 라토 델 네로

및에 대한 String변수를 만들었지 만 두 개의 개체 만 만들어 메모리 힙에 저장됩니다. 증명을 위해 다음 코드 샘플을보십시오. ( Java 의 " "연산자는 두 객체를 비교하고 동일한 지 여부를 결정하는 데 사용됩니다.)DukeJuggyString==

 String juggy = "Juggy"; String anotherJuggy = "Juggy"; System.out.println(juggy == anotherJuggy); 

이 코드는 trueStrings가 String풀 의 동일한 객체를 가리 키기 때문에 반환됩니다 . 그들의 가치는 동일합니다.

예외 : 'new'연산자

이제이 코드를보세요. 이전 샘플과 비슷해 보이지만 차이점이 있습니다.

 String duke = new String("duke"); String anotherDuke = new String("duke"); System.out.println(duke == anotherDuke); 

이전 예제에 따르면이 코드가를 반환한다고 생각할 수 true있지만 실제로는 false. new연산자를 추가하면 String메모리 힙에 새 항목이 강제로 생성 됩니다. 따라서 JVM은 두 개의 다른 개체를 만듭니다.

기본 방법

Java 의 기본 메소드 는 일반적으로 메모리를 조작하고 성능을 최적화하기 위해 C 언어를 사용하여 컴파일되는 메소드입니다.

문자열 풀과 intern () 메서드

을 저장하려면 StringString수영장, 우리라는 기술을 사용 String인턴을 . 다음은 Javadoc이 intern()메소드 에 대해 알려주는 내용입니다 .

 /** * Returns a canonical representation for the string object. * * A pool of strings, initially empty, is maintained privately by the * class {@code String}. * * When the intern method is invoked, if the pool already contains a * string equal to this {@code String} object as determined by * the {@link #equals(Object)} method, then the string from the pool is * returned. Otherwise, this {@code String} object is added to the * pool and a reference to this {@code String} object is returned. * * It follows that for any two strings {@code s} and {@code t}, * {@code s.intern() == t.intern()} is {@code true} * if and only if {@code s.equals(t)} is {@code true}. * * All literal strings and string-valued constant expressions are * interned. String literals are defined in section 3.10.5 of the * The Java™ Language Specification. * * @returns a string that has the same contents as this string, but is * guaranteed to be from a pool of unique strings. * @jls 3.10.5 String Literals */ public native String intern(); 

intern()방법은 저장하는 데 사용되는 StringA의의 String수영장. 먼저 String생성 한 파일이 이미 풀에 있는지 확인 합니다. 그렇지 않은 경우 String풀에 새로 생성 됩니다. 배후에서 String풀링 의 논리는 플라이 웨이트 패턴을 기반으로합니다.

이제 new키워드를 사용하여 두 개의를 강제로 생성 할 때 어떤 일이 발생하는지 확인 하십시오 String.

 String duke = new String("duke"); String duke2 = new String("duke"); System.out.println(duke == duke2); // The result will be false here System.out.println(duke.intern() == duke2.intern()); // The result will be true here 

new키워드 를 사용한 이전 예와 달리이 경우 비교는 사실로 판명됩니다. intern()방법을 사용하면 Strings가 풀에 저장 되기 때문 입니다.

String 클래스가있는 Equals 메서드

equals()메소드는 두 Java 클래스의 상태가 동일한 지 확인하는 데 사용됩니다. 클래스 equals()에서 왔기 때문에 Object모든 Java 클래스가 상속합니다. 그러나 equals()제대로 작동하려면 메서드를 재정의해야합니다. 물론, String보다 우선합니다 equals().

구경하다:

 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String aString = (String)anObject; if (coder() == aString.coder()) { return isLatin1() ? StringLatin1.equals(value, aString.value) : StringUTF16.equals(value, aString.value); } } return false; } 

보시다시피 String클래스 값 의 상태 equals()는 객체 참조가 아니어야합니다. 객체 참조가 다른지 여부는 중요하지 않습니다. 상태 String가 비교됩니다.

가장 일반적인 String 메서드

String비교 도전을 시작하기 전에 알아야 할 마지막 사항이 하나 있습니다 . String클래스 의 다음과 같은 일반적인 방법을 고려하십시오 .

 // Removes spaces from the borders trim() // Gets a substring by indexes substring(int beginIndex, int endIndex) // Returns the characters length of the String length() // Replaces String, regex can be used. replaceAll(String regex, String replacement) // Verifies if there is a specified CharSequence in the String contains(CharSequences) 

문자열 비교 도전을 해보세요!

String빠른 도전에서 수업에서 배운 것을 시험해 봅시다 .

이 도전에서는 String우리가 살펴본 개념을 사용하여 여러 가지를 비교합니다 . 아래 코드를 보면 각 결과 변수 의 최종 값을 확인할 수 있습니까?

 public class ComparisonStringChallenge { public static void main(String... doYourBest) { String result = ""; result += " powerfulCode ".trim() == "powerfulCode" ? "0" : "1"; result += "flexibleCode" == "flexibleCode" ? "2" : "3"; result += new String("doYourBest") == new String("doYourBest") ? "4" : "5"; result += new String("noBugsProject") .equals("noBugsProject") ? "6" : "7"; result += new String("breakYourLimits").intern() == new String("breakYourLimits").intern() ? "8" : "9"; System.out.println(result); } } 

결과 변수의 최종 값을 나타내는 출력은 무엇입니까?

A : 02468

B : 12469

C : 12579

D : 12568

여기에서 답을 확인하세요.

방금 무슨 일이 있었나요? 문자열 동작 이해

코드의 첫 번째 줄에는 다음이 표시됩니다.

 result += " powerfulCode ".trim() == "powerfulCode" ? "0" : "1"; 

메서드가 호출 된 String후에는 동일 하지만 처음에는 달랐습니다. 이 경우 비교는입니다 . 왜냐하면 메서드가 경계에서 공백을 제거 하면 new 연산자 로 new 를 생성하도록 강제하기 때문 입니다.trim()String“ powerfulcode “falsetrim()String

다음으로,

 result += "flexibleCode" == "flexibleCode" ? "2" : "3"; 

No mystery here, the Strings are the same in the String pool. This comparison returns true.

Next, we have:

 result += new String("doYourBest") == new String("doYourBest") ? "4" : "5"; 

Using the new reserved keyword forces the creation of two new Strings, whether they are equal or not. In this case the comparison will be false even if the String values are the same.

Next is:

 result += new String("noBugsProject") .equals("noBugsProject") ? "6" : "7"; 

Because we’ve used the equals() method, the value of the String will be compared and not the object instance. In that case, it doesn’t matter if the objects are different because the value is being compared. This comparison returns true.

Finally, we have:

 result += new String("breakYourLimits").intern() == new String("breakYourLimits").intern() ? "8" : "9"; 

As you’ve seen before, the intern() method puts the String in the String pool. Both Strings point to the same object, so in this case the comparison is true.

Video challenge! Debugging String comparisons

Debugging is one of the easiest ways to fully absorb programming concepts while also improving your code. In this video you can follow along while I debug and explain the Java Strings challenge:

Common mistakes with Strings

It can be difficult to know if two Strings are pointing to the same object, especially when the Strings contain the same value. It helps to remember that using the reserved keyword new always results in a new object being created in memory, even if the values are the same.

Using String methods to compare Object references can also be tricky. The key is, if the method changes something in the String, the object references will be different.

A few examples to help clarify:

 System.out.println("duke".trim() == "duke".trim());; 

This comparison will be true because the trim() method does not generate a new String.

 System.out.println(" duke".trim() == "duke".trim()); 

In this case, the first trim() method will generate a new String because the method will execute its action, so the references will be different.

Finally, when trim() executes its action, it creates a new String:

 // Implementation of the trim method in the String class new String(Arrays.copyOfRange(val, index, index + len), LATIN1); 

What to remember about Strings

  • Strings are immutable, so a String’s state can’t be changed.
  • To conserve memory, the JVM keeps Strings in a String pool. When a new String is created, the JVM checks its value and points it to an existing object. If there is no String with that value in the pool, then the JVM creates a new String.
  • ==연산자를 사용하여 개체 참조를 비교합니다. 이 equals()방법을 사용하면 String. 모든 개체에 동일한 규칙이 적용됩니다.
  • new연산자를 사용하면 동일한 값을 가진가 있어도 풀 String에 새 항목 이 생성됩니다 .StringString

 

정답

이 Java Challenger에 대한 대답은 옵션 D입니다. 출력은 12568.

이 이야기 "자바의 문자열 비교"는 원래 JavaWorld에 의해 출판되었습니다.