《Just For Java——基础扎实》——第四节:String

一、String简介

  包:java.lang.String,java.lang提供利用 Java 编程语言进行程序设计的基础类。

  实现:public final class String  implements java.io.Serializable, Comparable<String>, CharSequence{ }

  其中:java.io.Serializable  是序列化有关的接口;

       java.lang.CharSequence  是cahr值的一个可读序列;

     java.lang.Comparable<String>  强行对实现它的类的每个对象强行进行自然排序。 

  类简介:

/**

 * The <code>String</code> class represents character strings. All

 * string literals in Java programs, such as <code>"abc"</code>, are

 * implemented as instances of this class.

 * <p>

 * Strings are constant; their values cannot be changed after they

 * are created. String buffers support mutable strings.

 * Because String objects are immutable they can be shared. For example:

 * <p><blockquote><pre>

 *     String str = "abc";

 * </pre></blockquote><p>

 * is equivalent to:

 * <p><blockquote><pre>

 *     char data[] = {'a', 'b', 'c'};

 *     String str = new String(data);

 * </pre></blockquote><p>

 * Here are some more examples of how strings can be used:

 * <p><blockquote><pre>

 *     System.out.println("abc");

 *     String cde = "cde";

 *     System.out.println("abc" + cde);

 *     String c = "abc".substring(2,3);

 *     String d = cde.substring(1, 2);

 * </pre></blockquote>

 * <p>

 * The class <code>String</code> includes methods for examining

 * individual characters of the sequence, for comparing strings, for

 * searching strings, for extracting substrings, and for creating a

 * copy of a string with all characters translated to uppercase or to

 * lowercase. Case mapping is based on the Unicode Standard version

 * specified by the {@link java.lang.Character Character} class.

 * <p>

 * The Java language provides special support for the string

 * concatenation operator (&nbsp;+&nbsp;), and for conversion of

 * other objects to strings. String concatenation is implemented

 * through the <code>StringBuilder</code>(or <code>StringBuffer</code>)

 * class and its <code>append</code> method.

 * String conversions are implemented through the method

 * <code>toString</code>, defined by <code>Object</code> and

 * inherited by all classes in Java. For additional information on

 * string concatenation and conversion, see Gosling, Joy, and Steele,

 * <i>The Java Language Specification</i>.

 *

 * <p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor

 * or method in this class will cause a {@link NullPointerException} to be

 * thrown.

 *

 * <p>A <code>String</code> represents a string in the UTF-16 format

 * in which <em>supplementary characters</em> are represented by <em>surrogate

 * pairs</em> (see the section <a href="Character.html#unicode">Unicode

 * Character Representations</a> in the <code>Character</code> class for

 * more information).

 * Index values refer to <code>char</code> code units, so a supplementary

 * character uses two positions in a <code>String</code>.

 * <p>The <code>String</code> class provides methods for dealing with

 * Unicode code points (i.e., characters), in addition to those for

 * dealing with Unicode code units (i.e., <code>char</code> values).

 *

 * @author  Lee Boynton

 * @author  Arthur van Hoff

 * @version 1.204, 06/09/06

 * @see     java.lang.Object#toString()

 * @see     java.lang.StringBuffer

 * @see     java.lang.StringBuilder

 * @see     java.nio.charset.Charset

 * @since   JDK1.0

 */

  1、String类代表字符串。作者是Lee Boynton。Java中所有的字符串字面值如“abc”都作为此类的实例实现。

  2、String类的定义中有“final”关键字,字符串是常量,在创建之后不能更改。

  3、Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。

    字符串转换通过Object 类定义的toString 方法实现的,该方法可被 Java 中的所有类继承。

  4、除非另行说明,否则将 null 参数传递给此类中的构造方法或方法将抛出 NullPointerException。  

二、方法

  1、char  charAt(int index):返回字符串指定索引处的字符。 

System.out.println("abc".charAt(1));//结果是:b

  源码:

public char charAt(int index) {

        if ((index < 0) || (index >= count)) {

            throw new StringIndexOutOfBoundsException(index);

        }

        return value[index + offset];

    }
/** The value is used for character storage. char数组用于字符串存储 */

    private final char value[];
public String() {
this.offset = 0; this.count = 0; this.value = new char[0]; }

  2、int codePointAt(int index):返回指定索引处的字符的Unicode码值。

System.out.println("abc".codePointAt(0));//结果:97

codePointAt方法:

public int codePointAt(int index) {

        if ((index < 0) || (index >= count)) {

            throw new StringIndexOutOfBoundsException(index);

        }

        return Character.codePointAtImpl(value, offset + index, offset + count);

    }

  codePointAtImpl是根据字符,比如'a'查询对应Unicode码的方法,不深述。

  3、int codePointBefore(int index): 返回指定索引之前的字符的Unicode码值。

  4、int codePointCount(int beginIndex,int endIndex):计算对应的字符的个数

  5、int compareTo(String anotherString):按照字典顺序比较两个字符串

  6、int compareToIgnoreCase(String str):按照字典顺序比较两个字符串,忽略大小写

  7、String concat(String str): 将指定字符串连接到此字符串的结尾。

  8、boolean contains(CharSequence s):是否包含指定的char值序列,即改字符串中是否包含指定的字符串。

  9、boolean contentEquals(CharSequence s):将此字符串与指定的 CharSequence 比较。

  10、boolean contentEqals(StringBuffer sb):将此字符串与指定的 StringBuffer 比较。

  11、String copyValueOf(char[] data):返回指定数组中表示该字符序列的 String。

  12、String copyValueOf(char[] data,int offset,int count):返回指定数组中表示该字符序列的 String。

  13、boolean endsWith(String str):测试此字符串是否以指定的后缀结束。

  12、pubic boolean equals(Object object):将此字符串和指定的对象进行比较。当参数不为NULL并且是与此对象表示相同字符序列的String对象时,结果为true。

源码:

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;

    }

 

 

 

************************************  “==” 和 “equals” 小结  **************************************

  在java程序设计中,经常要比较两个变量值是否相等。

  1、基本数据类型,也称原始数据类型即:byte,shot,int,long,float,double,char,boolean

    他们比较用 “==” ,比较的是他们的值。

  2、引用对象比较

  a、当他们用“==”比较的时候,比较的是他们在内存中的存放地址。所以,只有同一个new出来的对象,结果为true;否则为false。

     String s1 = "Monday";

        String s2 = "Monday";

        String s3 = new String("Monday");

        System.out.println(s1 == s2);//运行结果:true.

        System.out.println(s1 == s3);//运行结果:false.

  s1为new出的对象,放到了常量池中。重新定义的变量s2,对应的栈内存中的地址就是s1的栈内存地址,所以s1 == s2运行结果为true;

  s3为重新new出来的一个对象,对应的栈内存地址和s1并不相同,所以s1 == s3运行结果为false。

  b、从上面equals的源代码可以看出,String的equals方法是将两个Sring对象的值按照字符序列一一进行比较。所以:

     String s1 = "Monday";

        String s2 = "Monday";

        String s3 = new String("Monday");

        System.out.println(s1.equals(s2));//运行结果:true.

        System.out.println(s1.equals(s3));//运行结果:true.

  c、java常量池

  java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量

  时节省了很多时间。常量池其实也就是一个内存空间,常量池存在于方法区中。

  java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。

  另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用常量池,也即对象不负责创建和管理大于127的这些类的对象。

  java在创建一个String对象的时候,首先去常量池寻找看有没有创建好的对象供使用,有则直接引用该对象的地址,没有再进行创建。

  在上面的例子中,当s2对象创建的时候,jvm去常量池中寻找发现已经有了String常量“Monday”,那么它直接调用地址给了s2,s2和s1引用了同一个对象。s3则不同,

  它明明白白的告诉虚拟机:我就要一个新的对象!所以s3是一个new出来的新对象。

  d、intern()方法:

     String s1 = "Monday";

        String s2 = "Monday";

        String s3 = new String("Monday");

        s3 = s1.intern();

        System.out.println(s1==s2);//运行结果:true.

        System.out.println(s1==s3);//运行结果:true.

        System.out.println(s1.equals(s2));//运行结果:true.

        System.out.println(s1.equals(s3));//运行结果:true.

  intern方法会先检查常量池里是否存在"Monday"字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"Monday"添加到字符串池中,然后再返回它的引用。

参考:java中equals和==的区别

     常量池-百度百科

************************************  “==” 和 “equals” 小结  **************************************

 

 

 

  13、boolean equalsIgnoreCase(String anotherString):与另一个字符串比较,不考虑大小写。

format

getBytes

hashCode

indexOf

intern

isEmpty

lastIndexOf

length

matches

replace

replaceAll

split

startsWith

toString

valueOf

三、StringBuilder:可变字符序列

四、StringBuffer:线程安全的可变字符序列

你可能感兴趣的:(String)