String的深度剖析

String创建对象

1.如果常量池中无字符串"hello",将放入常量池;

String str1 = "hello";

String的深度剖析_第1张图片

2.通过new产生一个新的String对象,如果常量池中有字符串"hello",则引用"hello"

String str2 = new String("hello");

String的深度剖析_第2张图片3.通过new创建String对象时一定生成了新的对象,并且String源码中构造方法的形参列表value[] 会将"hello"的引用传给new String;

String、字节、字符之间的转换

1.String——字符

char[] chars = {'h','e','l','l','o'};
//将字符数组中的所有内容变为字符串
String str = new String(chars);
//从0号下标开始,选取三个数;结果为"hel"
String str2 = new String(chars, 0, 3);
//获取字符串指定索引位置的字符,索引从0开始
char ch = str.charAt(1);
//将字符串变为数组返回
char[] chars2 = str.toCharArray();

2.String——字节

byte[] bytes = {97,98,99,100};
//将字节数组转为字符串
String str1 = new String(bytes);
//将部分字节数组中的内容转变为字符串,从0号下标开始,选取三个数;结果为abc
String str2 = new String(bytes, 0,3);
//将字符串以字节数组形式返回
byte[] bytes2 = str1.getBytes();

3.何时用byte[]何时用char[]
byte[]是一个字节一个字节的处理,适合针对二进制数据操作,如 .class文件;char[]是一个字符一个字符的处理,针对文本数据,如中文文件;

字符串常见操作

字符串的比较

String str1 = "hello";
String str2 = new String("Hello");
String str3 = new String(str1);
//区分大小写的内容比较
System.out.println(str1.equals(str2));//false
//不区分大小写的内容比较
System.out.println(str1.equalsIgnoreCase(str2));//true
//比较两个字符串大小的关系
System.out.println(str1.compareTo(str2));//32   'h' - 'H' = 32;

intern()

String str1 = "hello";
String str2 = new String("hello").intern();
System.out.println(str1 == str2);//true

intern()的作用是,如果常量池中有该字符串,则直接将此引用返回出去进行赋值;

字符串查找

String str1 = "hello word";
//判断一个子字符串是否存在
System.out.println(str1.contains("llo"));//true
//从头开始查找指定字符的位置,查到返回索引,否则返回-1;
System.out.println(str1.indexOf("w"));//6
//从指定位置开始查找子字符串位置(首字符的位置)
System.out.println(str1.indexOf("heo", 0));//-1
//由后向前查找字符串的位置
System.out.println(str1.lastIndexOf("llo"));//2
//从指定x位置由后向前找(从倒数x个字符开始)
System.out.println(str1.lastIndexOf("llo", 3));//2
//判断是否以指定字符串开头
System.out.println(str1.startsWith("he"));//true
//从指定位置开始判断是否以指定字符串开头
System.out.println(str1.startsWith("llo",2));//true
//判断是否以指定字符串结尾
System.out.println(str1.endsWith("ord"));//true

字符串替换

String str1 = "hello word";
//***替换所有的指定内容,并非改变str1对象,而是返回一个新字符串***
System.out.println(str1.replace("o", "x"));//hellx wxrd
System.out.println(str1);//hello word
//替换首个内容
System.out.println(str1.replaceFirst("o", "x"));//hellx word

字符串拆分

String str1 = "hello word";
//将字符串全部拆分
String[] strings = str1.split("o");
System.out.println(Arrays.toString(strings));//[hell,  w, rd]
//将字符串部分拆分,该数组长度就是limit极限
String[] strings1 = str1.split("o", 3);
for (String s : strings1){
    System.out.println(s);//hell   w   rd
}
String str2 = "1994.5.27";
//若拆分为开头为空,原因在split的源码
String[] strings2 = str2.split("\\.", 3);//需用转义字符,
System.out.println(Arrays.toString(strings2));//

字符串截取

String str1 = "hello word";
//从指定索引截取到结尾
System.out.println(str1.substring(2));//llo word
//截取部分内容
System.out.println(str1.substring(2, 4));//ll 右边为开区间

其他操作方法

String str1 = " Hello Word 哈";
String str2 = new String(" Hello Word 哈");
//去掉字符串左右空格,保留中间空格
System.out.println(str1.trim());//Hello Word 哈
//字符串转大写
System.out.println(str1.toUpperCase());// HELLO WORD 哈
//字符串转小写
System.out.println(str1.toLowerCase());// hello word 哈
//字符串入池操作
System.out.println(str2.intern() == str1);//true
//字符串连接,等同于+不入池
System.out.println(str1.concat("喽"));// Hello Word 哈喽
//取得字符串长度
System.out.println(str1.length());//13
//判断是否为空字符串(空表示长度为0)
System.out.println(str1.isEmpty());//false

StringBuffer 和 StringBuilder

用法

StringBuffer 和 StringBuilder大部分功能相似

StringBuilder sb = new StringBuilder("hello");
sb.append(" word");
System.out.println(sb);//hello word
//对比String
String str = new String("hello");
str.concat(" word");
System.out.println(str);//hello

区别

1.String 的内容不可修改,StringBuffer 和 StringBuilder可以修改
2.StringBuffer 和 StringBuilder的大部分功能相似
3.StringBuffer采用同步处理,为线程安全操作;StringBuilder采用异步处理,属于线程不安全操作

你可能感兴趣的:(java,String,java)