基本上求职者进行笔试时没有不考字符串的。字符串也是一种相对简单的数据结构,结合指针,容易多次引起面试官反复发问。笔者曾不止一次在笔试或面试时遇到字符串试题。事实上,字符串也是一个考验程序员编程规范和编程习惯的重要考点。不能忽视这些细节,因为这些细节会体现你在操作系统、软件工程、边界内存处理等方面的知识掌控能力。
字符串是在程序开发中,随时随地都能用到的对象型数据,处理好字符串数据,对于程序开发来说,是至关重要的。字符串是由字符组成,在Java中,字符串是对象,是描述字符的基本数据结构。字符串是程序设计中很重要的一类数据结构,Java专门为存储和处理字符串提供了两个类:String和StringBuffer,并且为其提供了大量的方法以方便程序员对字符串进行操作,善用这些方法将大大提高编程效率。
String类可以用来保存一个字符串,该类有大量的方法处理这个字符串,对字符串数据的任何操作都必须通过这些方法来进行。特别要注意的是,本类是最终类,不允许继承。
1.String对象的创建
(1)初始化
可以通过初始化的方式来创建对象,同时还为它赋值。比如:
String str="Hello";
(2)使用关键字new
在Java中,可以使用new关键字来创建String实例:
String str = new String ( );
它创建了一个新的String类对象,并把它赋给变量。但它还是一个空的字符串,接下来为这个字符串赋值:
s="nice";
将上面的代码合并,就可以产生一种更简单的字符串表示:
String s = new String("nice");
(3)类型转换
Java中提供了大量的可以返回一个字符串的方法,用一个String变量接收这些返回值的同时就创建了该对象。
例如Integer类提供了一个静态方法toString(int i),返回一个表示指定整数的 String 对象,将该参数转换为有符号的十进制表示形式,以字符串形式返回它,它的使用方法如下:
String str = Integer.toString(12345);
在str中存储的字符串为“12345”。
2.String方法的引用
String类是Java提供可对字符串进行操作了的两种类之一。它表示的是不变的字符串,不能直接对起内容进行修改。String对象是不变的。接下来还是主要来介绍String类的重要方法。(在这里我只对比较常用的方法进行举例说明),下面是String中的一些常用方法。如表5.2所示。
表5.2 String中的常用方法
方法 | 说明 |
char charAt(int index) | 返回指定位置的字符 |
int compareTo(String anotherString) | 比较本字符串与anotherString中的是否相等 |
int compareToIgnoreCase(String str) | 同上,但忽略大小写 |
String concat(String str) | 将str串加到本对象中的字符串后面,返回这个新生成的串(注意:本字符串并没有变) |
static String copyValueOf(char[] data) | 用字符型数组data的值生成一个String对象,并返回 |
int indexOf(int ch) | 返回字符ch在本字符串中出现的位置 |
int indexOf(String str) | 返回字符串str在本字符串中出现的位置 |
int length() | 返回本字符串的长度 |
String replace(char oldChar, char newChar) | 将本字符串的oldChar字符用newChar字符代替,返回新生成的这个串(注意:本字符串并没有变) |
String substring(int beginIndex, int endIndex) | 从本字符串的beginIndex位置开始到endIndex-1位置结束,截取一个子串,并返回该子串 |
char[] toCharArray() | 用本字符串生成一个字符型数组并返回 |
String toLowerCase() | 将本字符串中的字符转换成小写字符,返回新生成的串(注意:本字符串并没有变) |
String toUpperCase() | 将本字符串中的字符转换成大写字符,返回新生成的串(注意:本字符串并没有变) |
String trim() | 将本字符串的头、尾空格去掉,返回新生成的串 |
q String求长度方法:public int length( )该方法返回用于调用该方法的String的长度。这是String类方法中最常见的一个方法。下面是一个具体使用length()的实例,代码如下:
package test;
public class StringClass_1 {
public static void main(String[] args) {
String str = "this is a dog";
System.out.println("str 的长度为:"+str.length());
}
}
运行结果为:
str 的长度为:13
注意:数组里有个属性是length,String里是length()方法
q String截取方法:public String substring(int begin)和public String substring(int begin,int end)这是两个重载的substring()方法,它返回字符串的子字符串。第一个参数代表子字符串的开始位置(从0开始),如果该调用只有一个参数,则返回的是从这个位置到最后的字符串。如果是第二种方法,第二个参数就代表结束的位置,但是不包括该位置的字符。下面是一个具体使用substring()的实例,代码如下:
package test;
public class StringClass_2 {
public static void main(String[] args) {
String str = "this is a dog";
String sub = str.substring(5);
String sub_1 = str.substring(2, 4);
System.out.println("sub 为:"+sub);
System.out.println("sub_1 为:"+sub_1);
}
}
运行结果为:
sub 为:is a dog
sub_1 为:is
第一句是从索引5开始,返回该String中的后半部分。第二句是从索引2开始,然后在索引4结束(但不包括4点字符)。
q String转字符数组方法:public String[] split(String regex)根据给定的正则表达式的匹配来拆分此字符串,从而生成此数组。下面是一个具体使用split()的实例,代码如下:
package test;
public class StringClass_3{
public static void main(String[] args) {
String str = "this is a dog !";
String[] sArry = str.split(" ");
System.out.println("sArryr 的长度为:"+sArry.length);
for(int i=0;i<sArry.length;i++){
System.out.println(sArry[i]);
}
}
}
运行结果为:
sArryr 的长度为:5
this
is
a
dog
!
q String比较方法:public boolean equals(Object anObject),比较此字符串与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的字符序列的 String 对象时,结果才为 true。它覆盖了Object类中的equals()方法。下面是一个具体使用equals()的实例,代码如下:
package test;
public class StrEqualsDemo {
public static void main(String[] args) {
String a = "";
System.out.println(a.equals(null));
}
}
输出结果为:false
q String指定子字符串位置的方法:public int indexOf(String str)和public int indexOf(String str,int fromIndex),这两个方法都是返回第一次出现的指定子字符串str在此字符串中的索引,但是第一个方法是从该字符串的0开始搜索;而第二个方法则是从从指定的索引处开始。
package test;
public class StrIndexOf Demo {
public static void main(String[] args) {
String str = "nice to meet you";
String subStr = "e";
int index = str.indexOf(subStr);
int end = str.indexOf(subStr, 6);
System.out.println("from zero begin e="+index);
System.out.println("from six begin e="+end);
}
}
运行结果为:
from zero begin e=3
from six begin e=9
String和StringBuffer的区别(常见的面试题)
【考题题干】请说出String与StringBuffer的区别?
【参考答案】String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。