4.2. Strings and CharactersStrings of text are a fundamental and commonly used data type. In Java, however, strings are not a primitive type, like char, int, and float. Instead, strings are represented by the java.lang.String class, which defines many useful methods for manipulating strings. String are immutable : once a String object has been created, there is no way to modify the string of text it represents. Thus, each method that operates on a string typically returns a new String object that holds the modified string. This code shows some of the basic operations you can perform on strings: // Creating strings String s = "Now"; // String objects have a special literal syntax String t = s + " is the time."; // Concatenate strings with + operator String t1 = s + " " + 23.4; // + converts other values to strings t1 = String.valueOf('c'); // Get string corresponding to char value t1 = String.valueOf(42); // Get string version of integer or any value t1 = Object.toString(); // Convert objects to strings with toString() // String length int len = t.length(); // Number of characters in the string: 16 // Substrings of a string String sub = t.substring(4); // Returns char 4 to end: "is the time." sub = t.substring(4, 6); // Returns chars 4 and 5: "is" sub = t.substring(0, 3); // Returns chars 0 through 2: "Now" sub = t.substring(x, y); // Returns chars between pos x and y-1 int numchars = sub.length(); // Length of substring is always (y-x) // Extracting characters from a string char c = t.charAt(2); // Get the 3rd character of t: w char[] ca = t.toCharArray(); // Convert string to an array of characters t.getChars(0, 3, ca, 1); // Put 1st 4 chars of s into ca at position 2 // Case conversion String caps = t.toUpperCase(); // Convert to uppercase String lower = t.toLowerCase(); // Convert to lowercase // Comparing strings boolean b1 = t.equals("hello"); // Returns false: strings not equal boolean b2 = t.equalsIgnoreCase(caps); // Case-insensitive compare: true boolean b3 = t.startsWith("Now"); // Returns true boolean b4 = t.endsWith("time."); // Returns true int r1 = s.compareTo("Pow"); // Returns < 0: s comes before "Pow" int r2 = s.compareTo("Now"); // Returns 0: strings are equal int r3 = s.compareTo("Mow"); // Returns > 0: s comes after "Mow" r1 = s.compareToIgnoreCase("pow"); // Returns < 0 (Java 1.2 and later) // Searching for characters and substrings int pos = t.indexOf('i'); // Position of first 'i': 4 pos = t.indexOf('i', pos+1); // Position of the next 'i': 12 pos = t.indexOf('i', pos+1); // No more 'i's in string, returns -1 pos = t.lastIndexOf('i'); // Position of last 'i' in string: 12 pos = t.lastIndexOf('i', pos-1); // Search backwards for 'i' from char 11 pos = t.indexOf("is"); // Search for substring: returns 4 pos = t.indexOf("is", pos+1); // Only appears once: returns -1 pos = t.lastIndexOf("the "); // Search backwards for a string String noun = t.substring(pos+4); // Extract word following "the" // Replace all instances of one character with another character String exclaim = t.replace('.', '!'); // Only works with chars, not substrings // Strip blank space off the beginning and end of a string String noextraspaces = t.trim(); // Obtain unique instances of strings with intern() String s1 = s.intern(); // Returns s1 equal to s String s2 = "Now".intern(); // Returns s2 equal to "Now" boolean equals = (s1 == s2); // Now can test for equality with ==
Since String objects are immutable, you cannot manipulate the characters of a String in place. If you need to do this, use a java.lang.StringBuffer instead: // Create a string buffer from a string StringBuffer b = new StringBuffer("Mow"); // Get and set individual characters of the StringBuffer char c = b.charAt(0); // Returns 'M': just like String.charAt() b.setCharAt(0, 'N'); // b holds "Now": can't do that with a String! // Append to a StringBuffer b.append(' '); // Append a character b.append("is the time."); // Append a string b.append(23); // Append an integer or any other value // Insert Strings or other values into a StringBuffer b.insert(6, "n't"); // b now holds: "Now isn't the time.23" // Replace a range of characters with a string (Java 1.2 and later) b.replace(4, 9, "is"); // Back to "Now is the time.23" // Delete characters b.delete(16, 18); // Delete a range: "Now is the time" b.deleteCharAt(2); // Delete 2nd character: "No is the time" b.setLength(5); // Truncate by setting the length: "No is" // Other useful operations b.reverse(); // Reverse characters: "si oN" String s = b.toString(); // Convert back to an immutable string s = b.substring(1,2); // Or take a substring: "i" b.setLength(0); // Erase buffer; now it is ready for reuse
In addition to the String and StringBuffer classes, there are a number of other Java classes that operate on strings. One notable class is java.util.StringTokenizer, which you can use to break a string of text into its component words: String s = "Now is the time"; java.util.StringTokenizer st = new java.util.StringTokenizer(s); while(st.hasMoreTokens()) { System.out.println(st.nextToken()); } You can even use this class to tokenize words that are delimited by characters other than spaces: String s = "a:b:c:d"; java.util.StringTokenizer st = new java.util.StringTokenizer(s, ":");
As you know, individual characters are represented in Java by the primitive char type. The Java platform also defines a Character class, which defines useful class methods for checking the type of a character and converting the case of a character. For example: char[] text; // An array of characters, initialized somewhere else int p = 0; // Our current position in the array of characters // Skip leading whitespace while((p < text.length) && Character.isWhitespace(text[p])) p++; // Capitalize the first word of text while((p < text.length) && Character.isLetter(text[p])) { text[p] = Character.toUpperCase(text[p]); p++; }
The compareTo() and equals() methods of the String class allow you to compare strings. compareTo() bases its comparison on the character order defined by the Unicode encoding, while equals() defines string equality as strict character-by-character equality. These are not always the right methods to use, however. In some languages, the character ordering imposed by the Unicode standard does not match the dictionary ordering used when alphabetizing strings. In Spanish, for example, the letters "ch" are considered a single letter that comes after "c" and before "d." When comparing human-readable strings in an internationalized application, you should use the java.text.Collator class instead: import java.text.*; // Compare two strings; results depend on where the program is run // Return values of Collator.compare() have same meanings as String.compareTo() Collator c = Collator.getInstance(); // Get Collator for current locale int result = c.compare("chica", "coche"); // Use it to compare two strings Copyright © 2001 O'Reilly & Associates. All rights reserved. |
|