programing

String.equals 대 ==

prostudy 2022. 8. 29. 21:24
반응형

String.equals 대 ==

이 코드는 문자열을 토큰으로 구분하여 문자열 배열에 저장한 후 변수를 첫 번째 홈과 비교합니다.왜 안 되지?

public static void main(String...aArguments) throws IOException {

    String usuario = "Jorman";
    String password = "14988611";

    String strDatos = "Jorman 14988611";
    StringTokenizer tokens = new StringTokenizer(strDatos, " ");
    int nDatos = tokens.countTokens();
    String[] datos = new String[nDatos];
    int i = 0;

    while (tokens.hasMoreTokens()) {
        String str = tokens.nextToken();
        datos[i] = str;
        i++;
    }

    //System.out.println (usuario);

    if ((datos[0] == usuario)) {
        System.out.println("WORKING");
    }
}

함수를 사용하여 스트링을 비교하고==환입니니다다

합니다.==연산자는 객체에 대한 참조가 동일한지 여부를 확인합니다.는 보통 같은 두 ".==하지만 그것에 의존하지 않는 것이 좋다.

if (usuario.equals(datos[0])) {
    ...
}

는 '이 아닌 것이 되어 있기 NB에 .그것은 코드 내에서 null이 아닌 것으로 보증되기 때문입니다.다만, 실제로 토큰이 몇개 있는지는 확인할 필요가 있습니다.datos를 사용하지 않으면 예외가 발생합니다.array는 array-of-transferation array of-transferation) array of-transferationarray-of-transferation)입니다.

조먼을 만나다

Jorman은 성공한 사업가로 집이 두 채 있다.

여기에 이미지 설명 입력

하지만 다른 사람들은 그것을 모른다.

같은 조만인가요?

매디슨 거리나 버크 거리의 이웃들에게 물어보면, 그들이 할 수 있는 말은 이것뿐입니다.

여기에 이미지 설명 입력

거주지만으로는 같은 조먼인지 확인하기 어렵습니다.주소가 다르니까 두 사람일 거라고 추측하는 건 당연해요.

오퍼레이터가 그렇게 행동합니다.그래서 이렇게 써있겠지datos[0]==usuario주소만 비교하기 때문에 false입니다.

구조대 조사관

우리가 조사관을 보낸다면요?같은 조먼인 건 알지만 증명해야 해우리 형사가 모든 신체적인 측면을 면밀히 살펴볼 겁니다철저한 조사를 통해 동일인인지 아닌지를 에이전트가 판단할 수 있습니다.Java 용어로 설명하겠습니다.

equals()★★★★

여기에 이미지 설명 입력

문자열 문자를 문자별로 비교하여 문자열이 실제로 동등하다는 결론을 내립니다.

String 메서드는 이렇게 동작합니다.그렇게datos[0].equals(usuario)논리적 비교를 수행하기 때문에 true가 반환됩니다.

java가 문자열 - 문자열 리터럴을 처리하는 방식이 내장되어 있기 때문에 경우에 따라 "==" 연산자를 사용하면 예상된 결과를 얻을있습니다(참조항목을 참조하십시오.String.intern()중 - ' - '라고 "hello world"두 클래스에서 해당 문자열을 "=="와 비교하면 다음과 같은 결과를 얻을 수 있습니다. true는 사양에 따라 예상되며, 첫 번째 문자열이 문자열 리터럴일 때(즉, 을 통해 정의됨) 동일한 문자열(같은 값을 가진 경우)을 비교하면 다음과 같습니다."i am string literal"두 와 같이 'new' 키워드로 new String("i am string literal") , . . . . . . . .==(하는 것은 둘 다 false의 을 하다String

올바른 방법만 사용하는 것입니다..equals()->datos[0].equals(usuario). ==2개의 메모리주소( 주소가 )★★★★★★★★★★★★★★★★★★★★★★★)

업데이트:2013년 01월 04일, 이하의 코멘트를 갱신했습니다만, 어느 정도 올바른 코멘트입니다.원래는 JVM 최적화의 부작용으로 인터닝(String.intern)을 선언했습니다.메모리 자원을 절약할 수 있는 것은 확실하지만('최적화'라는 의미), 주로 언어의 특징입니다.

equals()함수는 의 한 가지입니다.Object이 클래스는 프로그래머에 의해 덮어써야 합니다. String클래스는 두 문자열이 동일한지, 즉 참조 문자열이 아닌지를 확인하기 위해 덮어씁니다.

==연산자는 두 개체의 참조가 동일한지 확인합니다.

프로그램 검토

String abc = "Awesome" ;
String xyz =  abc;

if(abc == xyz)
     System.out.println("Refers to same string");

★★★★★★★★★★★★★★★★★★.abc ★★★★★★★★★★★★★★★★★」xyz 다 것을 String "Awesome" 입니다.그러니까 이런 표현은(abc == xyz)true.

String abc = "Hello World";
String xyz = "Hello World";

if(abc == xyz)
    System.out.println("Refers to same string");
else
    System.out.println("Refers to different strings");

if(abc.equals(xyz))
     System.out.prinln("Contents of both strings are same");
else
     System.out.prinln("Contents of strings are different");

서 ★★★★abc ★★★★★★★★★★★★★★★★★」xyz 두 입니다."Hello World"서 표현은 '이것'입니다(abc == xyz)false서 「」라고 합니다.(abc.equals(xyz))true.

.== ★★★★★★★★★★★★★★★★★」<Object>.equals()

고마워요.

The == operator checks if the two references point to the same object or not.
.equals() checks for the actual string content (value).

.equals() 메서드는 클래스 오브젝트(모든 클래스의 슈퍼 클래스)에 속합니다.클래스 요건에 따라 덮어쓸 필요가 있지만 String의 경우 이미 구현되어 있으며 두 문자열의 값이 동일한지 여부를 확인합니다.

Case1)
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s1;      // true
s1.equals(s2); // true
Reason: String literals created without null are stored in the string pool in the permgen area of the heap. So both s1 and s2 point to the same object in the pool.
Case2)
String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2;      // false
s1.equals(s2); // true
Reason: If you create a String object using the `new` keyword a separate space is allocated to it on the heap.

대신

datos[0] == usuario

사용하다

datos[0].equals(usuario)

==한 것입니다..equals()원하는 값을 비교합니다.

==기준 동일성에 대한 검정입니다.

.equals()이치노

두 이 동일한지 하려면 " "를 ..equals()할 수 합니다.예를 들어, 「2」는 「2」입니다.하다String★★★★★★★★★★★★★★★★★★」

== 것입니다.Object.

// These two have the same value
new String("test").equals("test") ==> true 

// ... but they are not the same object
new String("test") == "test" ==> false 

// ... neither are these
new String("test") == new String("test") ==> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" ==> true 

// concatenation of string literals happens at compile time resulting in same objects
"test" == "te" + "st"  ==> true

// but .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) ==> false

할 점은 다음과 같습니다.==equals()(루프가 아닌 단일 포인터 비교) 따라서 적용 가능한 상황(즉, 내부 문자열만 취급할 수 있음을 보증할 수 있음)에서는 중요한 성능 향상을 나타낼 수 있습니다.그러나 이러한 상황은 드물다.

다음 Java를 분석하여 String의 ID와 동일성을 이해하겠습니다.

public static void testEquality(){
    String str1 = "Hello world.";
    String str2 = "Hello world.";

    if (str1 == str2)
        System.out.print("str1 == str2\n");
    else
        System.out.print("str1 != str2\n");

    if(str1.equals(str2))
        System.out.print("str1 equals to str2\n");
    else
        System.out.print("str1 doesn't equal to str2\n");

    String str3 = new String("Hello world.");
    String str4 = new String("Hello world.");

    if (str3 == str4)
        System.out.print("str3 == str4\n");
    else
        System.out.print("str3 != str4\n");

    if(str3.equals(str4))
        System.out.print("str3 equals to str4\n");
    else
        System.out.print("str3 doesn't equal to str4\n");
}

의 첫 번째 이 " " "일 때String str1 = "Hello world." " " ", " "\Hello world."가 생성되고, '''가 생성되어'''str1그것을 언급하고 있다. 문자열"Hello world."최적화로 인해 다음 줄의 코드가 실행될 때 다시 생성되지 않습니다. ''str2 기존의 ,, 의, also, 조, 조, 조, 합, 합, 합, 합, also, also, also, also""Hello world.".

「」==는 2개의 오브젝트의 ID를 체크합니다(두 변수가 같은 오브젝트를 참조하는지 여부).★★str1 ★★★★★★★★★★★★★★★★★」str2이치노이 문자열은 서로 동일합니다.equals는 2개의 객체가 동일한지 여부를 확인합니다(두 객체의 내용이 동일한지 여부).의 은요.str1 ★★★★★★★★★★★★★★★★★」str2똑같아요.

「」의 경우String str3 = new String("Hello world.") content가 실행된다."Hello world." 생성되고, ' 하다'로됩니다.str3에 내용이 있는 의 또 "Hello world.", 라고.str4 .부터str3 ★★★★★★★★★★★★★★★★★」str4두 개의 다른 인스턴스를 참조합니다.이러한 인스턴스는 동일하지 않지만 내용은 동일합니다.

따라서 출력에는 다음 4개의 행이 포함됩니다.

Str1 == str2

Str1 equals str2

Str3! = str4

Str3 equals str4

참조만 비교하는 연산자 ==가 아니라 문자열 등호를 사용하여 동일한 두 문자열을 비교해야 합니다.

'아, 아, 아, 아, 아, 아, 아, 아, 아,intern()스트링을 배열에 삽입하기 전에 스트링에 추가합니다.가 동일합니다( 참조가동일함).==('Value-Relay가equals()

public static void main (String... aArguments) throws IOException {

String usuario = "Jorman";
String password = "14988611";

String strDatos="Jorman 14988611";
StringTokenizer tokens=new StringTokenizer(strDatos, " ");
int nDatos=tokens.countTokens();
String[] datos=new String[nDatos];
int i=0;

while(tokens.hasMoreTokens()) {
    String str=tokens.nextToken();
    datos[i]= str.intern();            
    i++;
}

//System.out.println (usuario);

if(datos[0]==usuario) {  
     System.out.println ("WORKING");    
}

일반적으로는 「일부러」입니다..equals요.Object의 "2"가 있는지 Objects은은값값값가가

== 두 대상입니까?)Objects ★★★Object & ( ('Heap's) & ('Heap's') & ('Heap's') 가 확인합니다.Objectmanageda 입니다.또한 원시 유형의 값을 비교하기 위해 사용됩니다.

==자바어의 「」를할 수 .equalssyslog.

String s = "Test";
if(s.equals("Test"))
{
    System.out.println("Equal");
}

기본 문자열과 같이 할당된 문자열의 값을 비교하려면 "=="와 .dll이 모두 작동하지만 새 문자열 개체에는 .dll만 사용해야 하며 여기서 "=="은 작동하지 않습니다.

예제:

String a = "name";

String b = "name";

if(a == b) ★★★★★★★★★★★★★★★★★」(a.equals(b))진정한 돌아올 것이다.

그렇지만

String a = new String("a");

경우, 「」if(a == b) 반환하다false

때문에 이렇게 하다를 하는 것이 좋습니다..equals★★★★★★★★★★★★。

가치관의 == 연산자는 간단한 비교이다.
개체 참조를 위해(값)은(참조).그래서 x== y에서 true를 반환하면 만약 x와 y참조가 같은 개체입니다.

나는 이것이 오래 된 질문 하지만 여기 그것을(나는 매우 유용하다는 것을 알아내)이 있어 보여요: 알고 있다.


기술 설명

자바에서, 모든 변수들은 기본 형식 또는 언급이 있었다.

(만약 당신이 기준이 무엇인지 알고 개체에"개체 변수"은 단지 조언이 필요하다.그래서와Object something = ...기억( 많은)에 뭔가 아주 중요한 주소입니다.).

==정확한 값을 비교합니다.따라서 원시 값이 동일한지 또는 참조(주소)가 동일한지 비교합니다.★★★★★★★★★★★★★★★★★★.==하지 않는 은 스트링으로 동작합니다.스트링==는 다른 사람이 지적한 바와 같이 메모리 내의 주소가 동일한지 여부를 비교합니다. .equals()는 오브젝트의 비교 메서드를 호출하여 참조가 가리키는 실제 오브젝트를 비교합니다.문자열의 경우 각 문자를 비교하여 동일한지 확인합니다.


흥미로운 부분:

왜 ㅇㅇ는 거죠?==Strings 대 " true " strings 、 " strings 、 " strings 、 " strings strings 、 " strings strings 。문자열은 불변입니다.

String foo = "hi";
String bar = "hi";

에(「」를 ).trim()하지 않고 문자열이 됩니다.) 두의 다른 문자열이 String("hi") 경우 1개의 바이트 코드만 됩니다.String("hi")그래서 하면.

if (foo == bar) ...

그 직후에 같은 물체를 가리키고 있고, 진실하게 반환됩니다.하지만 당신은 거의 의도하지 않았어요.대신, 메모리의 다른 부분에 새로운 문자열을 생성하는 등의 사용자 입력을 요구합니다.

주의: 다음과 같은 작업을 수행할 경우baz = new String(bar)한 것은 리터럴 스트링을 할 수 입니다.그러나 중요한 점은 컴파일러가 리터럴 문자열을 볼 때 동일한 문자열을 쉽게 최적화할 수 있다는 것입니다.

런타임에 어떻게 동작하는지는 모르지만 JVM은 "라이브 문자열" 목록을 유지하지 않고 동일한 문자열이 존재하는지 확인합니다.(예를 들어 한 줄을 두 번 읽고 사용자가 같은 입력을 두 번 입력하면 두 번째 입력 문자열이 첫 번째 입력 문자열과 동일한지 확인하지 않고 동일한 메모리를 가리킵니다).힙 메모리를 조금 절약할 수는 있겠지만, 오버헤드는 그만한 가치가 없습니다.다시 한 번 말씀드리지만 컴파일러는 리터럴 스트링을 최적화하기 쉽습니다.

에 대한 == ★★.equals()왜 무작위로 보이는지도요

@Melkhia66 등식을 체크하기 위해 '==' 방식 대신 등식 방법을 사용할 수 있습니다.intern가 풀에 한 후 elseuniform.intern()이 반환됩니다. 경우 equal else uniform.intern()은 필수 코드입니다.

public class Demo
{
  public static void main(String[] args)
  {
              String str1 = "Jorman 14988611";
    String str2 = new StringBuffer("Jorman").append(" 14988611").toString();
    String str3 = str2.intern();
    System.out.println("str1 == str2 " + (str1 == str2));           //gives false
    System.out.println("str1 == str3 " + (str1 == str3));           //gives true
    System.out.println("str1 equals str2 " + (str1.equals(str2)));  //gives true
    System.out.println("str1 equals str3 " + (str1.equals(str3)));  //gives true
  }
}

.equals()는 두 한지 여부를 하고 2개의 문자열이 됩니다.boolean the as the " "로 지정합니다.==연산자는 두 문자열이 동일한 개체인지 확인합니다.

윗쪽 게시물에서 ==는 int와 null 확인에 사용된다고 합니다.부울 연산 및 문자 유형을 확인하는 데도 사용할 수 있습니다.

단, String이 아닌 char를 사용하고 있는지 다시 한 번 확인해 주십시오.예를들면

    String strType = "a";
    char charType = 'a';

스트링의 경우 [This would be correct]를 선택합니다.

    if(strType.equals("a")
        do something

그렇지만

    if(charType.equals('a')
        do something else

틀릴 수 있으므로 다음 작업을 수행해야 합니다.

    if(charType == 'a')
         do something else

a==b

값이 아닌 참조를 비교합니다.「 」의 ==오브젝트 참조가 있는 경우는 일반적으로 다음과 같이 제한됩니다.

  1. 참조가 다음과 같은지 확인하는 중null.

  2. 두 개의 열거값을 비교합니다.은 각각의 가 있습니다.enum★★★★★★★★★★★★★★★★★★.

  3. 두 개의 참조가 동일한 개체에 대한 것인지 확인하려고 합니다.

"a".equals("b")

등식의 값을 비교합니다. 는 에 되어 있기 Object 모든 class(class.class)는 됩니다.그러나 클래스가 이를 재정의하지 않는 한 대부분의 클래스에서 지능적인 비교를 수행하지 않습니다.대부분의 Java 코어 클래스에 대해 의미 있는 방법으로 정의되어 있습니다.되어 있지 (사용자) 클래스와 합니다.==.

토큰라이저 대신 스플릿을 사용하면 다음과 같은 출력 결과를 얻을 수 있습니다.

string name="Harry";
string salary="25000";
string namsal="Harry 25000";
string[] s=namsal.split(" ");
for(int i=0;i<s.length;i++)
{
System.out.println(s[i]);
}
if(s[0].equals("Harry"))
{
System.out.println("Task Complete");
}

이 후에는 더 좋은 결과를 얻을 수 있을 거라고 확신합니다.

언급URL : https://stackoverflow.com/questions/767372/string-equals-versus

반응형