JAVA中的String类
1、创建字符串
方式一:
String str=“Hello”;
方式二:
String str2=new String(“Hello”);
方式三:
char[] array={‘a’};
String str3=new String(array);
注意:String为引用类型
引用类似于C语言中的指针,只是在栈上开辟了一小块内存空间保存一个地址,但其不能进行各种数字运算,可以将其看作一个标签,一个对象上可以贴一个,若没有,则该对象会被JVM当作垃圾对象回收掉
Java数组中,String以及自定义的类都是引用类型。
内存布局如图:
若修改上图中的str1,并不算真正修改字符串,而是让str指向了一个新的String对象。
2、字符串比较相等
两个int 变量,判断其相等可用==完成,如下:
int x = 10 ;
int y = 10 ;
System.out.println(x == y);
// 执行结果
true
但在使用String方式时存在两种差异:
1、String使用==比较并不是在比较字符串的内容,而是比较两个引用是否指向一个对象。
2、Java中相比较字符串的内容必须用String类提供的equals.如下:
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true
3、字符串常量池
一种是直接赋值
String str1 = “hello” ;
String类的设计使用了共享设计模式,在JVM底层实际上会自动维护一个对象池(字符串常量池),可以直接引用之前的实例化对象;
另一种是采用构造方法new一个新的String,如下:
String str=new String(“hello”);
缺点是多次开辟可能会成为垃圾空间,比较浪费空间。
优点是可以使用 String 的 intern 方法来手动把 String 对象加入到字符串常量池中,方便下次使用。如下:
String str1 = new String("hello") ;
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
false
String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
true
4、字符串内容不可变
那么如果实在需要修改字符串, 例如, 现有字符串 str = “Hello” , 想改成 str = “hello” , 该怎么办?
常见办法: 借助原字符串, 创建新的字符串
String str = "Hello";
str = "h" + str.substring(1);
System.out.println(str);
// 执行结果
hello
5、字符字节与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换.
1、获取指定位置的字符
String str = “hello” ;
String str = "hello" ;
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h
2、 字符串与字符数组的转换
String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(newString(data,5,5)); // 部分转换
字节与字符串
小结:
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
字符串比较
字符串查找
字符串替换
字符串拆分
字符串截取
其他操作方法
StringBuffer 和 StringBuilder
1、String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer与StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
2、StringBuffer与StringBuilder大部分功能是相似的
3、StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
继承结构:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
1、String变为StringBuffer:利用StringBuffer的构造方法或append()方法
2、StringBuffer变为String:调用toString()方法