1、认识:
1、String 对象用于保存字符串,也就是一组字符序列。
2、字符串的字符使用Unicode编码,一个字符占两个字节。
3、String有很多构造器,构造器重载。
4、String类实现了Serializable接口【可以串行化:可以在网络传输】。
Comparable接口【可以比较大小】
5、String是finall类,不可被继承。
6、String有属性 private final char value[]; 用于存放字符串内容。
7、value是一个final类型,表示不可以修改【即value不能指向新的地址,但是字符内容可变】
2、string创建方法:
方法一:
String s = "hsf";
方法二:
String s2 = new String("hsf");
区别:
方法一:先从常量池看是否有有"hsf"数据,如果有直接指向,没有则重新创建,然后指向。s最终返回的是常量池的地址空间。
方法二:先在堆中创建空间,里面有value属性,指向常量池;如果常量池有"hsf",直接指向,没有则创建,最终返回的是堆中的地址空间。
测试题1:
public class Test1 {
public static void main(String[] args) {
String a = "hsf";
String b = new String("hsf");
System.out.println(a.equals(b)); // t 比较内容是否相等
System.out.println(a == b); // f 比较地址值是否相等
System.out.println(a == b.intern()); // t
System.out.println(b == b.intern()); // f
}
}
1、intern();方法:如果常量池中已经有一个等于String对象的字符串,则直接返回池中字符串地址;如果池中没有,则创建并返回此String对象引用。
2、intern():直接从池中返回地址。
测试题2:
public class Test1 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "hsf";
Person p2 = new Person();
p2.name = "hsf";
System.out.println(p1.name.equals(p2.name)); // t
System.out.println(p1.name == p2.name); // t:比较值
System.out.println(p1.name == "hsf"); // t
}
}
测试题三:
3、string一些方法:
package com.hsf.string;/*
* @author HSF
* @version 8.0
*/
import java.util.Locale;
public class Test1 {
public static void main(String[] args) {
String name = "helloWord";
System.out.println(name.substring(4)); // [4,后面所有):oWord
System.out.println(name.substring(0,5)); // [0,5):hello
System.out.println(name.indexOf('o')); // 4
System.out.println(name.toLowerCase(Locale.ROOT)); // helloword
System.out.println(name.toUpperCase(Locale.ROOT)); // HELLOWORD
System.out.println(name.replace('h','H')); // HelloWord
System.out.println(name); // helloWord replace对原数据没有影响
String add = "E:\\aaa\\bbb";
String[] split_ = add.split("\\\\");
for (String s : split_) {
System.out.println(s);
}
/*占位符:
* 1、%s:表示后面由字符串替换。
* 2、%d:由整数替换。
* 3、%.2f:表示使用小数替换,替换后只会保留小数点后两位,并且四舍五入。
* 4、%c:表示使用char类型替换。
* */
int age = 20;
double grade = 98.1;
char gender = '男';
String formatStr = "我的姓名是%s,年龄是%d,成绩是%.2f,性别是%c";
String info = String.format(formatStr, name, age, grade, gender);
System.out.println(info); // 我的姓名是helloWord,年龄是20,成绩是98.10,性别是男
}
}
class Person{
String name;
}
4、StringBuilder/StringBuffer
String对象是不可变的, 每次进行字符串的连接都会生成新的字符串对象:
在string中修改值不是把原先的值删除,而是重新生成一个值,原来的值还在那,只是对象不指向原来那个值了。
如果需要频繁进行字符串连接时, 不建议使用String字符串, 而是使用StringBuilder/StringBuffer。
- StringBuilder/StringBuffer
- 称为可变的字符串,value数组存放的字符串内容在堆中。
- 最常用的方法是append(), 在当前字符串的后面追加另外一个字符串
- 默认初始化大小: 16
- 当value数组已满,需要扩容, 按 value.length * 2 + 2 大小扩容
- StringBuffer提供的方法都使用了synchronized进行了修饰, 是线程安全的.
StringBuilder不是线程安全的,但是StringBuilder速度更快,如无特殊,优先采用此类。在StringBuilder上主要操作的是append和inset方法,可重载这些方法,以接受任意类型的 数据。
构造器:
public class StringBuffer_ {
public static void main(String[] args) {
// 1、创建一个大小为16的char[],用于存放字符内容
StringBuffer stringBuffer = new StringBuffer();
// 2、通过构造器指定char[]大小
StringBuffer stringBuffer1 = new StringBuffer(100);
// 3、通过给一个string创建:大小为str.length() + 16
StringBuffer stringBuffer2 = new StringBuffer("hell0");
}
}
stringBuffer转换为string类型:
StringBuffer stringBuffer = new StringBuffer();
// stringBuffer-->string:两种方法
String s1 = stringBuffer.toString();
String s2 = new String(stringBuffer);
5、stringBuffer方法: