昨天面试碰见一个笔试题。题目要求:利用String自身的方法,将一个由正整数组成的字符串,转变为int数组后倒序输出(例如“123”输出321)。
public static void reverse(String str){ char[] chs = str.toCharArray(); for (int i = chs.length-1; i >0; i--) { System.out.println((int) (chs[i])- (int) ('0')); } }
这是我现在认为最标准的答案,不知道大家有没有什么别的想法。
public final class String implements java.io.Serializable,Comparable<String>,CharSequence {
上面可以看出,String类实现了三个接口,用于序列化Serializable接口,用于比较的泛型接口Comparable<String>和CharSequence接口,对于前两个接口可能都比较熟悉,那么第三个接呢。
CharSequence接口有四个方法:
int length();返回字符数组的长度。
char charAt(int index):返回制定索引处的字符。
CharSequence subSequence(int start, int end);返回有start开始到end之前的字符所组成的字符数组。
String toString():返回该字符数组对应的String。
private final char value[]; private final int offset; private final int count; private int hash; private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
这是String类里定义私有变量,value[]就是String对应的字符数组,offset一直没搞懂,求指教啊,count就是String对应字符序列中的字符数,hash是String对应的hash码。其中value[]和coun应该是我们一般需要知道的,别的就不用了。
再来看看String中主要的方法:
String的构造方法有很多,可以分为以下几类:
1、不传任何参数,也就是构造一个空字符串;
2、传入String对象,StringBuffer对象或者StringBuilder对象。
3、传入byte数组,并且带别的参数,用于表示截取长度的int,截取开始位置的int和用于表示字符集的String;
4、传入char数组,其余参数包括截取开始位置的int,截取长度的int
5、传入int数组,所带参数与char类似。
length(),实现自CharSequence 接口,返回count也就是字符串长度。
isEmpty(),返回count==0。
charAt(int index),返回指定索引处的字符。
void getChars(char dst[], int dstBegin) :将字符串中的字符从begin位置开始copy到dst[]数组中。
public byte[] getBytes(String charsetName):获得byte数组。
public byte[] getBytes(Charset charset):返回制定charset的byte数组。
public byte[] getBytes():返回byte数组。
public boolean equals(Object anObject):覆盖object中的equals方法。
实现代码如下:比较简单
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
用于和StringBuffer进行内容比较的一个方法:
public boolean contentEquals(StringBuffer sb) { synchronized (sb) { return contentEquals((CharSequence) sb); } }
上面的方法实际调用了和CharSequence进行内容比较的方法,也就是针对每一位的字符进行对比,当然前面还有几个短路比较。
public boolean contentEquals(CharSequence cs) { if (count != cs.length()) return false; // Argument is a StringBuffer, StringBuilder if (cs instanceof AbstractStringBuilder) { char v1[] = value; char v2[] = ((AbstractStringBuilder) cs).getValue(); int i = offset; int j = 0; int n = count; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } } // Argument is a String if (cs.equals(this)) return true; // Argument is a generic CharSequence char v1[] = value; int i = offset; int j = 0; int n = count; while (n-- != 0) { if (v1[i++] != cs.charAt(j++)) return false; } return true; }
public boolean equalsIgnoreCase(String anotherString):忽略大小写的同类比较。
public boolean equalsIgnoreCase(String anotherString) { return (this == anotherString) ? true : (anotherString != null) && (anotherString.count == count) && regionMatches(true, 0, anotherString, 0, count); }
comparable接口的compareTo方法:
public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if (i == j) { int k = i; int lim = n + i; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } } else { while (n-- != 0) { char c1 = v1[i++]; char c2 = v2[j++]; if (c1 != c2) { return c1 - c2; } } } return len1 - len2; }
String还给我们提供了一个比较工具类:
public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
该类的实现代码如下(比较简单):
private static class CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable { // use serialVersionUID from JDK 1.2.2 for interoperability private static final long serialVersionUID = 8575799808933029326L; public int compare(String s1, String s2) { int n1 = s1.length(), n2 = s2.length(); for (int i1 = 0, i2 = 0; i1 < n1 && i2 < n2; i1++, i2++) { char c1 = s1.charAt(i1); char c2 = s2.charAt(i2); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); if (c1 != c2) { return c1 - c2; } } } } return n1 - n2; } }
忽略大小写的同类比较:
public int compareToIgnoreCase(String str) { return CASE_INSENSITIVE_ORDER.compare(this, str); }
计算hashcode的方法(至于每位为什么乘以31而不是32,同求解):
public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31 * h + val[off++]; } hash = h; } return h; }
提供的公共方法用于查找目标字符串中的字符串:
static int indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex) { if (fromIndex >= sourceCount) { return (targetCount == 0 ? sourceCount : -1); } if (fromIndex < 0) { fromIndex = 0; } if (targetCount == 0) { return fromIndex; } char first = target[targetOffset]; int max = sourceOffset + (sourceCount - targetCount); for (int i = sourceOffset + fromIndex; i <= max; i++) { /* Look for first character. */ if (source[i] != first) { while (++i <= max && source[i] != first) ; } /* Found first character, now look at the rest of v2 */ if (i <= max) { int j = i + 1; int end = j + targetCount - 1; for (int k = targetOffset + 1; j < end && source[j] == target[k]; j++, k++) ; if (j == end) { /* Found whole string. */ return i - sourceOffset; } } } return -1; }
看看我们最常用的trim是怎么实现的:
public String trim() { int len = count; int st = 0; int off = offset; /* avoid getfield opcode */ char[] val = value; /* avoid getfield opcode */ while ((st < len) && (val[off + st] <= ' ')) { st++; } while ((st < len) && (val[off + len - 1] <= ' ')) { len--; } return ((st > 0) || (len < count)) ? substring(st, len) : this; }
笔试要用到的方法:
public char[] toCharArray() { char result[] = new char[count]; getChars(0, count, result, 0); return result; }
将其他对象转换为String:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
public native String intern():当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
public boolean startsWith(String prefix, int toffset);
public boolean startsWith(String prefix) ;
public boolean endsWith(String suffix);
public int indexOf(int ch);
public int indexOf(int ch, int fromIndex);//该查找是从fromindex处往前找
public int lastIndexOf(int ch);
public int lastIndexOf(int ch, int fromIndex);
public int indexOf(String str);
public int indexOf(String str, int fromIndex);
public int lastIndexOf(String str);
public String substring(int beginIndex);
public String substring(int beginIndex, int endIndex);
public CharSequence subSequence(int beginIndex, int endIndex);
public String concat(String str);
public String replace(char oldChar, char newChar);
public boolean matches(String regex);
public boolean contains(CharSequence s);
public String replaceFirst(String regex, String replacement);
public String replaceAll(String regex, String replacement);
public String replace(CharSequence target, CharSequence replacement);
public String[] split(String regex, int limit);
public String[] split(String regex);
public static String valueOf(char data[]);
public static String copyValueOf(char data[], int offset, int count);
public static String valueOf(boolean b);
有误之处,敬请拍砖!
相关推荐
简单总结可以下Java中String类中的常用方法
### Java中String类的知识 #### 一、String 类概述与创建方式 在Java语言中,`String`类是用于表示不可变字符序列的核心类之一。它代表了一个字符串对象,一旦被初始化后,其内容不能被改变。这被称为不可变性...
根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...
Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建,其内容就不能更改。下面我们将详细讨论String类的一些主要特性、实例化方式以及常用方法。 1. **String类的实例创建**: -...
java jdk中string类的源码 ,了解string类的书写,定义和声明
Java中的String类是编程中最常用的数据类型之一,它在处理文本数据时扮演着核心角色。String类位于java.lang包中,意味着它无需显式导入即可在任何Java程序中使用。由于字符串在Java中被视为不可变对象,即一旦创建...
Java 中的 String 类是 Java 编程语言中最基本的类之一,用于表示字符串。它在 java.lang 包中,是所有 Java 程序的默认一部分。String 类是不可变的,这意味着一旦创建了 String 对象,就不能更改它所包含的字符...
在Java编程语言中,String类是一个非常基础且重要的类,它代表不可变的字符序列。String类提供了多种方法,使得开发者能够方便地处理字符串。以下是对标题和描述中提到的Java String类方法的详细说明: 1. **构造...
在Java编程语言中,String类和StringBuffer类是处理字符串的两种主要方式,它们各自有不同的特性和适用场景。理解二者的区别对于编写高效、优化的代码至关重要。 1. **String类**: - **不可变性**:String类的...
Java中的String类是Java语言中最基础且至关重要的类之一,它代表不可变的字符序列。在Java中,字符串被广泛用于各种数据处理和文本操作。本文将深入探讨String类的一些关键方法及其用法。 首先,让我们看看String类...
### Java中String类的常用方法详解 在Java编程语言中,`String` 类是一个非常重要的类,用于表示不可变的字符序列。它提供了丰富的内置方法,使得开发人员能够轻松地处理字符串相关的操作。本文将详细介绍Java中`...
标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...
在Java编程语言中,String类是使用最广泛的类之一,它代表不可变的字符序列。以下是对Java中String类的全面解析,包括其比较方式、字符串常量的本质、以及常用的字符串操作方法。 一、String的比较方式 在Java中,...
Java中的String类是编程面试和笔试中经常出现的考察点,因为它在日常开发中极其重要。下面我们将深入探讨几个关于String类的知识点。 1. **字符串对象的创建和比较** 在Java中,创建字符串有两种方式:直接赋值...
5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5....
在Java编程中,`String`类是最常用的数据类型之一,用于处理文本数据。它是一个不可变类,意味着一旦创建了一个`String`对象,其内容就不能更改。这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的...