如何在不使用任何API方法的情况下查找String的第一个字符

时间:2016-02-05 21:06:12

标签: java string

最近我在接受采访时被问到这个问题:

  

在不使用String

中的任何方法的情况下查找String的第一个字符

假设str为字符串:

,提供以下方法
  1. str.charAt(0)
  2. str.toCharArray()[0]
  3. str.substring(0,1)
  4. 有人能建议我实现它的方式吗?

5 个答案:

答案 0 :(得分:4)

使用Matcher API(而不是String):我们创建一个模式来捕获每个字符,但只找到第一个字符并打印它(dotall mode已启用以处理案例第一个字符是行分隔符。)

public static void main(String[] args) {
    Matcher matcher = Pattern.compile("(.)", Pattern.DOTALL).matcher("foobar");
    if (matcher.find()) {
        System.out.println(matcher.group(1)); // prints "f"
    }
}

答案 1 :(得分:2)

s.charAt(0)使用CharSequence API,而不是String,所以正式回答是正确的。

另一种选择是使用接受CharSequence作为参数的方法,e。 G。 Commons Lang StringUtils'。

答案 2 :(得分:1)

使用反射,您可以访问

private final char value[];

来自String类的数组,用于存储所有字符。所以你的代码看起来像:

String str = "abc";
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
char[] chars = (char[]) f.get(str);
System.out.println(chars[0]);

输出:a

另外技术上StringBuilder API与String不同,所以我们也可以使用

String str = "abc";
System.out.println(new StringBuilder(str).charAt(0));
//                                       ^-comes from StringBuilder, not String

答案 3 :(得分:1)

您可以使用StringReader并阅读第一个字符:

char firstChar = (char) new StringReader(str).read();

答案 4 :(得分:1)

使用自定义编写器的另一个愚蠢的解决方案:

private class PseudoWriter extends Writer {

    private Character first;

    public void write(char[] cbuf, int off, int len) throws IOException {
        if (first == null) {
            first = cbuf[off];
        }
    }

    public void flush() throws IOException {}
    public void close() throws IOException {}

    public Character getFirstChar() {
        return first;
    }
}

用法:

String s = "Lorem ipsum";

PseudoWriter pseudoWriter = new PseudoWriter();
pseudoWriter.write(s);
Character first = pseudoWriter.getFirstChar();