包: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 ( + ), 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"添加到字符串池中,然后再返回它的引用。
************************************ “==” 和 “equals” 小结 **************************************
13、boolean equalsIgnoreCase(String anotherString):与另一个字符串比较,不考虑大小写。
format
getBytes
hashCode
indexOf
intern
isEmpty
lastIndexOf
length
matches
replace
replaceAll
split
startsWith
toString
valueOf