这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
字符串的声明
字符串是内存中连续排列的0个或多个字符。不变字符串是指字符串一旦创建,其内容就不能改变,Java中使用String类来处理不变字符串,在对String类的实例进行查找、比较、拼接等操作时,既不能输入新字符,又不能改变字符串的长度。
Java程序中的字符串分为常量和变量两种,其中,字符串常量使用双引号括起来的一串字符,系统为程序中出现的字符串常量自动创建一个String对象。例如:
System.out.println("hello world!");
这句话将创建一个String对象,值为“hello world!”。
对于字符串变量,在使用之前要显式声明,并进行初始化。
字符串的声明方式有三种:
- 直接创建: String str1 = "Hello";
字符串是对象,虽然我们在这里没有用new创建对象,其实是编译器给我们做了这些操作。这种创建的字符串对象有一个特点,如果同样的对象如果存在了,就不会创建一个新的对象,而是指向了同样的对象。例如String str2 = "Hello";,则str1和str2是指向了字符串池中同样的内存地址,即 str1 == str2。
- 使用字符串连接创建: String str = "Hello" + "World";
这种形式其实可以看做是第一种的形式的特殊形式。 "Hello" + "World"在编译期会被自动折叠为常量“HelloWorld”,所以,最后只会创建一个对象:String str = "HelloWorld";
JDK1.7开始,javac会进行常量折叠,全字面量字符串相加是可以折叠为一个字面常量,而且是进入常量池的。这个问题涉及到了字符串常量池和字符串拼接。
String a="a"+"b"+"c";
通过编译器优化后,得到的效果是:
String a="abc";
- new创建字符串: String str1 = new String("Hello");
用new关键字创建的字符串每次都会创建一个新的对象。即使这时创建一个字符串
String str2 = new String("Hello");
str1与str2是两个对象,str1 != str2。
注意点:String str = new String("Hello"); 会产生几个对象? 如果字符串池里面没有“Hello”对象,会在字符串池里面生成一个对象,然后再生成一个字符串对象,str指向这个对象;如果字符串池里面已经有了“Hello”对象,则只会生成一个对象,str指向这个对象。
字符串的操作
字符串创建以后,可以使用字符串类中的方法对它进行操作。日常开发中常用的操作字符串的方法有:
- String当中与获取相关的常用方法
public int length():获取字符串当中含有的字符个数,拿到字符串长度。
public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。
public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始。)
public int indexOf(String str):查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。 在java中存在两个这样的方法在java1.6的API中这样写道:
- 第一种
public String substring(int beginIndex){
}
解释:返回一个新的字符串,该字符串是原来字符串的子集。该字符串从beginIndx处开始,一直到最后结束。
"unhappy".substring(2) returns "happy"
"Harbison".substring(3) returns "bison"
"emptiness".substring(9) returns "" (an empty string)
第二种:
public String substring(int beginIndex,
int endIndex){
}
解释:该字符串返回的的字符是从beginIndex的位置到endIndex的位置。
"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"
Java有一组可以用于字符串的内置方法。Java 字符串(String)操作常用操作,如字符串的替换、删除、截取、赋值、连接、比较、查找、分割等。本文主要介绍Java String substring() 方法。
Java 字符串方法
例如:
public class Test {
public static void main(String args[]) {
String Str = new String("www.cjavapy.com");
System.out.print("返回值 :" );
System.out.println(Str.substring(4) );
System.out.print("返回值 :" );
System.out.println(Str.substring(4, 11) );
}
}
1、定义和用法
返回一个新的字符串,它是当前字符串的一个子字符串。
2、调用语法
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
3、参数说明
| 参数 | 描述 |
|---|---|
| beginIndex | 起始索引(包括), 索引从 0 开始。 |
| endIndex | 结束索引(不包括) |
4、返回值
返回一个新的字符序列,它是此序列的一个子序列。
5、String、StringBuffer和StringBuilder的关系
String类的对象实例是不可变的,一旦创建就确定下来,对字符串施加操作后并不改变字符串本身,而是有生成了一个实例。对于那些需要改变内容并有许多操作的字符串,可以使用StringBuffer类或者StringBuilder类。它们之间的区别如下:
- String是字符串常量,一旦创建就不能修改。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。String类是final修饰的,不能被继承。覆盖了equals方法和hashCode()方法。
- StringBuffer是字符串可变对象,可以对字符串进行操作,修改字符串原有值时不会新建一个对象。执行效率较慢,但是线程安全。StringBuffer没有覆盖equals方法和hashCode()方法。可以动态的拼接字符换,使用 append() 方法。
- StringBuilder也是字符串可变对象,同StringBuffer一样,可以对字符串进行操作,也不会新建对象。执行效率高效,但是线程不安全。