§ 3.3字符串
? 在 Java中,字符串被定义为一个类,无论是字
符串常量还是变量都必须要生成 String类的实例
对象,然后才能使用。
? Java中使用 String类来处理创建之后不再改变的
字符串。
? StringBuffer用来处理允许再做更改和变化的字
符串。
3.3.1 字符串的概念
? 在 Java中,用双引号括起来的字符串是字符串
常量,由 Java自动创建,并将其初始化为一个
匿名的 String对象。
? Java中的字符串都以对象的方式出现,在运行
时要为分其分配空间,创建对象。
3.3.2 String类
? 在 Java中,String类用于表示 Java中的字符串
常量。
? 注意,
? 字符常量是用单引号括起的单个字符。
? 字符串常量是用双引号括起的字符序列。
1.构造函数
? public String()
? 默认构造函数,新建一个空的字符串对象,相当于””,这时字符串长 度为 0
? public String(String original)
? 用一个已经存在的字符串常量创建一个新的 String对象,该对象内容与
给出的字符串一致。这个字符串可以是另一个 String对象,也可以是一
个用双引号括起的直接常量。
? public String(char[] value)
? 用指定的字符数组 value来创建一个字符串对象,这时字符串对象中的
内容为字符数组中的内容。
? public String(StringBuffer buffer)
? 利用一个已经存在的 StringBuffer对象来创建一个新的 String对象。
StringBuffer对象表示内容,长度可改变的字符串变量。
创建字符串
? Java中还有一种非常特殊而常用的创建 String对
象的方法,即直接利用双引号括起来的字符串为
新建的 String对象赋值,
? String strCountry="China";
? 创建如下所示 String对象
public class StringConstructors{
public static void main(String[] args){
String s1 = new String (); //s1的值为空
//s2的值为 Java
String s2 = new String ("Java");
char[] country={'c','h','i','n','a'};
//s3的值为 china
String s3 = new String (country );
String s4 = new String(new
StringBuffer("Hello"));//s4的值为 Hello
System.out.println("s1="+s1);
System.out.println("s1="+s2);
System.out.println("s1="+s3);
System.out.println("s1="+s4);
}
}
2,String类的 length,charAt和
getChars方法
? public int length();
? 确定字符串的的长度。用它可以获得当前字符串对象中字符的个数。
? public char charAt(int index)
? 获取字符串某一指定位置的字符。用它可以取出字符
串中指定位置的字符 。
? public void getChars(int srcBegin,int srcEnd,char[]
dst,int dstBegin)
? getChars方法将一个字符串的多个字符复制到一个字
符数组中。
3.字符串比较
? public boolean equals(Object anObject)
? public boolean equalsIgnoreCase(String
anotherString) //忽略大小写
? 比较字符串是否与指定的对象相等,只有当给
定的参数非空且与字符串的长度和内容完全一
致,才返回 true,否则返回 false,equals方法
只能得知两个字符串是否相等,而无法得知两
者之间的大小关系。
? public int compareTo(String anotherString)
? public int compareToIgnoreCase(String str) //
忽略大小写
? 按字典顺序比较两个字符串的大小,如果给定
的参数字符串等于该字符串,则返回 0 ;如果
该字符串按字典顺序小于参数字符串则返回值
小于 0 ;如果该字符串按词典顺序大于参数字
符串则返回值大于 0 。
? 注意,
? 对字符串的比较,还有等于运算符(==)可
以使用 。
? 在进行对象的比较时,要特别注意比较的是对
象的值,还是对象本身,如果要判定对象的值
是否相等,要使用 equals或者 compareTo方法,
如果是判定两个对象是否是指向内存中的同一
个对象,则需要使用等于运算符。
? 例如:定义两个字符串对象 s1和 s2,它们被赋
给了相同的值 10,分别对两个对象和对象的值
进行比较,其输出结果如图所示。(代码附后)
public class EqualString{
public static void main(String[] args){
String s1,s2;
s1=new String("10");
s2=new String("10");
//对象的比较
if(s1==s2){
System.out.println("S1和 S2表示同一个对象 ");
}else{
System.out.println("S1和 S2表示二个不同的对象 ");
}
//对象的值的比较
if(s1.equals(s2)){
System.out.println("S1和 S2的值相等 ");
}else{
System.out.println("S1和 S2的值不等 ");
}
}
}
4.检索字符串
? public int indexOf(int ch)
? indexOf方法查找给定字符 ch在字符串中第一次
出现的位置。如果 indexOf方法找到该字符,则
返回该字符在字符串中的位置;否则返回 -1。
? public int indexOf(int ch,int fromIndex)
? 功能与 indexOf带一个参数的版本相同,其第二
个参数为在字符串中开始查找的位置。
? public int lastIndexOf(int ch)
? lastIndexOf方法查找给定字符 ch在字符串中最
后一次出现的位置,如果 indexOf方法找到该字
符,则返回该字符在字符串中的位置;否则返
回 -1。
? public int lastIndexOf(int ch,int fromIndex)
? 功能与 lastIndexOf带一个参数的版本相同,其
第二个参数为在字符串中开始查找的位置。
? 对子串的搜索方法与搜索单个字符的方法完全
相同,只是将更改了参数的类型
? public int indexOf(String str)
? public int indexOf(String str,int fromIndex)
? public int lastIndexOf(String str)
? public int lastIndexOf(String str,int fromIndex)
5.提取子串
? public String substring(int beginIndex)
? 从指定的位置 beginIndex开始复制字符串中的
字符,直到字符串的末尾。
? public String substring(int beginIndex,int
endIndex)
? 从指定的位置 beginIndex开始复制字符串中的
字符,直到 endIndex指定的位置为止。
6,String类的 valueOf方法
? public static String valueOf(boolean b)//布尔型
? public static String valueOf(char c) //字符型
? public static String valueOf(int i) //整型
? public static String valueOf(long l) //长整型
? public static String valueOf(float f) //浮点型
? public static String valueOf(double d) //双精度型
? public static String valueOf(char[] data) //字符数组
? public static String valueOf(Object obj) //Object类型
public class ConvertToString {
public static void main(String[] args){
char[] chArr={'C','h','i','n','a'};
boolean bValue=true;
char chValue='a';
int iValue=177;
long lValue=100000000L;
float fValue=2.5f;
double dValue=66.666;
Object obj="Hello world";
//字符数组类型的转换
System.out.println("字符数组 ="+String.valueOf(chArr));
//布尔型的转换
System.out.println("布尔型 ="+String.valueOf(bValue));
//字符型的转换
System.out.println("字符型 ="+String.valueOf(chValue));
//整型的转换
System.out.println("整型 ="+String.valueOf(iValue));
//长整型的转换
System.out.println("长整型 ="+String.valueOf(lValue));
//浮点型的转换
System.out.println("浮点型 ="+String.valueOf(fValue));
//双精度型的转换
System.out.println("双精度型 ="+String.valueOf(dValue));
//"Object型的转换
System.out.println("Object型 ="+String.valueOf(obj));
}
}
? 代码中演示了如何将基本类型的数据转换成
String对象,程序的运行结果如图 3.3.3所示。
7,String类的其他方法
? public String concat(String str)
? public String replace(char oldChar,char
newChar)
? public String toLowerCase()
? public String toUpperCase()
? public String trim()
3.3.3 StringBuffer类
? StringBuffer类具有创建和动态操作字符串的特
性,即可修改的字符串。
? 每个 StringBuffer对象都能够存储由其容量指定
的字符。如果超出了 StringBuffer对象的容量,
则容量就会自动的扩大,以容纳多出的字符。
? StringBuffer类也支持字符串的( =)和( +=)
运算符。
1.构造函数
? public StringBuffer()
? 默认的构造函数,创建一个不包含字符、且初始容量为 16
个字符( StringBuffer对象的默认容量)的 StringBuffer对象。
? public StringBuffer(int capacity)
? 创建一个不包含字符,初始容量由参数 capacity指定的
StringBuffer对象
? public StringBuffer(String str)
? 创建一个 StringBuffer对象,该对象包含参数 str中的字符,
且初始容量为参数 str中的字符数目加上 16的和。
2,StringBuffer类的 length,capacity、
setLength,ensureCapacity方法
? StringBuffer类提供 length和 capacity方法,分别
返回 StringBuffer对象的当前字符数目,以及在
不需要另外分配内存的情况下,StringBuffer对
象可以存储的字符数目。
? ensureCapccity方法允许开发人员能够指定
StringBuffer对象的最小容量。
? setLength方法使开发人员可以增加或减少
StringBuffer对象的长度。
3,StringBuffer类的 charAt、
setCharAt方法
? StringBuffer类提供 charAt,setCharAt、
getChars和 reverse方法,用于操作 StringBuffer
对象中的字符。
4,StringBuffer类的 append方法
? StringBuffer类提供 11个 append方法,以允许将
各种类型的值添加到 StringBuffer对象的 末尾 。
5,StringBuffer类的插入和删除方法
? StringBuffer类提供 10个重载的 insert方法,以
允许在 StringBuffer对象的任何位置插入各种类
型的值。
示例 3.3.1 凯撒密码
? 凯撒密码的字符加解密公式分别为,
? 密文,C = M + K mod 26
? 明文,M = C - K mod 26
? 其中,C代表密文,M代表明文,K代表移位
的数量称为密钥
精练
? 请根据练习 3.3.1中关于凯撒密码的描述和加密
程序,编写凯撒密码的解密程序。