14.字符串
String StringBuffer类 StringBuilder类
【练习】
1.下面这条语句一共创建了多少个对象:String s=“welcome”+“to”+“huayu”;
答:1个
答案解析:
在Java中,String对象是不可变的,所以对String类对象进行+操作,相当于是创建了一个新的String对象,而字符串常量也是一个String对象,所以这条语句中应该是创建了四个对象:"welcome "、"to "、"huayu"和"welcome to huayu"这四个字符串,但是这个问题的正确答案却是1个
2. String s = new String(“xyz”);创建了几个字符串对象?()
正确答案: 两个或一个都有可能
3.String类、StringBuffer、StringBuilder的区别?
正确答案:
- String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
- StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上synchronized。但是保证了线程安全是需要性能的代价的。
- StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
4.String有哪些方法?请写出10个常用的方法,并说出功能
正确答案:
- int length():获取字符串的长度(字符数)
- char charAt(int index):获取指定下标位置的字符
- String[] split(String regex):根据表达式来拆分字符串
- boolean startWith(String prefix):是否以某个字符串开头
- boolean endtWith(String suffix):是否以某个字符串结尾
- String subString(beginIndex,endIndex):获取子串,包含beginIndex,不包含endIndex
- String subString(beginIndex):获取子串,从beginIndex一直到结束;
- String replace(oldString,newString):将字符串中所有的oldString替换成newString;返回一个新的字符串;
- String replaceAll():
- String replaceFirst();
- int compareTo(String another):与另外一个字符串进行比较大小,如果相等,返回0,如果小于another,返回负数,否则返回一个正数
- int compareToIgnoreCase(String another):忽略大小写进行比较
- boolean contains(CharSequence s):当前串中是否包含了s,如包含,返回true,否则返回false
- int lastIndexOf(String):查找某个字符串最后一次出现的索引,如不存在,返回-1
- int indexOf(String):查找某个字符串第一次出现的索引,如不存在,返回-1
- String toLowerCase():返回一个新串,将原串的所有字符转成小写
- String toUpperCase():返回一个新串,将原串的所有字符转成大写
- String trim():返回去掉前后的空格后的新串
- static String valueOf(Object):将其它类型转成String
- boolean equals(Object):与某个对象进行比较,如果内容相同,返回true,否则返回false
- boolean equalsIgnoreCase(Object):忽略大小写,比较内容是否相同;
【编程题】
5.定义一个方法,求出字符串中有多少种字符,以及每个字符的个数
static void printCharInfo(String str)
例如有字符串 str="apple is a apple.";
结果应该是 a:3 p:4 l:2 e:2 :3 i:1 s:1 .:1(换行了的)
public class Test6 {
static void printCharInfo(String str) {
char[] a = new char[100];
int[] b = new int[100];
char[] ch = str.toCharArray();
int index = 0;
for(int i = 0;i<str.length();i++) {
if(i!=0)
for(int j =0;j<index;j++) {
if(a[j]==ch[i]) {
b[j]++;
break;
}else if(j==index-1) {
a[index++]=ch[i];
b[index-1]=1;
break;
}
}
else {
a[index++]=ch[i];
b[index-1]=1;
}
}
for(int i=0;i<index;i++) {
System.out.println(a[i]+" :"+b[i]);
}
}
public static void main(String[] args) {
String str = "apple is a apple.";
printCharInfo(str);
}
}
6.字符串右移n位,例如 “hello world” 右移两位后"ldhello wor"
要求写一个方法实现此功能,方法的格式是
String moveToRight(String str,int position)
str:需要移动的字符串
p:右移的位数
public class Test9 {
//字符串右移n位,例如 “hello world” 右移两位后"ldhello wor"
public static String moveToRight(String str,int position) {
String left = str.substring(0,str.length()-position);
String right = str.substring(str.length()-position);
return right+left;
}
public static void main(String[] args) {
String str="hello world";
System.out.println(moveToRight(str,2));
}
}
7.【编程题】若可以从一个源字符串中, 找到一个相符的字符串(忽略大小写), 则返回第一个字符的索引位置,否则返回-1。
int stringAt(String str,String subStr)
public class Test10 {
public static int stringAt(String str,String subStr){
if(str.toLowerCase().contains(subStr.toLowerCase())){
return str.toLowerCase().indexOf(subStr.toLowerCase());
}else{
return -1;
}
}
public static v