String类详解

来源:互联网 发布:mac os x 10.6 黑苹果 编辑:程序博客网 时间:2024/06/06 05:00

通过String类的构造方法,可以很明显的看到String字符串使用的是字符数组来进行存储内容的。这里如果String构造方法中的参数为char数组,则直接复制这个参数用来直接存储,String构造方法的参数为String类型的字符串的时候,这里应该涉及到JVM的知识,日后再补充。

Length方法返回字符串的长度,isEmpty方法检测字符串是否为空。

charAt方法的实质是在char类型的数组从取值(这个char类型的数组为String字符串的存储方式)。

codePointAtcodePointBeforecodePointCountoffsetByCodePoints这个四个方法均是调用character类中的相关方法来实现的。

getChars方法调用System.arraycopy方法来实现数组的复制。

contentEquals方法是与指定的CharSequence对象比较,返回结果为true或者false。

equalsIgnoreCase方法在做比较的时候,会调用Character.toUpperCase()方法把两个用来做比较的字符数组中的所有字符转化为大写。

startsWith(String prefix, int toffset)方法使用循环比较prefix的字符数组是否和当然的String对象的字符数组相匹配。

Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。这里有一个很关键的知识点,如果串联的是一个变量,那么串联后String类型的字符串是存储在堆中的,如果“+”两边都是常量,那么编译器会做些优化,在编译的时候就确定这个结果,并加入常量池。这一点可以从以下代码中清晰的看到。

   

public class Test{public static void main(String[] args) throws Exception{String s1="2";final String s2="2";String s3="1"+s1;String s4="1"+s2;String s5="12";System.out.println(s3==s4);//falseSystem.out.println(s3==s5);//false,证明s3的值没有存储在常量池,只能在堆内存中System.out.println(s4==s5);//打印true,证明s4,s5都存储在常量池}}

String中的equals和hashCode

首先说一个结论:javaequals方法对比后相同的两个对象,其hashCode一定相等,但是equals方法对比后不相等的两个对象,其hashCode却不一定相等。

String类中的equals方法是比较String对象的内容的,通过把两个String对象转化为数组,再依次对比数组中的每一个元素。

hashCode的值是把String对象转化为数组后进行运算得到的。这里就必须注意到,HashCode是经过运算得到的结果,如果equals相同,那么HashCode方法的运算结果一定相同,但是equals对比后不同的对象,经过运算hashCode也还是可以相同的。

下面这个例子就可以说明在equals不相等的情况下,hashCode还是可以相同的。

public class Test{public static void main(String[] args) throws Exception{char[] i={1};char[] j={0,1};String s1=new String(i);String s2=new String(j);System.out.println(s1.equals(s2));//打印false,很明显s1与s2的内容不相等System.out.println(s1.hashCode());//打印结果为1System.out.println(s2.hashCode());//打印结果为1,结果证明equals返回为false的情况下,hashCode依然可以相等}}


indexOf(String str)方法是使用一系列的循环加if语句实现的,首先找到str中第一个字符出现在当然String对象中的位置,然后再比较第二个是否相等,如果相等继续比较第三个,如果不相等,则在当然String对象中重新查找str的第一个字符。

lastIndexOf顾名思义,相对于indexOf从头开始找,lastIndexOf从最末尾开始找。

Substring方法直接调用String的构造方法实现的。

concat(String str)方法把当前String对象和str使用getChars()方法转变为一个数组,再调用构造函数构造一个新的String对象。

replace(char oldChar, char newChar)方法里面都是数组的操作先在当然的String对象的数组中找到oldChar这个字符,再用newChar替换。

Matches方法调用的是Pattern.matches。

Contains方法直接调用Indexof方法来实现。

toUpperCasetoLowerCase大小写的转换,不做过多介绍。

Trim方法分别得到第一个不为空白的字符的位置,再得到最后一个不为空白的字符的位置,然后新建一个String对象。

Format调用Formatter().format(format, args).toString()方法实现。

valueOf方法调用String构造方法实现的。

Intern是个本地方法,后面的链接里面有介绍(http://blog.csdn.net/akon405/article/details/21865697)

另参考:JAVA的String 类

0 0
原创粉丝点击