2 Strings
2 Strings
Motivations
Often you encounter the problems that involve string processing and file input and output. Suppose you need to write a program to replace all occurrences of a word with a new word in a file. How do you solve this problem? This chapter introduces strings and text files, which will enable you to solve this problem.
Objectives
To use the String class to process fixed strings. To use the Character class to process a single character. To use the StringBuilder/StringBuffer class to process flexible strings. To learn how to pass arguments to the main method from the command line. To discover file properties and to delete and rename files using the File class. To write data to a file using the PrintWriter class. To read data from a file using the Scanner class.
Constructing a String:
String message = "Welcome to Java;
String message = new String("Welcome to Java);
Obtaining String length and Retrieving Individual Characters in a string String Concatenation (concat) Substrings (substring(index), substring(start, end)) Comparisons (equals, compareTo) String Conversions Finding a Character or a Substring in a String Conversions between Strings and Arrays Converting Characters and Numeric Values to Strings
4
Constructing Strings
String newString = new String(stringLiteral); String message = new String("Welcome to Java");
Since strings are used frequently, Java provides a shorthand initializer for creating a string:
String message = "Welcome to Java";
5
animation
Trace Code
String s = "Java"; s = "HTML";
: String
String object for "HTML"
animation
Trace Code
String s = "Java"; s = "HTML";
: String
String object for "HTML"
Interned Strings
Since strings are immutable and are frequently used, to improve efficiency and save memory, the JVM uses a unique instance for string literals with the same character sequence. Such an instance is called interned. For example, the following statements:
Examples
String s1 = "Welcome to Java"; String s2 = new String("Welcome to Java"); String s3 = "Welcome to Java"; System.out.println("s1 == s2 is " + (s1 == s2)); s2 System.out.println("s1 == s3 is " + (s1 == s3));
s1 s3
: String
Interned string object for "Welcome to Java"
: String
A string object for "Welcome to Java"
A new object is created if you use the new operator. If you use the string initializer, no new object is created if the interned object is already created.
10
animation
Trace Code
String s1 = "Welcome to Java"; String s2 = new String("Welcome to Java"); String s3 = "Welcome to Java";
s1
: String
Interned string object for "Welcome to Java"
11
Trace Code
String s1 = "Welcome to Java"; String s2 = new String("Welcome to Java"); String s3 = "Welcome to Java";
s2 s1
: String
Interned string object for "Welcome to Java"
: String
A string object for "Welcome to Java"
12
Trace Code
String s1 = "Welcome to Java"; String s2 = new String("Welcome to Java"); String s3 = "Welcome to Java";
s2 s1 s3
: String
Interned string object for "Welcome to Java"
: String
A string object for "Welcome to Java"
13
String Comparisons
java.lang.String +equals(s1: String): boolean +equalsIgnoreCase(s1: String): boolean +compareTo(s1: String): int Returns true if this string is equal to string s1. Returns true if this string is equal to string s1 caseinsensitive. Returns an integer greater than 0, equal to 0, or less than 0 to indicate whether this string is greater than, equal to, or less than s1. Same as compareTo except that the comparison is caseinsensitive. Returns true if this string starts with the specified prefix. Returns true if this string ends with the specified suffix.
14
String Comparisons
equals
String s1 = new String("Welcome); String s2 = "welcome";
if (s1.equals(s2)){
// s1 and s2 have the same contents
if (s1 == s2) {
// s1 and s2 have the same reference
}
15
compareTo(Object object) String s1 = new String("Welcome); String s2 = "welcome"; if (s1.compareTo(s2) > 0) { // s1 is greater than s2 } else if (s1.compareTo(s2) == 0) { // s1 and s2 have the same contents } else // s1 is less than s2
16
17
18
Use
Index
Indices message 0 W
starts from 0
1 e 2 l 3 c 4 o 5 m 6 e 7 8 t 9 o 10 11 12 13 14 J a v a
message.charAt(0)
message.length() is 15
message.charAt(14)
19
String Concatenation
String s3 = s1.concat(s2);
20
Extracting Substrings
java.lang.String +subString(beginIndex: int): Returns this strings substring that begins with the character at the specified beginIndex and extends to the end of the string String . +subString(beginIndex: int, Returns this strings substring that begins at the specified endIndex: int): String beginIndex and extends to the character at index endIndex 1. Note that the character at endIndex is not part of the substring.
21
Extracting Substrings
You can extract a single character from a string using the charAt method. You can also extract a substring from a string using the substring method in the String class.
String s1 = "Welcome to Java"; String s2 = s1.substring(0, 11) + "HTML";
Indices message
0 W
1 e
2 l
3 c
4 o
5 m
6 e
8 t
9 o
10 11 12 13 14 J a v a
message.substring(0, 11)
message.substring(11)
22
+replaceFirst(oldString: String, Returns a new string that replaces the first matching substring in newString: String): String this string with the new substring. +replaceAll(oldString: String, Returns a new string that replace all matching substrings in this newString: String): String string with the new substring. +split(delimiter: String): Returns an array of strings consisting of the substrings split by the String[] delimiter.
23
Examples
"Welcome".toLowerCase() returns a new string, welcome. "Welcome".toUpperCase() returns a new string, WELCOME. " Welcome ".trim() returns a new string, Welcome. "Welcome".replace('e', 'A') returns a new string, WAlcomA. "Welcome".replaceFirst("e", "AB") returns a new string, WABlcome. "Welcome".replace("e", "AB") returns a new string, WABlcomAB. "Welcome".replace("el", "AB") returns a new string, WABlcome.
24
Splitting a String
String[] tokens = "Java#HTML#Perl".split("#", 0); for (int i = 0; i < tokens.length; i++) System.out.print(tokens[i] + " ");
25
String s = "a+b$#c".replaceAll("[$+#]", "NNN"); System.out.println(s); Here the regular expression [$+#] specifies a pattern that matches $, +, or #. So, the output is aNNNbNNNNNNc.
27
28
+indexOf(ch: char, fromIndex: Returns the index of the first occurrence of ch after fromIndex in int): int the string. Returns -1 if not matched. +indexOf(s: String): int Returns the index of the first occurrence of string s in this string. Returns -1 if not matched. +lastIndexOf(ch: int): int Returns the index of the last occurrence of ch in the string. Returns -1 if not matched. +lastIndexOf(s: String): int Returns the index of the last occurrence of string s. Returns -1 if not matched.
29
30
Checking whether a string is a palindrome: a string that reads the same forward and backward.
CheckPalindrome Run
32
+equals(anotherCharacter: Character): boolean Returns true if this character equals to another +isDigit(ch: char): boolean Returns true if the specified character is a digit +isLetter(ch: char): boolean +isLetterOrDigit(ch: char): boolean +isLowerCase(ch: char): boolean +isUpperCase(ch: char): boolean +toLowerCase(ch: char): char +toUpperCase(ch: char): char Returns true if the specified character is a letter Returns true if the character is a letter or a digit Returns true if the character is a lowercase letter Returns true if the character is an uppercase letter Returns the lowercase of the specified character Returns the uppercase of the specified character
33
Examples
Character charObject = new Character('b'); charObject.compareTo(new Character('a')) returns 1 charObject.compareTo(new Character('b')) returns 0 charObject.compareTo(new Character('c')) returns -1 charObject.compareTo(new Character('d') returns 2 charObject.equals(new Character('b')) returns true charObject.equals(new Character('d')) returns false
34
CountEachLetter
Run
35
36
StringBuilder Constructors
java.lang.StringBuilder
+StringBuilder() +StringBuilder(capacity: int) +StringBuilder(s: String) Constructs an empty string builder with capacity 16. Constructs a string builder with the specified capacity. Constructs a string builder with the specified string.
37
38
Examples
stringBuilder.append("Java"); stringBuilder.insert(11, "HTML and "); stringBuilder.delete(8, 11) changes the builder to Welcome Java. stringBuilder.deleteCharAt(8) changes the builder to Welcome o Java. stringBuilder.reverse() changes the builder to avaJ ot emocleW. stringBuilder.replace(11, 15, "HTML") changes the builder to Welcome to HTML. stringBuilder.setCharAt(0, 'w') sets the builder to welcome to Java.
39
40
41
Command-Line Parameters
class TestMain { public static void main(String[] args) { ... } } java TestMain arg0 arg1 arg2 ... argn
42
43
Problem: Calculator
Objective:
Write a program that will perform binary operations on integers. The program receives three parameters: an operator and two integers.
java Calculator 2 + 3
Calculator
Run
java Calculator 2 - 3
java Calculator 2 / 3 java Calculator 2 * 3
44
45
+File(parent: String, child: String) Creates a File object for the child under the directory parent. child may be a filename or a subdirectory. +File(parent: File, child: String) Creates a File object for the child under the directory parent. parent is a File object. In the preceding constructor, the parent is a string. +exists(): boolean Returns true if the file or the directory represented by the File object exists. +canRead(): boolean +canWrite(): boolean +isDirectory(): boolean +isFile(): boolean +getAbsolutePath(): String +getName(): String Returns true if the file represented by the File object exists and can be read. Returns true if the file represented by the File object exists and can be written. Returns true if the File object represents a directory. Returns true if the File object represents a file. Returns the complete absolute file or directory name represented by the File object. Returns the last name of the complete directory and file name represented by the File object. For example, new File("c:\\book\\test.dat").getName() returns test.dat. Returns the complete directory and file name represented by the File object. For example, new File("c:\\book\\test.dat").getPath() returns c:\book\test.dat. Deletes this file. The method returns true if the deletion succeeds. Renames this file. The method returns true if the operation succeeds.
46
TestFileClass
Run
47
Text I/O
A File object encapsulates the properties of a file or a path, but does not contain the methods for reading/writing data from/to a file. In order to perform I/O, you need to create objects using appropriate Java I/O classes. The objects contain the methods for reading/writing data from/to a file. This section introduces how to read/write strings and numeric values from/to a text file using the Scanner and PrintWriter classes.
48
WriteData
Run
49
ReadData
Run
50
replaces all the occurrences of StringBuilder by StringBuffer in FormatString.java and saves the new file in t.txt.
ReplaceText
Run
51
ReadFileUsingJFileChooser
Run
52