最常问到的关于JAVA String的10个问题

来源:互联网 发布:linux命令cp 编辑:程序博客网 时间:2024/06/07 02:31

以下是关于Java String的出现频率最高的10个问题:


1. 怎么比较String,用“==”还是equals()

简单来说,“==”是用来比较内存引用是否相等而equals是比较值是不是相等,除非你想看看两个string是不是同一个对象,否则你都应该用equals()。


2. 对于敏感信息来说(比如密码),为什么使用char[]比用String好?

String是不可变长度的,它在被创建之后会一直保持不变,直到被当垃圾回收。但是使用char数组却不一样,你可以随时修改它。所以如果使用char数组的话,敏感信息(如密码)就不太可能出现在系统的其它地方(而String在被回收前,你不知道它在哪)。


3. 可以在switch语句中使用String吗?

在JDK6及之前的版本是不可以的,从JDK7开始可以了:

// java 7 only!switch (str.toLowerCase()) {      case "a":           value = 1;           break;      case "b":           value = 2;           break;}

4. 怎么把String转换成int?

int n = Integer.parseInt("10");

很简单且经常用到,但是却有可能有时候会忘掉。


5. 怎么根据空白字符分割String?

可以用正则表达式:“\s”可以表示的空白字符有:“ ”, “\t”,“\r”,“\n” 即空格、TAB、换行、回车。

String[] strArray = aString.split("\\s+");

6. substring究竟做了什么?

在JDK6中,substring()方法返回的是原来的字符串,并没有创建一个新的。如果要创建一个全新的String的话可以这样:

str.substring(m, n) + ""

用上面这种方式通常会使程序更快,因为原来的字符串得以被回收。

在JDK7中,substring()创建了一个全新的字符串,不使用原来的。详细可以查阅:

substring()方法在JDK6和JDK7中的区别


7. String 和StringBuilder 及StringBuffer的区别

String和StringBuilder: StringBuilder是可变长度的,创建以后可以随时修改它。

StringBuilder和StringBuffer: StringBuffer是线程安全的,所以会比StringBuilder更慢,建议多个线程操作时使用。


8. 怎么重复String

可以使用Apache公共语言包(Apache Commons Lang package)中的repeat方法:

String str = "abcd";String repeated = StringUtils.repeat(str,3);//abcdabcdabcd

9. 怎么把字符串变成日期?

String str = "Sep 17, 2013";Date date = new SimpleDateFormat("MMMM d, yy", Locale.ENGLISH).parse(str);System.out.println(date);//Tue Sep 17 00:00:00 EDT 2013

10. 怎么计算一个字符在字符串中的出现次数?

使用Apache公共语言包(Apache Commons Lang package)中的StringUtils:

int n = StringUtils.countMatches("11112222", "1");System.out.println(n);

------------以下是我自己加的,非翻译------------

StringUtils.countMatches原理是这样的:

    public static int countMatches(CharSequence str, CharSequence sub) {        if (isEmpty(str) || isEmpty(sub)) {            return 0;        }        int count = 0;        int idx = 0;        while ((idx = CharSequenceUtils.indexOf(str, sub, idx)) != INDEX_NOT_FOUND) {            count++;            idx += sub.length();        }        return count;    }
即循环使用indexOf,累加看有多少个。


StringUtils.repeat原理是这样的:

    public static String repeat(String str, int repeat) {        // Performance tuned for 2.0 (JDK1.4)        if (str == null) {            return null;        }        if (repeat <= 0) {            return EMPTY;        }        int inputLength = str.length();        if (repeat == 1 || inputLength == 0) {            return str;        }        if (inputLength == 1 && repeat <= PAD_LIMIT) {            return repeat(str.charAt(0), repeat);        }        int outputLength = inputLength * repeat;        switch (inputLength) {            case 1 :                return repeat(str.charAt(0), repeat);            case 2 :                char ch0 = str.charAt(0);                char ch1 = str.charAt(1);                char[] output2 = new char[outputLength];                for (int i = repeat * 2 - 2; i >= 0; i--, i--) {                    output2[i] = ch0;                    output2[i + 1] = ch1;                }                return new String(output2);            default :                StringBuilder buf = new StringBuilder(outputLength);                for (int i = 0; i < repeat; i++) {                    buf.append(str);                }                return buf.toString();        }    }
先计算总长度,然后用StringBuilder累加。


原文地址:http://www.programcreek.com/2013/09/top-10-faqs-of-java-strings/

原文标题:Top 10 questions of Java Strings

0 0
原创粉丝点击