You are on page 1of 31

Characters, Strings and the String Buffer

Identifying problems that can occur when you manipulate string data
String is not a simple data type like int, float, or double String creates an instance of a class, the class String As such it contains a reference or an address and not the actual string So you cannot do equality comparisons of two different instances of String, because you are simply testing if the addresses are the same

An example of incorrect code


import javax.swing.JOptionPane; public class TryToCompareStrings { public static void main(String[] args) { String aName = "Carmen"; String anotherName; anotherName = JOptionPane.showInputDialog(null, "Enter your name"); if(aName == anotherName) JOptionPane.showMessageDialog(null, aName + " equals " + anotherName); else JOptionPane.showMessageDialog(null, aName + " does not equal " + anotherName); System.exit(0); } }

Correct Code

import javax.swing.JOptionPane; public class CompareStrings { public static void main(String[] args) { String aName = "Carmen"; String anotherName; anotherName = JOptionPane.showInputDialog(null, "Enter your name"); if(aName.equals(anotherName)) JOptionPane.showMessageDialog(null, aName + " equals " + anotherName); else JOptionPane.showMessageDialog(null, aName + " does not equal " + anotherName); System.exit(0); } }

Three classes for working with strings

Charactera class whose instances can hold a single character valueprovides methods that can manipulate or inspect single-character data Stringa class for working with fixed-string datathat is unchanging data composed of multiple characters, strings that are immutable StringBuffera class for storing and manipulating changeable data composed of mulltiple characters

Manipulating Characters
We know the char data type can hold any single character Character class provides the following methods

isUpperCase(), toUpperCase(), isLowerCase(), toLowerCase(), isDigit(), isLetter(), isLetterOrDigit(), isWhitespace() Methods that begin with is perform tests delivering true or false values Methods that begin with to perform conversions

Declaring a String Object

We know that characters enclosed within double quotation marks are literal strings Weve learned to print these strings using println() and showMessageDialog() An literal string is an unnamed object, or anonymous object, of the String class A String variable is simply a named object of the same class.

The class String is defined in java.lang.String, which is automatically imported into every program you write

Declaring a String variable


When you declare a String variable, the String itselfthat is, the series of characters contained in the Stringis distinct from the variable you use to refer to it. Can initialize a String variable with or without a String constructor

With or without a String Constructor


With the constructor String aGreeting = new String(Hello);

Without the constructor String aGreeting = Hello;


Unlike other classes, you can create a String object without using the keyword new or explicitly calling the class constructor

Comparing String Values


Consider the following two statements: String aGreeting = hello; aGreeting = Bonjour; These statements are syntactically correct. What happens is that the address contained in aGreeting is changed to point to Bonjour rather than hello, both of which are contained at different locations in memory. Eventually, the garbage collector discards the hello characters.

Comparing String Values


The String class provides methods for comparing strings In the example above the == sign is comparing memory addresses, not the actual strings. The String class equals() method evaluates the contents of two String objects to determine if they are equivalent.

Import javax.swing.JOptionPane; Public class CompareStrings { public static void main(String[] args) { String aName = Carmen, anotherName; anotherName = JOptionPane. showInputDialog(null, Enter your name); if(aName.equals(anotherName)) JOptionPane.showMessageDialog(null, aName + equals + anotherName); else JOptionPane.showMessageDialog(null, aName + does not equal + anotherName)); System.exit(0); }

The equals() method

From the code above, we can see that the equals() method returns a Boolean value of true or false

equalsIgnoreCase() Method
Similar to the equals() method Ignores case String aName = Roger; If(aName.equalsIgnoreCase(roGER)) evaluates to true

compareTo() method
Returns an integer that is the numeric difference between the first two nonmatching characters

Using other String Methods


toUpperCase() and toLowerCase() convert any String to its uppercase and lowercase equivalent Length() returns the length of a String

import javax.swing.*; public class BusinessLetter { public static void main(String[] args) { String name; String firstName = ""; String familyName = ""; int x; char c; name = JOptionPane.showInputDialog(null, "Please enter customer's first and last name"); x = 0; while(x < name.length()) { if(name.charAt(x) == ' ') { firstName = name.substring(0, x); familyName = name.substring(x + 1, name.length()); x = name.length(); } ++x; } JOptionPane.showMessageDialog(null, "Dear " + firstName + ",\nI am so glad we are on a first name basis" + "\nbecause I would like the opportunity to" + "\ntalk to you about an affordable insurance" + "\nprotection plan for the entire " + familyName + "\nfamily. Call A-One Family Insurance today" + "\nat 1-800-555-9287."); System.exit(0); } }

x = 0; while(x < name.length()) { if(name.charAt(x) == ' ') { firstName = name.substring(0, x); familyName = name.substring(x + 1, name.length()); x = name.length(); } ++x; }

Concatenation

You know you can concatenate strings to strings as in System.out.println(firstName + + lastName);

Concatenationnumbers to strings by using +


The following is permissible: Int myAge = 25; String aString = My age is + myAge; Another example would be String anotherString; float someFloat = 12.34f; anotherString = + someFloat;

Concatenation by using the toString() method


String theString; Int someInt = 10; theString = Integer.toString(someInt); String aString; double someDouble = 8.25; aString = Double.toString(someDouble);

Converting Strings to Numbers


Use a wrapper like the Integer class which is a part of java.lang A wrapper is a class that is wrapped around a simpler element Int anInt = Integer.parseInt(649) stores the value 649 in the variable anInt

public class TestCharacter { public static void main(String[] args) { char aChar = 'C'; System.out.println("The character is " + aChar); if(Character.isUpperCase(aChar)) System.out.println(aChar + " is uppercase"); else System.out.println(aChar + " is not uppercase"); if(Character.isLowerCase(aChar)) System.out.println(aChar + " is lowercase"); else System.out.println(aChar + " is not lowercase"); aChar = Character.toLowerCase(aChar); System.out.println("After toLowerCase(), aChar is " + aChar); aChar = Character.toUpperCase(aChar); System.out.println("After toUpperCase(), aChar is " + aChar); if(Character.isLetterOrDigit(aChar)) System.out.println(aChar + " is a letter or digit"); else System.out.println(aChar + " is neither a letter nor a digit"); if(Character.isWhitespace(aChar)) System.out.println(aChar + " is whitespace"); else System.out.println(aChar + " is not whitespace"); } }

//see next slide

Test Character App


public class TestCharacter { public static void main(String[] args) { char aChar = 'C'; System.out.println("The character is " + aChar); if(Character.isUpperCase(aChar)) System.out.println(aChar + " is uppercase"); else System.out.println(aChar + " is not uppercase"); if(Character.isLowerCase(aChar)) System.out.println(aChar + " is lowercase"); else

System.out.println(aChar + " is not lowercase"); aChar = Character.toLowerCase(aChar); System.out.println("After toLowerCase(), aChar is " + aChar); aChar = Character.toUpperCase(aChar); System.out.println("After toUpperCase(), aChar is " + aChar); if(Character.isLetterOrDigit(aChar)) System.out.println(aChar + " is a letter or digit"); else System.out.println(aChar + " is neither a letter nor a digit"); if(Character.isWhitespace(aChar)) System.out.println(aChar + " is whitespace"); else System.out.println(aChar + " is not whitespace"); } }

Learning about the StringBuffer Class


Some strings are not constants, not immutable String someChars = Goodbye; someChars = Goodbye Everybody; someChars = Goodbye + Everybody; You cannot change the string Goodbye To overcome these limitations, you can use the StringBuffer class The StringBuffer class was invented to accommodate strings that are not immutable (constants)

The StringBuffer Class


Uses a buffer that is much larger than any one string; actual size of the buffer is the capacity Provides methods that can change individual characters within a string Must initialize StringBuffer objects as follows:

StringBuffer eventString = new StringBuffer(Hello there); Cannot use StringBuffer eventString = Hello there;

Methods in the StringBuffer Class


setLength() will change the length of a String in a StringBuffer object capacity() will find the capacity of an object Has four constructors:

public StringBuffer() constructs a StringBuffer with no characters and a default size of 16 characters public StringBuffer(int Capacity) creates a StringBuffer with no characters and a capacity defined by the parameter public StringBuffer(String s) contains the same characters as those stored in the String object s

Still more methods in the StringBuffer Class


Append() lets you add characters to the end of a StringBuffer object Insert() lets you add characters at a specific location within a StringBuffer object

StringBuffer someBuffer = new StringBuffer(Happy Birthday); someBuffer.insert(6,30th ); Produces Happy 30th Birthday

Still more methods in StringBuffer

setCharAt() method allows you to change a single character at a specified location


someBuffer.setCharAt(6,4); Changes someBuffer to Happy 40th Birthday

Can use charAt() method will return the character at an offset number of positions from the first character

StringBuffer text = new StringBuffer(Java Programming); Then text.charAt(5) returns the character P.

package Strings; import javax.swing.*; public class RepairName {

/** * @param args */ public static void main(String[] args) { String name, saveOriginalName; int stringLength; int i; char c; name = JOptionPane.showInputDialog(null, "Please enter your first and last name"); saveOriginalName = name; stringLength = name.length(); for (i=0; i < stringLength; i++) { c = name.charAt(i); if(i==0) { c = Character.toUpperCase(c); name = c + name.substring(1, stringLength); } else if(name.charAt(i) == ' ') { ++i; c = name.charAt(i); c = Character.toUpperCase(c); name = name.substring(0, i) + c + name.substring(i + 1, stringLength); } } JOptionPane.showMessageDialog(null, "Original name was " + saveOriginalName + "\nRepaired name is " + name); System.exit(0); } // TODO Auto-generated method stub
}