Merkkijonojen Vertailu Javassa
Pyyhkäise näyttääksesi valikon
Vertailussa Java alkaa käyttäytyä hieman "alatasoisemmin" kuin voisi odottaa. Tuntuu itsestään selvältä, että merkkijonoja voisi verrata samalla tavalla kuin lukuja — käyttämällä ==. Loppujen lopuksi, jos kaksi merkkijonoa näyttävät täysin samoilta, miksi ne eivät olisi yhtä suuria?
Ongelma ==-operaattorissa
Jos käytät ==-operaattoria merkkijonolitteraaleille, se vaikuttaa aluksi toimivan oikein:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
Molemmat muuttujat osoittavat samaan olioon Javan sisäisessä merkkijonopoolissa — kun sama literaali esiintyy uudelleen, Java käyttää olemassa olevaa. Siksi == palauttaa true.
Muutetaan nyt hieman tapaa, jolla merkkijonot luodaan:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
Käyttämällä new String() Java luo joka kerta täysin erillisen olion — vaikka sisältö olisi identtinen. Koska == vertaa muistiosoitteita, ei tekstiä, se palauttaa false.
Tärkeä sääntö: == ei tarkista merkkijonon sisältöä — se tarkistaa, osoittavatko molemmat muuttujat täsmälleen samaan olioon muistissa.
equals() — Vertaa todellista sisältöä
Jos haluat verrata kahden merkkijonon todellista tekstiä, käytä .equals(). Se ohittaa muistin kokonaan ja keskittyy vain merkkeihin:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
Vaikka order1 ja order2 ovat erillisiä olioita muistissa, .equals() vertaa niiden sisältöä ja palauttaa arvon true.
Kirjainkoon huomioiminen equals()-metodissa
Java on kirjainkokoriippuvainen, joten yksikin ero kirjainkoossa tekee merkkijonoista eriarvoiset:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" ja "latte" käsitellään eri merkkijonoina, joten tulos on false.
equalsIgnoreCase() — Vertailu välittämättä kirjainkoosta
Kun haluat verrata merkkijonoja välittämättä isoista tai pienistä kirjaimista, käytä .equalsIgnoreCase()-metodia:
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() käsittelee "Latte" ja "LATTE" samoina ja palauttaa arvon true.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme