最近我在接受采访时被问到这个问题:
在不使用
中的任何方法的情况下查找String
类String
的第一个字符
假设str
为字符串:
str.charAt(0)
str.toCharArray()[0]
str.substring(0,1)
有人能建议我实现它的方式吗?
答案 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();