String类
public final class String extends Object
1、用final修饰的最终类,是代表字符串的类;
2、字符串在底层是以字符数组的形式存储;
3、任何的字符串都是String的对象
4、字符串常量可以共享(下图)
String s1 = “ab”;
String s2 = new String(“ab”);
s1和s2指向的是同一块内存空间,区别在于s1先指向运行时常量池,运行时常量池再指向堆内存,而s2是先在堆内存中开辟一块空间,用来存储运行时常量池中value的地址,然后根据value所在空间的地址去堆内存中找对应的字符数组,若没有,则在常量池中新开辟一块空间,并在堆内存中创建对应的字符数组,若有,直接调用即可。
String s3 = “a”+“b”;
字符串在使用+拼接的时候底层实际上是调用了StringBuilder中的append的方法
String s4 = “a”; 产生1个对象
s4 = s4+”b” 产生4个对象(new StringBuilder,”b”,”ab”,toString方法会返回一个new String对象)
字符串拼接方式:
1、+
2、直接使用StringBuilder的append方法
3、concat()
StringBuilder和StringBuffer的方法签名一模一样,用法一致,区别在于前者是线程不安全的,后者是线程安全的
表示没有输入任何字符: str.equals(””)
常用方法:
创建字符串对象:String str = “”;
调用方法:
str.length() 获取字符串长度
str.charAt() 获取指定下标位置字符
str.toCharArray() 将字符串转化为字符数组
字符数组转化为字符串
char[] c = {‘ ’,’ ’,’ ’,};
String str = new String(c);或者String str = new String(c,起始位置,个数); 指定要转换的字符个数
str1.compareTo(str2) 按字典顺序比较两个字符串(相减不为零才返回该差的值,否则会一致遍历,若长度不等,较短与较长对应值都相等,则返回长度之差)
str1.compareToIgnoreCase(str2) 忽略字母大小写进行比较
str.toUpperCase() 转化为大写
str.toLowerCase() 转化为小写
注意:字符串提供了一系列的操作而不改变原字符串的方法,操作的结果是产生一个新的字符串,原字符串并没有发生任何改变
str1.equals(str2) 判断字符串是否相等
str1.equalsIgnoreCase(str2) 忽略大小写
instanceof 判断对象和类的关系
对象 instanceof 类/接口 表示判断对象是否是指定类/接口及其父类/父接口的对象
如果对象的实际类型继承或者实现类/接口,则该对象也是继承或者实现的类/接口的对象
str1.concat(str2) 将新字符串拼接在原字数串尾端(底层实际是数组的复制合并过程)
str.contains(“”) 判断是否包含,只能判断具体子串
str.endsWith(“”) 后缀(判断是否以””中的字符结束)
str.startsWith(“”) 前缀
str.getBytes(“utf-8”) 字符串转字节(括号中可以指定编码,默认是GBK)
str.hashcode() 字符串的哈希码唯一
str.indexOf(‘’) 获取字符/字符串在给定的字符串中第一次出现时的下标,也可以指定从某个下标开始找str.indexOf(“”,count),表示从下标为count的位置开始往后找,若没有该字符/字符串,则返回-1
str.lastIndexOf() 获取字符/字符串在给定的字符串中最后一次出现时的下标,也可以指定从某个下标开始找str.lastIndexOf(“”,count),表示从下标为count的位置开始往前找,若没有该字符/字符串,则返回-1
str.intern() 强制返回指向给定的字符串的常量池地址
str.isEmpty() 判断字符串的长度是否为0,注意区别于null,长度:0 != null
str.replace(‘’,’’) 用指定字符替换原字符
str.substring(起始,结束) 截取指定字符串,一般表示范围的时候,习惯上包头不包尾/含小不含大
str.trim() 去掉字符串前后的空白
String str = String.valueOf() 将其它类型(包括基本类型和引用类型)的数据转化为字符串
注意:打印一个对象(引用类型)时,底层先调用String.valueOf()方法,当对一个对象进行valueOf操作的时候,底层实际上是调用了Object对象的tostring方法,因此输出结果是该对象的地址
特殊的:打印字符数组时,底层也是先调用valueOf()方法,但该方法返回值是new String(),因此输出的结果是对应字符数组的字符串
获取字符串中的字符
将字符串用split方法按指定的正则规则切分成字符串数组,遍历该字符串数组,得到单个字符
String s1 = "a,1,2,b,4,d"; String[] s2 = s1.split(","); for(String c:s2){ System.out.println(c); }
字符串和其它类型数据的互相转化
·基本数据类型—>字符串
1、String s = String.valueOf(八种基本类型)
2、String s = “”+八种基本类型数据
3、StringBuilder s = new StringBuilder().append(八种基本类型数据);
·字符串—>基本数据类型
int i = Integer.parseInt(); //这种方法除了字符不适用外,其它七种基本类型都适用,只需要将数据类型换为对应的即可
char c = s.charAt(0); //字符串转字符(字符串只能有一个字符),其中s是String对象
·数型数组—>字符串(数型数组包括整数和小数)
int[] in = {1,2,3,4,5}; String st = ""; for (int i = 0; i < in.length; i++) { String s = String.valueOf(in[i]); st += new String(new StringBuilder().append(s)); } System.out.println(st);
·字符串—>数型数组
String s = "123456"; char[] cs = s.toCharArray(); for (char c : cs) { int i = c-'0'; System.out.println(i); }
·字符数组—>字符串
char[] cs = {'a','b','c','d','e'};
String s = "";
s+=new String(new StringBuilder().append(cs));
System.out.print(s);
·字符串—>字符数组
String s = "abcde";
char[] cs = s.toCharArray();
for(char c:cs)
System.out.println(c);