---
title: "How do I compare strings in Java?"  
description: "How do I compare strings in Java?"  
author: "Samuel Fernandes"  
published: 2015-05-12  
updated: 2015-05-12  
canonical: https://www.mindstick.com/forum/23214/how-do-i-compare-strings-in-java  
category: "java"  
tags: ["java", "string"]  
reading_time: 2 minutes  

---

# How do I compare strings in Java?

I've been using the == [operator](https://www.mindstick.com/blog/144/union-intersection-and-except-operator-in-sql-server) in my [program](https://www.mindstick.com/blog/12337/scaling-up-your-mentorship-program) to [compare](https://www.mindstick.com/forum/2036/propertyinfo-getvalue-unable-to-compare-datetimes) all my [strings](https://www.mindstick.com/forum/161912/explain-the-python-strings) so far. However, I ran into a bug, changed [one of them](https://answers.mindstick.com/qa/47593/what-are-the-prevalent-water-proofing-systems-write-a-short-notes-on-any-one-of-them) into .equals() instead, and it fixed the bug.\
Is == bad? When should it and should it not be used? What's the [difference](https://www.mindstick.com/articles/157114/good-news-or-bad-news-and-the-difference-is)?

## Replies

### Reply by Anonymous User

**==** tests for ***reference equality***.\
**.equals()** tests for ***value equality***.\
Consequently, if you actually want to test whether two strings have the same value you should use .equals().\
There are however a few situations where you can guarantee that two strings with the same value will be represented by the same object because of String interning. Those cases are specified by the Java Language Specification.\
== is for testing whether two strings are the same object.

```
// These two have the same valuenew String("test").equals("test") // --> true // ... but they are not the same objectnew String("test") == "test" // --> false // ... neither are thesenew 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,// also resulting in the same object"test" == "te" + "st" // --> true// but .substring() is invoked at runtime, generating distinct objects"test" == "!test".substring(1) // --> false// interned strings can also be recalled by calling .intern()"test" == "!test".substring(1).intern() // --> true
```

It is important to note that == is a bit cheaper than equals() (a single reference comparison instead of a method call), thus, in situations where it is applicable (i.e. you can guarantee that you are only dealing with interned strings) it can present an important performance improvement. However, these situations are rare.


---

Original Source: https://www.mindstick.com/forum/23214/how-do-i-compare-strings-in-java

Copyright © MindStick Software Pvt. Ltd. This Markdown version is provided for developers, AI systems, and offline reading.
