String.equals vs ==
이 질문에는 이미 답변이 있습니다.
- Java에서 문자열을 어떻게 비교합니까? 답변 23 개
이 코드는 문자열을 토큰으로 분리하여 문자열 배열로 저장 한 다음 변수를 첫 번째 홈과 비교합니다. 왜 작동하지 않습니까?
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");
}
}
이 string.equals(Object other)
함수를 사용하여 ==
연산자가 아닌 문자열을 비교 하십시오 .
이 함수는 문자열의 실제 내용을 ==
확인 하고 연산자는 객체에 대한 참조가 같은지 확인합니다. 문자열 상수는 일반적으로 "인터 닝"되므로 같은 값을 가진 두 개의 상수를 실제로 비교할 수 ==
있지만 그에 의존하지 않는 것이 좋습니다.
if (usuario.equals(datos[0])) {
...
}
NB : 비교에서 '일반'에 대해 수행됩니다. 코드에서 널이 아닌 것으로 보장되기 때문에 실제로 datos
배열에 일부 토큰이 있는지 확인해야합니다. 그렇지 않으면 범위를 벗어난 배열 예외가 발생합니다. .
Jorman을 만나보세요
Jorman은 성공적인 사업가이며 2 채의 집이 있습니다.
그러나 다른 사람들은 그것을 모른다.
같은 조르 만입니까?
매디슨 거리 나 버크 거리에서 이웃에게 물을 때, 이것이 그들이 말할 수있는 유일한 것입니다.
거주지를 단독으로 사용하면 동일한 조르 만임을 확인하기가 어렵습니다. 그것들은 2 개의 다른 주소이기 때문에, 그것들이 2 개의 다른 사람이라고 가정하는 것은 당연합니다.
이것이 운영자의 ==
행동 방식입니다. 따라서 주소datos[0]==usuario
만 비교 하기 때문에 거짓 이라고 말할 것 입니다 .
구조대 수사관
조사관을 보내면 어떻게 되나요? 우리는 그것이 같은 조르 만이라는 것을 알고 있지만 그것을 증명해야합니다. 우리 형사는 모든 신체적 측면을 면밀히 검토 할 것입니다. 상담원은 철저한 조사를 통해 동일한 사람인지 아닌지를 결정할 수 있습니다. Java 용어로 발생하는 것을 보자.
다음은 String equals()
메소드 의 소스 코드입니다 .
문자열이 실제로 동일하다는 결론을 내리기 위해 문자열을 문자별로 비교합니다.
이것이 String equals
메소드의 작동 방식입니다. 그래서 datos[0].equals(usuario)
그것은 수행하기 때문에, true를 돌려줍니다 논리적 비교 .
것을 통지에의 좋은 경우는 "=="의 사용 방법 자바 핸들 문자열 방식 때문에 운영자가, 예상되는 결과로 이어질 수 있습니다 문자열 리터럴 (참조 억류되어 - String.intern()
컴파일시가) - 그래서 당신은 예를 들어 쓸 때 "hello world"
두 개의 클래스와 해당 문자열을 "=="와 비교하면 결과를 얻을 수 있습니다. true, 사양 에 따라 예상됩니다 . 첫 번째 문자열이 문자열 리터럴 (예 :를 통해 정의 됨 "i am string literal"
)이고 두 번째는 런타임 중에 구성되는 경우 동일한 문자열 (같은 값이있는 경우)을 비교할 때 . 와 같은 "new"키워드 new String("i am string literal")
를 사용하면 ==
(같음) 연산자는 둘 다 String
클래스의 다른 인스턴스이므로 false를 반환합니다 .
올바른 방법 만 .equals()
-> 사용하고 datos[0].equals(usuario)
있습니다. ==
두 객체가 동일한 객체 인스턴스 (즉, 동일한 메모리 주소를 갖는 경우)
업데이트 : 01.04.2013 나는이 게시물이 아래의 코멘트로 업데이트되었습니다. 원래 나는 interning (String.intern)이 JVM 최적화의 부작용이라고 선언했습니다. 비록 그것이 "최적화"의 의미였던 메모리 자원을 확실히 절약하지만, 그것은 주로 언어의 특징이다
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()
감사.
대신에
datos[0] == usuario
사용하다
datos[0].equals(usuario)
==
변수의 참조를 .equals()
비교하여 원하는 값을 비교합니다.
==
참조 평등을 테스트합니다.
.equals()
가치 평등을 테스트합니다.
따라서 실제로 두 문자열의 값이 같은지 테스트하려는 경우 사용해야합니다 .equals()
( 같은 값을 가진 두 문자열이 동일한 오브젝트로 표시되도록 보장하는 몇 가지 상황 (예 : String
interning) 제외).
==
두 문자열이 같은지 테스트하기위한 것 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()
하므로 적용 가능한 상황에서 (즉, 인턴 문자열 만 처리하도록 보장 할 수있는) 중요한 성능 향상을 제공 할 수 있습니다. . 그러나 이러한 상황은 드물다.
The == operator checks if the two references point to the same object or not.
.equals() checks for the actual string content (value).
.equals () 메소드는 Object 클래스 (모든 클래스의 수퍼 클래스)에 속합니다. 클래스 요구 사항에 따라 재정의해야하지만 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.
intern()
배열에 문자열을 삽입하기 전에 문자열 을 호출하면 작동합니다 . 인터 턴 된 문자열은 ==
값이 같은 경우에만 참조 같음 ( ) 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");
}
문자열의 아이덴티티와 평등을 이해하기 위해 다음 Java를 분석해 보겠습니다.
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
는 또한 기존을 참조합니다 ""Hello world."
.
연산자 ==
는 두 객체의 동일성을 확인합니다 (두 변수가 동일한 객체를 참조하는지 여부). 이후 str1
와 str2
메모리 같은 문자열을 참조들은 서로 동일하다. 이 방법 equals
은 두 개체가 동일한 지 여부를 확인합니다 (두 개체의 내용이 같은지 여부). 물론,의 내용 str1
과 str2
동일합니다.
코드가 String str3 = new String("Hello world.")
실행될 때 content "Hello world."
가 포함 된 새로운 문자열 인스턴스 가 생성되고 변수에 의해 참조됩니다 str3
. 그런 다음 content "Hello world."
가 포함 된 다른 문자열 인스턴스 가 다시 생성되어로 참조됩니다 str4
. 이후 str3
및 str4
두 개의 서로 다른 경우를 참조하십시오, 그들은 동일하지 않은,하지만 그 내용은 동일합니다.
따라서 출력에는 네 줄이 포함됩니다.
Str1 == str2
Str1 equals str2
Str3! = str4
Str3 equals str4
참조를 비교하는 operator ==가 아니라 string equals 를 사용 하여 두 문자열의 동등성을 비교 해야합니다 .
==
연산자는 Java에서 객체의 참조를 비교합니다. string의 equals
method를 사용할 수 있습니다 .
String s = "Test";
if(s.equals("Test"))
{
System.out.println("Equal");
}
== 연산자는 값을 간단히 비교 한 것입니다.
객체 참조의 경우 (값)이 (참조)입니다. 따라서 x = y는 동일한 객체를 참조하면 x == y는 true를 반환합니다.
나는 이것이 오래된 질문이라는 것을 알고 있지만 여기에 내가 보는 방법이 있습니다 (매우 유용합니다).
기술적 인 설명
Java에서 모든 변수는 기본 유형 이거나 참조 입니다.
(참조가 무엇인지 알아야하는 경우 : "객체 변수"는 객체에 대한 포인터 일뿐 입니다. 따라서 Object something = ...
무언가는 실제로 메모리의 주소 (숫자)입니다.)
==
정확한 값을 비교합니다. 따라서 프리미티브 값이 동일한 지 또는 참조 (주소)가 같은지 비교합니다. 그렇기 때문에 ==
종종 문자열에서 작동하지 않습니다. 문자열은 객체이며 ==
두 문자열 변수를 수행 하면 다른 주소에서 지적했듯이 주소가 메모리에서 동일한 지 비교합니다. .equals()
객체의 비교 방법을 호출하여 참조가 가리키는 실제 객체를 비교합니다. 문자열의 경우 각 문자를 비교하여 동일한 지 확인합니다.
흥미로운 부분 :
그렇다면 왜 ==
문자열에 대해 true를 반환합니까? 문자열은 변경할 수 없습니다. 코드에서
String foo = "hi";
String bar = "hi";
문자열은 변경할 수 없기 때문에 ( .trim()
또는 호출 할 때 메모리에서 가리키는 원래 객체를 수정하지 않고 새 문자열을 생성 함) 실제로 두 개의 다른 String("hi")
객체 가 필요하지 않습니다 . 컴파일러가 똑똑하면 바이트 코드는 하나의 String("hi")
객체 만 생성하도록 읽습니다 . 그래서 당신이 할 경우
if (foo == bar) ...
그 직후 그들은 동일한 객체를 가리키고 true를 반환합니다. 그러나 당신은 이것을 거의 의도하지 않습니다. 대신, 메모리의 다른 부분 등에 새로운 문자열을 생성하는 사용자 입력을 요구합니다.
참고 : baz = new String(bar)
컴파일러 와 같은 작업을 수행해 도 여전히 동일한 것을 알 수 있습니다. 그러나 요점은 컴파일러가 리터럴 문자열을 볼 때 동일한 문자열을 쉽게 최적화 할 수 있다는 것입니다.
런타임에서 어떻게 작동하는지 모르겠지만 JVM이 "라이브 문자열"목록을 유지하지 않고 동일한 문자열이 존재하는지 확인한다고 가정합니다. (예를 들어 입력 줄을 두 번 읽고 사용자가 동일한 입력을 두 번 입력하면 두 번째 입력 문자열이 첫 번째 입력 문자열과 같은지 확인하지 않고 동일한 메모리를 가리 킵니다). 약간의 힙 메모리를 절약 할 수는 있지만 오버 헤드는 그다지 가치가 없습니다. 요점은 컴파일러가 리터럴 문자열을 최적화하는 것이 쉽다는 것입니다.
거기 당신은 ...위한 견실 한 설명을 가지고 ==
대를 .equals()
왜 그것을 무작위로 보인다.
@ Melkhiah66 '=='방법 대신 equals 방법을 사용하여 동등성을 확인할 수 있습니다. intern ()을 사용하면 객체가 풀에 있는지 여부를 확인한 다음 같지 않은 경우 equal을 반환합니다. equals 메소드는 내부적으로 해시 코드를 사용하여 필요한 결과를 얻습니다.
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
사용됩니다 .Object
Objects
==
참조 비교 ( 힙 에서 두 개 Objects
동일 Object
) 및가 Object
null 인지 확인하십시오 . 또한 기본 유형의 값을 비교하는 데 사용됩니다.
문자열, 즉 기본 문자열에 할당 된 값을 비교하려는 경우 "=="와 .equals는 모두 작동하지만 새 문자열 객체에는 .equals 만 사용해야하며 여기서 "=="는 작동하지 않습니다.
예:
String a = "name";
String b = "name";
if(a == b)
그리고 (a.equals(b))
사실을 반환합니다.
그러나
String a = new String("a");
이 경우 if(a == b)
에는false
따라서 .equals
연산자 를 사용하는 것이 좋습니다 ...
는 .equals()
두 개의 스트링이 동일한 값을 가지고 리턴하는지 확인한다 boolean
은 AS 값 ==
두 문자열이 동일한 개체 인 경우 운전자 여부를 확인하도록한다.
누군가가 게시물에서 ==가 int 및 null 검사에 사용된다고 말했습니다. 부울 연산 및 문자 유형을 확인하는 데 사용될 수도 있습니다.
그래도 매우주의하고 String이 아닌 char을 사용하고 있는지 다시 확인하십시오. 예를 들어
String strType = "a";
char charType = 'a';
문자열에 대해서는 다음을 확인하십시오.
if(strType.equals("a")
do something
그러나
if(charType.equals('a')
do something else
올바르지 않은 경우 다음을 수행해야합니다.
if(charType == 'a')
do something else
a==b
값이 아닌 참조를 비교합니다. ==
with 객체 참조 의 사용 은 일반적으로 다음으로 제한됩니다.
참조가 있는지 비교
null
.두 열거 형 값 비교 각
enum
상수 마다 하나의 객체가 있기 때문에 작동합니다 .두 개의 참조가 동일한 객체에 대한 것인지 알고 싶습니다.
"a".equals("b")
값이 같은지 비교합니다. 이 메소드는 Object
다른 모든 클래스가 파생 된 클래스에서 정의되므로 모든 클래스에 대해 자동으로 정의됩니다. 그러나 클래스가 재정의하지 않는 한 대부분의 클래스에 대해 지능적인 비교를 수행하지 않습니다. 대부분의 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
'development' 카테고리의 다른 글
node.js 파일 제거 (0) | 2020.02.11 |
---|---|
Multimarkdown에서 명명 된 앵커에 연결하는 방법은 무엇입니까? (0) | 2020.02.11 |
텍스트에서 공백을 모두 제거하십시오 (0) | 2020.02.11 |
코드에서 TextView의 텍스트 색상을 설정하는 방법은 무엇입니까? (0) | 2020.02.11 |
ViewPager에서 손가락으로 스 와이프하여 페이징을 비활성화하지만 프로그래밍 방식으로 계속 스 와이프하는 방법은 무엇입니까? (0) | 2020.02.11 |