String 类代表字符串。Java 程序中的所有字符串字面值(如
"abc"
)都作为此类的实例来实现。
字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们
字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改
String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.
String类型的值保存在堆内,其值是不能改变的如图:
不得不提的就是一个经典面试题:
(1)String s = new String("abc"); 这句,创建了两个对象..其内容都是"abc".注意,s不是对象,只是引用.只有new生成的才是对象.
创建的流程是,首先括号里的"abc"先到String pool里看有没"abc"这个对象,没有则在pool里创建这个对象..所以这里就在pool创建了一个"abc"对象.然后 通过new语句又创建了一个"abc"对象..而这个对象是放在内存的堆里. .这里的s指向堆里的对象.
(2) String s1 = "abc"; 这条语句,s1当然还是引用.没啥可说的.后面的"abc".其实就是上面括号里的"abc".执行的是相同的操作.即 在pool里查找有没"abc"这个对象.没有则创建一个...很显然,第一条语句在pool里已经创建了一个"abc".所以这条语句没有创建对象,s1指向的是pool中的"abc"
(3)String s2 = new String("abc"); 这条语句,其实和第一条是一样的,但是,因为第一条已经在pool中创建了"abc"这个对象,所以,这条语句创建了一个对象.s2指向的是堆里的"abc".注意,虽然内容都是"abc",s与s2表示的是不同的对象
(4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相等) s与s1,一个指向堆里的对象,一个指向pool里的.很明显是不同的对象.s与s2.上面说了,虽然都是指向堆里的对象,内容也是"abc",但是也不是相同的对象.s1与s2.一个指向pool,一个指向堆.也不是相同的对象.所以三个都返回false.
解答:创建两个对象
1、字符数组与字符串
一个字符串可以变为一个字符数组,同样,也可以把一个字符数组,变为一个字符串。
在String类中提供了以下的操作方法:
·将字符串变为字符数组:public char[] toCharArray()
·字符数组变为字符串:public String(char[] value)
public String(char[] value,int offset,int count)
2、从字符串中取出指定位置的字符
如果要想使用此操作,则肯定此方法的返回值是一个char类型。
3、字符串与byte数组的转换
byte数组(字节数组),在一般的IO操作中会经常使用到。
在String类中提供了以下的方法可以进行字符串与字节数组的转换:
·字符串变为字节数组:public byte[] getBytes()
·将一个字节数组变为字符串:
|- 将全部字节数组变为String:public String(byte[] bytes)
|- 将部分字节数组变为String:public String(byte[]bytes,int offset,int lenth)
4、取得一个字符串的长度
要想取得字符串中的长度:public int length()
5、查找指定的字符串是否存在
在实际操作中,经常会使用到判断一个字符串中是否存在某些内容,此时就可以使用以下的方法:
·从头开始查找:public int indexOf(String str)
·从指定位置开始查找:public int indexOf(String str,int fromIndex)
查找的时候,方法的返回值是一个int类型的数据,此数据表示的是一个字符串的具体位置,如果没有查找到此字符串,则返回“-1”。
6、去掉空格
如果一些信息是由用户输入的话,则就可能出现多余的空格,在这种操作中就可以使用trim()去掉字符串的左右空格,但是字符串中间的空格是不可能去掉的。
7、字符截取
从一个指定的字符串中取出里面的部分内容,使用的方法:
·从指定位置开始一直截取到结束位置:public String substring(int beginIndex)
·截取指定范围的字符串:public String substring(int beginIndex,int endIndex)
8、拆分字符串
如果现在需要按指定的字符串去拆分一个字符串的话,则使用:public String[] split(String regex)
9、大小写转换
此功能在一般的开发语言都会存在,讲一个大写的字符串全部字母变为小写,或者将一个小写的字符串中的全部字母变为大写。
·小写变大写:public String toUpperCase()
·大写变小写:public String toLowerCase()
10、判断是否以指定的字符串开头或结尾
在String中可以使用以下的两个方法完成:
·判断是否以指定的字符串开头:public Boolean startsWith(String prefix)
·判断是否以指定的字符串结尾:public Boolean endsWith(String suffix)
11、不区分大小写的比较
在String类中equals()方法是可以用来进行字符串比较的,但是此种比较方法的只能针对大小写完全一样的字符串进行比较,如果现在要是想进行不区分大小写的比较,则可以使用以下的方法:
·public Boolean equalsIgonoreCase(String anotherString)
12、字符串替换功能
在String类中提供了以下方法用于字符串的替换操作:
·public String replaceAll(String regex,String replacement)