1、String表示字符串类型,属于引用数据类型,不属于基本数据类型。
拓展:
数据类型分为基本数据类型和引用数据类型
基本数据类型值的是八大基本数据类型
引用数据类型指的是类(class)、接口(interface)、数组([])
2、在java中随便使用双引号括起来的都是String对象。
例如:
“abc”,“def”,“hello world!”,这是3个String对象。
3、java中规定,双引号括起来的字符串,是不可变的,也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也不能变成"ab"
4、在JDK当中双引号括起来的字符串,例如:“abc” "def"都是直接存储在“方法区”的“字符串常量池”当中的。
5、为什么SUN公司把字符串存储在一个“字符串常量池”当中呢?
答案:
因为字符串在实际的开发中使用太频繁。为了执行效率,所以把字符串放到了方法区的字符串常量池当中。
- public class StringTest01 {
- public static void main(String[] args) {
- // 这两行代码表示底层创建了3个字符串对象,都在字符串常量池当中。
- String s1 = "abcdef";
- String s2 = "abcdef" + "xy";
-
- // 分析:这是使用new的方式创建的字符串对象。这个代码中的"xy"是从哪里来的?
- // 凡是双引号括起来的都在字符串常量池中有一份。
- // new对象的时候一定在堆内存当中开辟空间。
- String s3 = new String("xy");
- }
- }
图示:
- public class StringTest02 {
- public static void main(String[] args) {
- String s1 = "hello";
- // "hello"是存储在方法区的字符串常量池当中
- // 所以这个"hello"不会新建。(因为这个对象已经存在了!)
- String s2 = "hello";
-
- // == 双等号比较的是变量中保存的内存地址
- System.out.println(s1 == s2); // true
-
- String x = new String("xyz");
- String y = new String("xyz");
-
- // == 双等号比较的是变量中保存的内存地址
- System.out.println(x == y); //false
- }
- }
图示:
栈和堆的区别:
1、栈是由系统自动分配的,堆是人为申请开辟的
2、栈获得的空间较小,堆获得的空间较大
3、栈由系统自动分配速度比较快,而堆速度比较慢
4、栈是连续的空间,堆是不连续的空间
5、栈一般存放的是基本数据类型,而堆只存放对象
示例:
- //最常用的方式
- String s1 = "我是中国人";
- System.out.println(s1);//我是中果人
示例:
- String s2 = new String("我是中国人");
- System.out.println(s2);//我是中果人
示例:
- char[] c = {'我' , '是', '中', '果', '人'};
- String s3 = new String(c);
- System.out.println(s3);//我是中果人
示例:
- char[] c = {'我' , '是', '中', '果', '人'};
- String s4 = new String(c, 2, 3);
- System.out.println(s4);//中果人
示例:
- byte[] b = {65, 66 ,67, 68};
- String s5 = new String(b);
- System.out.println(s5);//ABCD
示例:
- byte[] b = {65, 66 ,67, 68};
- String s6 = new String(b, 1, 2);
- System.out.println(s6);//BC
示例:
- StringBuffer sb1 = new StringBuffer("我是福建人");
- String s7 = new String(sb1);
- System.out.println(s7);//我是福建人
示例:
- StringBuilder sb2 = new StringBuilder("我是厦门人");
- String s8 = new String(sb2);
- System.out.println(s8);//我是厦门人
初级答案:
Stringbuffer线程安全,Stringbuilder线程不安全。
中级答案:
你在代码中点开它们的append方法,你会看到stringbuffer的方法前面用的synchronized方法修饰的,而Stringbuilder是没有的。
这就是本质区别。一个线程安全,一个线程不安全。
高级答案:
StringBuffer是Java1.0时代加入的上古类,因为早期开发人员的判断失误,导致性能底下。
StringBuilder是Java1.5时期加入的新类,性能高,纠正了StringBuffer的错误。
架构答案:
1、StringBuffer 与 StringBuilder 两者的功能完全相等。
2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全,而StringBuffer则每次都需要判断锁,效率相对更低一般。
返回指定位置的字符
示例:
- String s1 = "hello world";
- System.out.println(s1.charAt(6));//w
比较两个字符串。相等返回0;前大后小返回1;前小后大返回-1
示例:
- String s2 = "abc";
- String s3 = "xyz";
- String s4 = "xyz";
- System.out.println(s2.compareTo(s3));//-23
- System.out.println(s3.compareTo(s4));//0
- System.out.println(s4.compareTo(s1));//16
判断字符串是否包含s
示例:
System.out.println(s1.contains("s"));//false
判断字符串是否以suffix结尾
示例:
- System.out.println(s1.endsWith("world"));//true
- System.out.println(s1.endsWith("t"));//false
判断两个串是否相等
示例:
System.out.println(s2.equals(s3));//false
忽略大小写判断两个串是否相等
示例:
- String s5 = "HELLO worLD";
- System.out.println(s1.equalsIgnoreCase(s5));//true
将字符串串变成字节数组返回
示例:
- byte[] b = s1.getBytes();
- System.out.println(Arrays.toString(b));//[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
返回str在字符串第一次出现的位置
示例:
- System.out.println(s1.indexOf("world"));//6
- System.out.println(s1.indexOf("h"));//0
字符串是否为空
示例:
System.out.println(s1.isEmpty());//false
字符串长度
示例:
System.out.println(s1.length());//11
返回str最后一次出现的位置
示例:
- String s6 = "javapythonc++cphpjavapython";
- System.out.println(s6.lastIndexOf("java"));//17
- System.out.println(s6.lastIndexOf("h"));//24
用replacement替换字符串target的字符
示例:
- String s7 = "name=zhangsan&age=18&sex=男";
- String newS7 = s7.replace("&", ";");
- System.out.println(newS7);//name=zhangsan;age=18;sex=男
将字符串以regex分割
示例:
- String[] splitS7 = s7.split("&");
- System.out.println(Arrays.toString(splitS7));//[name=zhangsan, age=18, sex=男]
判断字符串是否以prefix开始
示例:
- System.out.println(s6.startsWith("java"));//true
- System.out.println(s6.startsWith("python"));//false
从beginIndex开始截取字串
示例:
System.out.println(s6.substring(10));//c++cphpjavapython
截取beginIndex到endIndex - 1的字符串
示例:
System.out.println(s6.substring(10, 13));//c++
将字符串转换乘char数组
示例:
- char[] charS6 = s6.toCharArray();
- System.out.println(Arrays.toString(charS6));//[j, a, v, a, p, y, t, h, o, n, c, +, +, c, p, h, p, j, a, v, a, p, y, t, h, o, n]
字符串转小写
示例:
System.out.println(s5.toLowerCase());//hello world
字符串转大写
示例:
System.out.println(s6.toUpperCase());//JAVAPYTHONC++CPHPJAVAPYTHON
去除字符串两边空格
示例:
- String s8 = " 你 好 世 界 ";
- System.out.println(s8.trim());//你 好 世 界
将 i 转换成字符串
示例:
- System.out.println(String.valueOf(123));//123
- System.out.println(String.valueOf(3.14));//3.14
- System.out.println(String.valueOf(true));//true
- System.out.println(String.valueOf(new Object()));//java.lang.Object@4554617c
- //valueOf会自动调用toString()方法