一起去看海

2009/12/13

Java字符串比较

Filed under: Java笔记 — admin @ 14:38

Java中字符串的比较可以用字符串的compareTo方法,很简单。找工作面试的时候遇到个面试官要我实现这个方法。于是就写了一段程序,当时写的和下面的差不多,很久了,记不清了。可能是我写的比较快,自己有点得意了,也可能那家伙比较爱挑毛病,愣是说我的compare方法没有对s1和s2变量进行null值检查。当时被他一说觉得真是这样的,自己疏忽了,只好承认错误。昨天看了一下String中的compareTo方法的实现,发现对传入的值也没有进行null值检查。转念一想,明白了,如果传入值为null,程序自然会抛出NullPointerException。如果要进行null值检查,如果检查到传入值为空,那该怎么处理呢?最终不还是抛出个NullPointerException,既然结局是一样的,还检查作甚。

更有趣的是那家伙还继续挑我毛病,看到return s1.charAt(i) – s2.charAt(i);这句,就说这能用运算符相减?不知道这家伙是真不懂还是假不懂,于是就解释了一番。这年头,面试真辛苦。。

[java]public class StringCompare {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abcde";
String s3 = "abf";
String s4 = "aa";
String s5 = "abc";
String s6 = "123";

System.out.println(compare(s1, s2));
System.out.println(compare(s1, s3));
System.out.println(compare(s1, s4));
System.out.println(compare(s1, s5));
System.out.println(compare(s1, s6));
}

public static int compare(String s1, String s2){
int len1 = s1.length();
int len2 = s2.length();
int minLen = len1 < len2 ? len1 : len2;
for(int i = 0; i < minLen; i++){
if(s1.charAt(i) != s2.charAt(i)){
return s1.charAt(i) – s2.charAt(i);
}
}
if(len1 != len2){
return len1 – len2;
}
return 0;
}
}[/java]

输出:
-2
-3
1
0
48

2009/12/11

String、StringBuffer和StringBuilder

Filed under: Java笔记 — admin @ 22:58

找工作的时候经常遇到这个问题:String、StringBuffer和StringBuilder的区别?现在慢慢总结一下吧。

String 是不可变的,每次对 String 类型进行更改的时候都会生成了一个新的 String 对象,对于经常改变内容的字符串,最好不要用 String 。

StringBuilder是可变的,用于构建String。通过调用方法得到你想要的字符序列,再调用toString()就可以生成字符串。如果要经常改变字符串的内容,StringBuilder的效率要高很多。

StringBuffer和StringBuilder差不多,但是StringBuffer是线程安全的,StringBuilder不保证同步。两者的方法几乎相同。在单线程程序中使用StringBuilder效率会高一些。

一个StringBuffer的小例子。用StringBuilder替换也是一样的

[java]public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("www");
sb.append(".");
sb.append("ooobj");
sb.append(".").append("com");
String s = sb.toString();
System.out.println(s);
}[/java]

2009/12/10

java字符串分解 StringTokenizer用法

Filed under: Java笔记 — admin @ 22:36

Java中substring方法可以分解字符串,返回的是原字符串的一个子字符串。如果要讲一个字符串分解为一个一个的单词或者标记,StringTokenizer可以帮你。

先看个例子:

[java]public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("www.ooobj.com", ".b");
while(st.hasMoreElements()){
System.out.println("Token:" + st.nextToken());
}
}[/java]

输出:
Token:www
Token:ooo
Token:j
Token:com

StringTokenizer有两个常用的方法:

1.hasMoreElements()。这个方法和hasMoreElements()方法的用法是一样的,只是StringTokenizer为了实现Enumeration接口而实现的方法,从StringTokenizer的声明可以看到:class StringTokenizer implements Enumeration<Object>。

2.nextElement()。这个方法和nextToken()方法的用法是一样的,返回此 StringTokenizer 的下一个标记。

StringTokenizer的三个构造方法:

1.StringTokenizer(String str)。默认以” \t\n\r\f”(前有一个空格,引号不是)为分割符。
源码:
public StringTokenizer(String str) {
this(str, ” \t\n\r\f”, false);
}

实例:

[java]public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("www ooobj com");
while(st.hasMoreElements()){
System.out.println("Token:" + st.nextToken());
}
}[/java]

输出:
Token:www
Token:ooobj
Token:com

2.StringTokenizer(String str, String delim)。指定delim为分割符,看第一个例子。

3.StringTokenizer(String str, String delim, boolean returnDelims)。returnDelims为true的话则delim分割符也被视为标记。

实例:

[java]public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("www.ooobj.com", ".", true);
while(st.hasMoreElements()){
System.out.println("Token:" + st.nextToken());
}
}[/java]

输出:
Token:www
Token:.
Token:ooobj
Token:.
Token:com

2009/12/07

java字符串分解 substring用法

Filed under: Java笔记 — admin @ 23:30

Java经典实例是本好书,不能像以前那样不做笔记看了就忘了。于是还是写点东西吧,也可以给博客增加点内容。

java字符串分解 substring用法

单参数形式:
substring(int beginIndex)
该子字符串从beginIndex处的字符开始,直到此字符串末尾。

双参数形式:
substring(int beginIndex, int endIndex)
该子字符串从指定的 beginIndex 处开始,直到索引 endIndex – 1 处的字符。注意:其它一些语言第二个参数往往代表长度,JAVA不一样。该子字符串的长度为 endIndex-beginIndex。

[java]
public static void main(String[] args) {
String a = "www.ooobj.com";
System.out.println(a);
String b = a.substring(2);
System.out.println(b);
String c = a.substring(1, 10);
System.out.println(c);
String d = a.substring(6, a.length());
System.out.println(d);
}
[/java]

输出:
www.ooobj.com
w.ooobj.com
ww.ooobj.
obj.com

beginIndex不能为负数,endIndex不能超出字符串长度,否则会抛出StringIndexOutOfBoundsException异常:

[java]
public static void main(String[] args) {
String a = "www.ooobj.com";
String b = a.substring(-1, 10);
}
[/java]

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

[java]
public static void main(String[] args) {
String a = "www.ooobj.com";
String b = a.substring(1, 100);
}
[/java]

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 100

« Newer Posts

Powered by WordPress