String是一个特殊的包装类数据,可以用:
String str = new String("abc");
String str = "abc";
两种形式来创建,第一种是用new()来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象;而第二种是先在栈中创建一个对String类的对象引用变量str ,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str 指向"abc",如果已经有"abc",则直接令str 指向"abc"。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用 == ,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); // true
可以看出str1 和str2 指向同一个对象
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); // false
用new的方式是生成不同的对象,每一次调用都生成一个新的对象。
因此用第二种方式(String str = “abc”;)创建多个"abc"字符串,在内存中其实只存放一个对象而已。这种写法有利于节省内存空间,同时它可以在一定程度上提高程序的运行速度,因为jvm(java virtual machine)会自动根据栈中数据的实际情况来决定是否有必要创建新的对象。而对于String str = new String(“abc”); 的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新的对象,从而加重了程序的负担。
常量池是JVM的一块特殊的内存空间。和堆没什么关系
1.String s1 = "ubuntu";
String s2 = “ubuntu”;
2.String s3 = new String("ubuntu");
String s4 = new String("ubuntu");
String类:字符串不可变的,字符串常量池-堆
new String()
new String("")
new String(char[] )
new String(byte[], charset)
String中将equals()、toString()重写过了
判断a和b的类型是否一致
a instanceof b
String str = "hello hi haha\n\r\t";
** 获得字符串长度 -> 字符个数(空格、转义字符算一个字符)**
System.out.println(str.length());//16
将字符串转换成对应的字符数组
char[] chs = str.toCharArray();
System.out.println(Arrays.toString(chs));
//[h, e, l, l, o, , h, i, , h, a, h, a,
,
, ]
获取字符串中指定下标对应的字符
char c = str.charAt(6);
System.out.println(c);//h
String str = "白日@依山尽,@黄河入海流";
切割字符串
从指定下标位置开始(包括此位置),截取到最后
String s1 = str.substring(4);
System.out.println(s1);//山尽,@黄河入海流
从指定下标位置开始,到指定下标结束,前包含,后不包含
String s2 = str.substring(4, 6);
System.out.println(s2);//山尽
下标位置找不到,返回 -1
获得给定的字符第一次出现的位置 - 下标
int index = str.indexOf('@'); // 2
System.out.println(index);
从下标4开始,获得给定的字符第一次出现的位置
index = str.indexOf('@', 4);
System.out.println(index);//7
index = str.indexOf("山尽"); // 4
index = str.indexOf("山尽", 4);// 4
str.lastIndexOf('@');// 7
// 192.168.6.66
String str = "\tlucy ";
去掉前后两端的空格
str = str.trim();
System.out.println(str + "1");//lucy1
str = "hz_liuzb@163.com";
是否以指定字符串结尾
boolean flag = str.endsWith(".com");
System.out.println(flag);//true
是否以指定字符串开始
flag = str.startsWith("+86");
// gbk GBK Gbk
str = "Gbk";
全部变大写
str = str.toUpperCase();
System.out.println(str);//GBK
全部变小写
str = str.toLowerCase();
System.out.println(str);//gbk
String str1 = "gbk";
String str2 = "GBK";
System.out.println(str1.equals(str2));//false
忽略大小写的判断
System.out.println(str1.equalsIgnoreCase(str2));//true
str = "";
// str = null;
判断字符串长度是否为0
System.out.println(str.isEmpty());//true
将所有其他类型对象变成字符串类型
String strP = String.valueOf(new People());
System.out.println(strP);//null,0
StringBuilder sb = new StringBuilder("hello");
// new String(sb);
追加
sb.append("hi");
System.out.println(sb.toString());//hellohi
sb.insert(0, "ha!");
System.out.println(sb.toString());//ha!hellohi
sb.delete(0, 3);
System.out.println(sb.toString());//hellohi
sb.reverse(); // 反转
System.out.println(sb.toString());//iholleh
sb.replace(3, 5, "**");
System.out.println(sb.toString());//iho**eh
正则表达式:
字符类 预定义字符类 Greedy数量词
[^a-z] 0-9 @163.com
. 表示.本身
? * +