Why is this code returning \"false\" instead of \"true\":
package com.company;
public class Main {
public static void main(String[] args) {
S
String literals are interned. When you create a string through any method that isn't a literal (calling new String()
, reading from input, concatenation, etc) it will not be automatically interned. When you called String firstNamePlusLastName = name + lastName;
You concatenated name
and lastName
creating a new string. This is not a literal and you didn't call intern
so this string is not added to the string pool.
Because you must use .equals()
to strings
fullName.equals(firstNamePlusLastName)
==
tests for reference equality (whether they are the same object), meaning exactly the same, the same reference even.
.equals()
refers to the equals implementation of an object, it means, for string, if they has the same chars in the same order.
Consider this:
String a = new String("a");
String anotherA = new String("a");
String b = a;
String c = a;
a == anotherA -> False;
b == a -> True
b == c -> true
anotherA.equals(a) -> True
String Constant Pool create at compiling-time. it only using strings from pool when you concat String literals / final variables / final fields except final parameters, for example:
String fullName = "Name Lastname";
String firstNamePlusLastName = "Name " + "Lastname";
System.out.println(fullName == firstNamePlusLastName);// true
String fullName = "Name Lastname";
final String name = "Name ";
final String lastName = "Lastname";
String firstNamePlusLastName = name + lastName;
System.out.println(fullName == firstNamePlusLastName);//true