Java中,字符串被作为String类型的对象来处理。String类位于java.lang包中,默认情况下该包被自动导入所有的程序。
1、创建String类型的对象:
public class zhang {
public static void main(String[] args) {
// 创建方式 直接赋值: 把字符串常量放在String池中, 自动入池
String str = "abc"; // 推荐
// new 方式: 创建两个对象, 不会自动入池, 有一个是垃圾
String str2 = new String("abc");
String str3 = "abc";
}
}
public class StringTest {
public static void main(String args[]) {
// 在池中和堆中分别创建String对象"abc",s1指向堆中对象
String s1 = new String("abc");
// s2直接指向池中对象"abc"
String s2 = "abc";
// 在堆中为"abc"创建新对象,s3指向该对象
String s3 = new String("abc");
// 在池中创建对象"ab" 和 "c",并且s4指向池中对象"abc"
String s4 = "ab" + "c";
// c指向池中对象"c"
String c = "c";
// 在堆中创建新的对象"abc",并且s5指向该对象
String s5 = "ab" + c;
System.out.println("------------实串-----------");
System.out.println(s1 == s2); // false
System.out.println(s1 == s3); // false
System.out.println(s2 == s3); // false
System.out.println(s2 == s4); // true
System.out.println(s2 == s5); // false
}
}
字符串的两种实例化方式及其差别
1).String str = “abc”;
2).String str = new String(“abc”);
Java运行时会维护一个String Pool(String池), 也叫“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
当用户采用直接赋值实例化String对象的时候,如果是第一次定义,则会自动的将对象的内容(字符串内容)保存在字符串对象池之中,以后如果其他的字符串对象依然采用直接赋值的话,可以直接通过对象池取出已经保存的内容继续使用,而不会再重新开辟新的空间
String对象的创建很讲究需要注意的点如下:
a.当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个s在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加
b.Java中,只要使用new关键字来创建对象,则一定会(在堆区)创建一个新的对象
c.使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
d.使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。最后指向堆内存中的对象。
补充:String类型是不可变的字符串, 用来存放数据。如果对字符串需要进行修改, 推荐使用StringBuffer, 线程安全, 效率不高。StringBuilder 也是可变的字符串,线程不安全, 效率高。
2、String的方法
”==”表示判断该两个字符串是否为同一对象,即在内存中的地址是否一样。
equals()将字符串与指定的对象比较。注意此时比较的是内容是否相等(字符串类对此方法进行了覆写)。
返回值 | 方法 | 说明 |
int | length() | 返回字符串的长度 |
boolean | equals() | 判断两个字符串的值是否相等。 |
boolean | equalsIgnoreCase(String anotherString) | 将此 String 与另一个 String 比较,不考虑大小写。 |
返回值 | 方法 | 说明 |
int | indexOf(char ch) | 返回指定字符(串)在此字符串中第一次出现处的索引。如果未出现该字符(串),则返回 -1 。 |
int | indexOf(String str) | |
int | lastIndexOf(char ch, int fromIndex) | 返回指定字符(串)在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。 |
int | lastIndexOf(String str, int fromIndex) | |
char | charAt(int index) | 返回指定索引处的 char 值。 |
char | toCharArray() | 将此字符串转换为一个新的字符数组。 |
boolean | contains(String s) | 当且仅当此字符串包含指定的字符串时,返回 true。 |
boolean | startsWith(String prefix) | 测试此字符串是否以指定的前缀开始。 |
boolean | endsWith(String suffix) | 测试此字符串是否以指定的后缀结束。 |
String | substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串。 |
String | substring(int beginIndex, int endIndex) | 返回一个新字符串,它是此字符串的一个子字符串。 |
String | concat(String str) | 当且仅当此字符串包含指定的 char 值序列时,返回 true。 |
String | replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String | trim() | 返回字符串的副本,忽略前导空白和尾部空白。 |
String | valueOf(Object obj) | 返回 Object参数的字符串表示形式。 Object可以为Integer,double,float,char |
String | toLowerCase() | 都转换为小写字母 |
String | toUpperCase() | 都转换为大写字母 |
String[ ] | split(String regex) | 以regex为分隔符,拆分此字符串并返回 |
public class Test {
public static void main(String[] args) {
// 创建方式 直接赋值: 把字符串常量放在String池中, 自动入池
String str = "abc"; // 推荐
// new 方式: 创建两个对象, 不会自动入池, 有一个是垃圾
String str2 = new String("abc");
String str3 = "abc";
String str4 = "Abc";
// 字符串比较: == equals()
// == 比较地址 equals比较的内容
// equals() 区分大小写
/*
* System.out.println(str.equals(str2)); //true
* System.out.println(str.equals(str3)); //true
* System.out.println(str.equals(str4)); //false
*/
// 不区分大小写的 equalsIgnoreCase(String anotherString)
System.out.println(str.equalsIgnoreCase(str4)); // true
// 比较是否是同一个对象
/*
* System.out.println(str == str2);//false System.out.println(str ==
* str3);//true
*/
// 获取指定位置的字符char charAt(下标) 把String转换为char
System.out.println(str.charAt(0));
// toCharArray() 转换为char数组
// 查找
// 判断字符串是否包含其他字符/字符串 true/false contains(String s)
// System.out.println(str+"是否包含ab:"+str.contains("ac"));
// indexOf(String s) 查找指定字符串第一次出现的位置: 下标 找不到返回-1
String str5 = "hello world";
System.out.println(str5 + "中l第一次出现的位置:" + str5.indexOf("c"));
// indexOf(String s, int formIndex) 从formIndex开始往后查找
// 查找第二个l的位置
System.out.println(str5 + "中l第二次出现的位置:"
+ str5.indexOf("l", str5.indexOf("l") + 1));
// lastIndexOf(String s)查找指定字符串最后一次出现的位置: 找不到返回-1
System.out.println(str5 + "中l最后一次出现的位置:" + str5.lastIndexOf("l"));
// 判断字符串以什么开头 startsWith(String s)
System.out.println(str5 + "是以a开头吗?" + str5.startsWith("a"));
// 判断字符串以什么开头 endsWith(String s)
System.out.println(str5 + "是以d结尾吗?" + str5.endsWith("d"));
// 截取字符串:
String str6 = "男21爱吃猫的鱼";
// substring(int 开始位置) 从开始位置(包括)截取到字符串末尾
System.out.println(str6.substring(1));
// substring(int 开始位置, int 结束位置) 从开始位置(包括)截取到结束位置(不包括)
System.out.println(str6.substring(1, 3));
String str7 = "男,21,爱吃猫的鱼";
// 拆分字符串:String[] split(String 分割符)
String[] rs = str7.split(",");
for (int i = 0; i < rs.length; i++) {
System.out.println(rs[i]);
}
// 获取字符串的长度 length()
System.out.println(str7 + "包含几个字符:" + str7.length());
// 取消字符串的前后空格 trim()
String str8 = " 哈 哈 ";
System.out.println(str8);
System.out.println(str8.trim());
// 判断字符串的内容是否是空 "" null String str9 = ""; String str10 = null;
// isEmply() 判断字符串的内容是否"" 有内容: false 没有内容: true
// 字符串与null的判断: ==null =! null
// System.out.println(str8.isEmpty());
// 大小写转换
// 变成大写: toUpperCase()
// 变成小写 toLowerCase()
}
}