String类
一、String类
字符串:字符串是一个特殊的对象,一旦初始化就不可以被改变。

String s2 = "abc";
String s1 = new String("abc");
有什么区别?
验证:
class Demo
{
public static void main(String args[]){
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
答:String s1 = "abc";s1指向对象"abc",String s2 = new String("abc");s2新开辟了空间用于存储"abc"对象的地址。所以s1与s2两者的地址是不同的。所以s1==s2为false。

class Demo
{
public static void main(String args[]){
String s1 = "abc";
s1 = "kk";
System.out.println(s1);
}
}
答:s1原来指向"abc",后来指向了"kk"。这一过程只是指向改变了,而对象"abc"依然还在,等待被垃圾回收机制回收。
""与null的区别:""是一个对象,null是空。
常见的字符串操作:
1.获取
字符串中包含的字符数,也就是字符串的长度。
int length();
根据位置获取位置上的某个字符。
char charAt(int index);
根据字符获取该字符在字符串中的位置。
int indexOf(int ch);//返回的是ch在字符串中第一次出现的位置
详情查看API文档。
boolean contains(CharSequence s);
注:当访问到字符串中不存在的角标时,会发生StringIndexOutOfBoundsException字符串角标越界异常。
class Demo
{
public static void main(String args[]){
String s = "abc";
System.out.println(s.charAt(10));
}
}
如果没有找到则返回-1(可用于判断是否存在)。
2.判断
判断字符串中是否包含某一个子串。
boolean contains(CharSequence s);
判断字符串中是否有内容。
boolean isEmpty();
判断字符串是否以指定内容开头。
boolean startsWith(String prefix);
判断字符串是否以指定内容结尾。
boolean endsWith(String suffix);
判断字符串内容是否相同,复写了Object类中的equals方法。
boolean equals(Object anObject);
判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase(String anotherString);
例:
class Demo
{
public static void main(String args[]){
String s = "ArrayDemo.java";
//判断文件名称是否是Array开头。
System.out.println("是否是Array开头:"+s.startsWith("Array"));
//判断文件类型是否是.java文件。
System.out.println("是否是.java文件:"+s.endsWith(".java"));
//判断文件名是否包含Demo。
System.out.println("是否包含Demo:"+s.contains("Demo"));
}
}
3.字符串转换
将字符数组转成字符串。
String valueOf(char[] data);//返回 <code>char</code> 数组参数的字符串表示形式。
String valueOf(char[] data, int offset, int count);//返回 char 数组参数的特定子数组的字符串表示形式。
静态方法:
static String copyValueOf(char[] data);返回指定数组中表示该字符序列的 String。
static String copyValueOf(char[] data, int offset, int count);返回指定数组中表示该字符序列的 String。
基本数据类型转成字符串。
static String valueOf(int i);返回 int 参数的字符串表示形式。
static String valueOf(double d);返回 double 参数的字符串表示形式。
将字节数组装成字符串。
String(byte[] bytes);通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
将字符串转成字符数组。
char[] toCharArray();将此字符串转换为一个新的字符数组。
字符串转成字节数组。
byte[] getBytes();使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
注:字符串和字节数组在转换过程中,是可以指定编码表的。
4.替换
替换指定字符串。
String replace(char oldChar, char newChar);返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
例:
class Demo
{
public static void main(String args[]){
String s1 = "hello java";
String s2 = s1.replace("a","n");
System.out.println(s1);
System.out.println(s2);
}
}
分析:s1不变,因为字符串一旦被初始化,就不能再改变。如果要替换的字符串不存在,返回的还是原串。
5.切割
切割字符串。
String[] split(String regex);根据给定正则表达式的匹配拆分此字符串。
6.子串获取字符串中的一部分
子串获取字符串中的一部分。
String substring(int beginIndex);返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex);返回一个新字符串,它是此字符串的一个子字符串(包含头,不包含尾)。
注:如果角标不存在,会发生StringIndexOutOfBoundsException字符串角标越界异常。
7.转换,去除空格,比较。
大小写转换。
String toLowerCase();使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String toUpperCase();使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
去除空格。
String trim();返回字符串的副本,忽略前导空白和尾部空白。
对两个字符串进行自然顺序的比较。
int compareTo(String anotherString);按字典顺序比较两个字符串。
int compareToIgnoreCase(String str);按字典顺序比较两个字符串,不考虑大小写。
二、StringBuffer
StringBuffer:字符串的组成原理就是通过该类实现的,StringBuffer可以对字符串的内容进行增删。StringBuffer是一个容器,很多方法与String相同,StringBuffer是可变长度的,是一个字符串缓冲区。
1.存储。
StringBuffer append(char c);将 char 参数的字符串表示形式追加到此序列。
StringBuffer insert(int offset, char[] str);将 char 数组参数的字符串表示形式插入此序列中。
例:
class Demo
{
public static void main(String args[]){
StringBuffer sb = new StringBuffer();
//方法链调用。因为append()方法返回的还是本类对象,所以可以继续调用。
sb.append("abc").append("def").append("ghi").append("jkl");
System.out.println(sb);
}
}
2.删除。
StringBuffer delete(int start, int end);移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index);移除此序列指定位置的 char。
3.获取
char charAt(int index);返回此序列中指定索引处的 char 值。
int indexOf(String str);返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str);返回最右边出现的指定子字符串在此字符串中的索引。
int length();返回长度(字符数)。
String substring(int start, int end);返回一个新的 String,它包含此序列当前所包含的字符子序列。
4.修改
StringBuffer replace(int start, int end, String str);使用给定 String 中的字符替换此序列的子字符串中的字符。
void setCharAt(int index, char ch);将给定索引处的字符设置为 ch。
5.反转
StringBuffer reverse();将此字符序列用其反转形式取代。
三、
StringBuild
StringBuild:JDK1.5版本之后出现了StringBuild。与StringBuffe区别在于StringBuffer是线程同步的。而StringBuild是线程不同步的。
开发建议:单线程使用StringBuild,多线程使用StringBuffer。
关于Java升级的三要素:提高效率;简化书写;提高安全性。
四、基本数据类型对象包装类
byte----------------------------Byte
short--------------------------Short
int------------------------------Integer
long---------------------------Long
boolean----------------------Boolean
float---------------------------Float
double-----------------------Double
char--------------------------Charcter
作用:基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换。
基本数据类型转成字符串:
1.基本数据类型+"";
2.基本数据类型.toString();
字符串转成基本数据类型:
XXX a = XXX.parseXxx(String);
例:
static int parseInt(String s);将字符串参数作为有符号的十进制整数进行解析。
十进制转成其他进制:
static String toBinaryString(int i);以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
static String toHexString(int i);以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
static String toOctalString(int i);以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
其他进制转十进制:
static int parseInt(String s, int radix);使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
注:1.5版本之后出现的新特性。
class Demo
{
public static void main(String args[]){
Integer x = new Integer("123");
Integer y = new Integer(123);
System.out.println(x==y);
System.out.println(x.equals(y));
}
}
分析:说明"123"是被转成int型后存储的,所以equals时才会为true。
例:
class Demo
{
public static void main(String args[]){
Integer x = 4;
x = x+2;
System.out.println(x);
}
}
分析:在给x赋值的时候,对4进行了自动装箱成Integer。x+2的时候4拆箱成int(其实是省略了x.intValue()),相加后又装箱成Integer赋给x。
例:
class Demo
{
public static void main(String args[]){
Integer x = null;
x = x+2;
System.out.println(x);
}
}
分析:之所以出现空指针异常,空对象调用了自动拆箱的 intValue();方法。
例:
class Demo
{
public static void main(String args[]){
Integer a = 128;
Integer b = 128;
Integer m = 127;
Integer n = 127;
System.out.println("a==b:"+(a==b));
System.out.println("m==n:"+(m==n));
}
}
分析:出现这种情况是因为数值如果在byte范围内,对于新特性,如果数值已经存在,则不会再开辟新的空间。而128超出了byte的范围,超出的会另外存储。所以说就不会相等了。