java.lang.String - наиболее часто используемый класс в Java. Важно понимать и уметь свободно манипулировать строками.

  • Класс String
  • Строковые методы
  • Сравнение строк

Класс String

String - это встроенный в Java класс для хранения последовательности символов между двойными кавычками. Он находится в пакете java.lang, поэтому нам не нужно импортировать его, он будет импортирован автоматически для каждого класса.

public class Main {
    public static void main(String[] args) {
        String str = "apple";
        System.out.println(str); // apple
        
        str = "banana";
        System.out.println(str); // banana

        String name = new String("John");
        System.out.println(name); // John
    }
}
  • Мы можем инициализировать строку напрямую, используя оператор =, или мы можем создать, используя ключевое слово new. Первая версия будет использовать память StringPool, а вторая опция создаст объект в памяти кучи.
public class Main {
    public static void main(String[] args) {
        String str = "apple";
        System.out.println(str); // apple

        str.toUpperCase(); // original value will not get changed
        System.out.println(str); // apple
        
        str = str.toUpperCase(); // reassign new value
        System.out.println(str); // APPLE
    }
}
  • Строка - это неизменяемый класс. Это самое важное определение, которое нужно запомнить. Неизменяемость означает, что однажды созданное с некоторым значением мы не можем его изменить. Чтобы было ясно, мы можем переназначить значение ссылки (как показано в приведенном выше примере с помощью str), но исходный объект, который был создан в начале, никогда не будет изменен.
  • Строка потокобезопасна. Все неизменяемые классы являются потокобезопасными, потому что их нельзя изменить.
  • Если вы переназначаете свою строковую ссылку большое количество раз в каком-то бесконечном цикле. Вместо этого рассмотрите возможность использования StringBuilder и конвертируйте в String после цикла. Потому что каждый раз, когда вы переназначаете свою строку, вы создаете новый объект в памяти.
  • Строка - это последний класс, и мы не можем расширять последние классы.

Строковые методы

Методы, предоставляемые классом String, можно использовать для управления его значением. Большинство методов String возвращают новое значение и никогда не изменяют фактическое значение строки.

toUpperCase () и toLowerCase ()

String str = "apple";
str = str.toUpperCase(); 
// it will return new string with all upper cases
System.out.println(str); // APPLE
String name = "John Doe";
name = name.toLowerCase();
// it will return new string with all lower cases
System.out.println(name); // john doe

Метод length () возвращает количество символов в строке.

String str = "apple";
    
// .length() method returns number of characters in the string int strLength = str.length();  
System.out.println(strLength); // 5
    
str = "car "; // space is also the character  System.out.println(str.length()); // 4

Строковые индексы

Строка внутренне основана на массиве символов. Каждый символ, включая пустое пространство, имеет специальную позицию - индекс. Индекс начинается с 0. Некоторые методы используют индексы строки.

подстрока (начало) и подстрока (начало, конец)

//             012345678910  
String java = "Java is fun";    
// Using substring we can get part of the string based on indexes
String javaFun = java.substring(8);  
System.out.println(javaFun); // fun
System.out.println(java); // Java is fun
//            0123456789  
String str = "SoftSkills";  
str = str.substring(4);   
System.out.println(str); // Skills
    
str = "my workspace";  
str = str.substring(7);  
System.out.println(str); // space
    
//             0123456789     
String str1 = "SoftSkills";    
str1 = str1.substring(0, 4);     
System.out.println(str1); // Soft
                                       
String str2 = "Java is Cool!"; 
str2 = str2.substring(5, 7);  
System.out.println(str2); // is
    
//             012345678  
String str3 = "workspace"; 
str3 = str3.substring(0, 4);   
System.out.println(str3); // work

indexOf используется для получения индекса определенной строки или символа

//            01234567  
String str = "applpepp";  
int index = str.indexOf("e");  
System.out.println(index); // 4
System.out.println(str.indexOf("l")); // 3  System.out.println(str.indexOf("p")); // 1  System.out.println(str.lastIndexOf("p")); // 7 looking from back

charAt (index) используется для получения определенного символа по индексу.

//            0123  
String str = "home";  
char ch = str.charAt(1);  
System.out.println(ch); // o  
  
//     012345  
str = "Public";  
char ch2 = str.charAt(5);  
System.out.println(ch2); // c
   
//     0123456  
str = "Pricing";  
System.out.println(str.charAt(6)); // g

replace (oldChar, newChar) используется для замены старого символа на новый символ в строке, и он вернет измененную строку.

String city = "Alma-Ata"; 
System.out.println(city); // Alma-Ata    
city = city.replace("-", " ");  
System.out.println(city); // Alma Ata
String word = "Hello, World!";  
word = word.replace("Hello", "Aloha");  
System.out.println(word); // Aloha, World!

split (str) мы можем разделить нашу строку и получить массив строк как части.

String str = "My name is John Doe";
String[] parts = str.split(" ");
for (String part : parts) {
   System.out.println(part);
} 

Вывод:

My
name
is
John
Doe

contains (str) проверяет, содержит ли одна строка другую. Тип возврата - логический.

String topic = "Variables, assignment operator, arithmetic operator, input from terminal";
  
boolean isThere = topic.contains("input"); 
System.out.println(isThere); // true
System.out.println(topic.contains("java")); // false  System.out.println(topic.contains("terminal")); // true

Сравнение строк

Чтобы сравнить две строки на равенство, нам нужно использовать метод equals. Никогда не используйте оператор == для сравнения строк. Похоже, что это оператор ==, сравнивающий фактическое содержимое из-за пула строк, но он проверяет, указывают ли две ссылки на объект или нет.

Пул строк - это память, которую String использует для повторного использования одних и тех же данных. Когда мы создаем строку как String name = "Alex";, она будет сохранена в пуле строк. Существует механизм, который проверяет перед созданием новой строки, имеет ли пул sting уже такое же значение, и если да, он будет использовать его повторно. Это безопасно, потому что String неизменяем.

String str = "hello";
String str1 = "hello";
System.out.println(str == str1); // true
System.out.println(str.equals(str1)); // true

  • Когда мы создали str, в пуле строк вообще нет строковых объектов, поэтому будет создан новый строковый объект с "hello" значением.
  • Когда мы создали str1, в пуле строк уже есть один строковый объект с таким же значением. Он просто повторно использует тот же объект и заставляет str1 указывать на него. По этой причине == возвращает истину - обе ссылки указывают на один и тот же объект.
  • equals() сравнить фактическое значение строки.
String str = new String("hello");
String str1 = new String("hello");
System.out.println(str == str1); // false
System.out.println(str.equals(str1)); // true

  • если мы создадим строку с ключевым словом new, она не будет использовать пул строк, и будут созданы два отдельных объекта. Вот почему у нас ложь при использовании оператора ==.
  • equals() сравнить фактическое значение строки.

Это все, что у меня есть на сегодня. Спасибо!

This article is part of the series of articles to learn Java programming language from Tech Lead Academy:
1. Introduction to programming 
2. OS, File, and File System
3. Working with terminal 
4. Welcome to Java Programming Language
5. Variables and Primitives in Java
6. Methods with Java
7. Java Math Operators and special operators
8. Conditional branching in Java
9. Switch statement in Java
10. Ternary operator in Java
11. Enum in Java
12. String class and its methods in Java
13. Loops in Java
14. Access modifiers in Java
15. Static keyword in Java
16. The final keyword in Java
17. Class and Object in Java
18. Object Oriented Programming in Java
19. OOP: Encapsulation in Java
20. Inheritance in Java
21. Abstraction in Java
22. Polymorphism in Java
23. Overriding vs Overloading in Java
24. OOP Design Principles in Java
25. Array in Java
26. Data Structures with Java
27. Collection framework in Java
28. ArrayList in Java
29. Set in Java
30. Map in Java
31. LocalDate in Java
32. Exception in Java
33. IO in Java
34. Design Patterns
35. Generics in Java
36. Multithreading in java
37. JUnit
38. Big O Notation for coding interviews
39. Top 17 Java coding interview questions for SDET