1.创建字符串
2.字符串比较相等
3.字符串常量池
4.理解字符串不可变
5.字符、字节与字符串
6.字符串常见操作
7. StringBuffer 和 StringBuilder
这一块主要会谈到String类的基本用法和常见操作,字符串常量池,常见操作以及StringBuffer和StringBuilder。
1.创建字符串
创建字符串有三种方式
//方式1
String str = "hello";
//方式2
String str2 = new String("hello");
//方式3
char[] arr = {'a','b','c'};
String str3 = new String(arr);
内存布局如下:
只要是双引号引起来的,如“hello”,都会被存到字符串常量池当中,且一旦一个字符串常量被存储到常量池当中后,如果后续还有相同的字符串要存放,首先要看当前常量池中是否有该字符串常量。同时,由上图可以看出,修改str的值对str2是没有影响的。
2.字符串比较相等
1.“==”比较的时候有两种情况
等号两边是简单类型,直接比较
public static void main(String[] args) {
int x = 10;
int y = 10;
System.out.println(x == y);
}
结果为:
true
引用类型:引用是否相同(情况较多)
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2);
}
结果为:
false
第二种:
public static void main(String[] args) {
String str1 = "hello";
String str2 = "he" + "llo";
System.out.println(str1 == str2);
}
结果为:
true
编译期间:str2就是“hello”,在字符串常量区,所有引用相同。
第三种:
public static void main(String[] args) {
String str1 = "hello";
String str2 = "he" ;
String str3 = str2 + "llo";
System.out.println(str1 == str3);
}
结果为:
false
String使用“==”并不是比较字符串的内容,而是比较两个引用是否指向同一个对象。要想比较字符串的内容,必须采用String提供的equals方法
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2));
这时候的运行结果就是true了。
3.字符串常量池
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2);
str1和str2不相等的原因是,str1在字符串常量池当中,而str2不在字符串常量池中。我们可以使用String的intern方法手动把String对象加入到字符串常量池中。
String str1 = "hello";
String str2 = new String("hello").intern();
System.out.println(str1 == str2);
此时运行的结果为:
true
intern():将对象的引用存入到字符串常量池中,检查常量池中是否含有“hello”,如果有,返回常量池的引用给str2.
4.理解字符串不可变
一个栗子!~
String str = "hello";
str += "world";
str +="!";
System.out.println(str);
结果为:
helloworld!
内存布局如下:
如果需要修改字符串,则借助“substring()”来修改。
String str = "Hello";
//修改1号下标以后的内容
str = "h" +str.substring(1);
System.out.println(str);
运行结果:
hello
5.字符、字节与字符串
字符与字符串
1、获取指定位置字符
String str = "Hello";
System.out.println(str.charAt(0));
结果为:
H
2、字符串与字符数组转换
toCharArray()
String str = "Hello";
char[] data = str.toCharArray();
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
运行结果:
H e l l o
2、字节与字符串
String str = "Hello";
//String转byte[]
byte[] data = str.getBytes();
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
//byte[] 转 String
System.out.println(new String(data));
6.字符串常见操作
1.字符串比较
String str1 = "hello";
String str2 = "Hello";
//不区分大小写比较
System.out.println(str1.equals(str2));
//区分大小写比较
System.out.println(str1.equalsIgnoreCase(str2));
//comepareTo比较,区分大小写
System.out.println(str1.compareTo(str2));
结果为:
false
true
32
2.字符串查找
public static void main(String[] args) {
//最好用最方便的就是contains
String str = "hello";
System.out.println(str.contains("xx"));
//使用indexOf()方法进行位置查找
String str2 = "helloworld";
System.out.println(str2.indexOf("wor"));//5,从w开始索引
System.out.println(str2.indexOf("bit"));//-1没有查到
if(str2.indexOf("hello") != -1) {
System.out.println("查到了!");
}
//判断开头或结尾
String str3 = "**qwdseihd123";
System.out.println(str3.startsWith("*"));
System.out.println(str3.endsWith("2"));
}
}
运行结果:
false
5
-1
查到了!
true
false
3.字符串替换
public static void main(String[] args) {
String str = "hello";
//替换所有相同字符
System.out.println(str.replaceAll("l","o"));
//替换一个字符
System.out.println(str.replaceFirst("l","0"));
}
}
运行结果:
heooo
he0lo
4.字符串拆分
拆分一次
public static void main(String[] args) {
String str = "hello world !!!";
//按空格拆分
String[] result = str.split(" ");
for (String s : result) {
System.out.println(s);
}
}
结果为:
hello
world
!!!
拆分两次:
public static void main(String[] args) {
String str = "heu= iqh =hello world = !!!";
String[] result = str.split(" ");
for (String s : result) {
String[] ss = s.split("=");
for(String sss : ss) {
System.out.println(sss);
}
}
}
结果为:
heu
iqh
hello
world
!!!
5.字符串截取
public static void main(String[] args) {
String str = "helloworld";
//索引从0开始
System.out.println(str.substring(5));
//前闭后开,表示从第二个元素索引到第五个元素
System.out.println(str.substring(2,5));
}
结果为:
world
llo
7. StringBuffer 和 StringBuilder
StringBuilder的使用实例
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//字符串拼接
sb.append("hello").append("world");
fun(sb);
System.out.println(sb);
}
public static void fun(StringBuffer temp) {
temp.append("\n").append("www");
}
StringBuffer 和 StringBuilder和String的用法基本类似,但是String的内容无法修改,而StringBuffer的内容修改。String通过“+”进行拼接的时候,底层被优化为StringBuilder。StringBuffer 采用同步处理,属于线程安全操作;而StringBuilder未来用同步处理,属于线程不安全操作。