String常用类及常用方法
目录
String类
String:字符串,使用一对""表示
1. String类声明为final,不可以被继承
2. String类 实现了Serializable接口,表示字符串是支持序列化的
实现了Comparable接口,表示字符串是可以比较大小的
3. 内部定义了final char[] value 用于存储字符串数据
4. String代表不可变的字符序列:改变原来的字符串内容,都需要重新建
5. String对象的创建的两种方式
字面量方式 String str1 = “abc”;
在常量池当中,是不会存储相同内容的
new的:String str2 = new String() 需要进堆
String的不可变性:
当对字符串重新赋值、对当前存在的字符串进行连接操作时、以及replace()方法时
都需要重新指定内存区域赋值,不能使用原有的value进行赋值
字符串拼接方式的对比:
常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
但是只要其中一个是变量,结果就在堆中
String类的常用方法
String s1 = "helloworld";
s1.length()
s1.charAt(2) ****
boolean b = s1.isEmpty() //返回boolean
String s2 = s1.toLowerCase() //只是将s1全都小写的字符串返回给s2,自己没有变
String s3 = s1.toUpperCase()
String s4 = “ he llo ”
String s5 = s4.trim() //将s4前后的空格去除,中间的空格没有变,返回给s5
//但是s4自己没有改变
boolean b2 = s1.equals(s2) //比较的是s1、s2字符串的内容
boolean b3 = s1.equalsIgnoreCase(s2) //忽略大小写来比较内容
s2 = s1.concat("!!!") //将指定字符串连接到此字符串的结尾,等价于"+"
//*****比较两个字符串,返回的是 int 类型
int compareTo(String anotherString) //返回的是int值,负数代表this小
String s5="abc";
String s6="abd";
s5.compareTo(s6) 比较两个字符串的大小 涉及到字符串排序
//*****字符串截断操作
String s2 = s1.substring(2);// 表示从下标为2处开始要
String s3 = s1.substring(2,7); //表示从下标为2处截止到6,下标为7不包含
//在Java集合操作中,一般要是从左取到右,都是左闭右开
boolean b = s1.endsWith(String suffix) //测试此字符串是否以指定字符串结尾的
boolean b = s1.startsWith(String prefix) //测试此字符串是否以指定字符串开始的
boolean b = s1.startsWith(String prefix,int a) //测试是否在从指定索引开始的字符串与给定相同
boolean b = s1.contains(CharSequence s) //当且仅当 this 中包含s 返回true
//返回str在 this 中第一次出现的第一个位置的索引,如果没有出现,返回-1
int a = s1.indexOf(String str)
//从n索引开始找,str在this中第一次出现的第一个位置的索引
int a = s1.indexOf(String str,int n)
//从后往前找,返回str在this中第一次出现的第一个位置的索引
int a = s1.lastIndexOf(String str)
//从指定的位置开始反向搜索,str在 this 中第一次出现的第一个位置的索引
int lastIndexOf(String str,int n)
String s = s1.replace(char oldChar,char newChar) ,返回新的字符串
String s = s1.replace(CharSequence target,CharSequence replacement)
String s = s1.replaceAll() 将全部符合给定正则表达式的值替换成第二个参数
boolean b = s1.matches(regx) 符合给定正则表达式的,返回true
String与其他结构转换:
String与基本数据类型(包装类)
String —> Integer
int a = Integer.paserInt(str);
Integer—> String
String str = String.valueOf(123);
String str2 = num+""; //只要有变量参与,str2就在堆里
String与char[]转换
String —> char[]
String str1 = “abc123”;
char[] charArray = str1.toCharArray();
char[] —> String
char[] arr = new char[]{‘a’,‘b’,‘c’};
String str2 = new String(arr);
String与byte[]转换
String —> byte[] 编码
byte[] bytes = str1.getBytes() ; //使用默认的字符集,进行转换
byte[] bytes1 = str1.getBytes(“gbk”); //使用gbk来编码
byte[] —> String 解码
new String(new byte[]{}); //使用默认的字符集进行解码
如果编码的时候用gbk 而解码的时候用UTF-8,就会出现乱码
String StringBuffer StringBuilder
String(JDK1.0):不可变的字符序列 效率最低
StringBuffer(JDK1.0):可变的字符序列;线程安全的;效率低
StringBuilder(JDK5.0):可变的字符序列;线程不安全的;效率高
首先看是不是多线程问题,如果不是多线程,或者不涉及线程安全问题,使用StringBuilder
如果这个字符串是共享数据的话,则应该把这个字符串用StringBuffer
三者共同点:
底层都是由字符数组构成。
三者之间的相互转换:
String<—>StringBuffer/StringBuilder 互调构造器就可以
String(sb)
StringBuffer(String str) 构造器
StringBuffer.toString()
StringBuffer/StringBuilder 可变的原因:
-
不是final的
-
StringBuffer sb1 = new StringBuffer();
如果是空参的构造器,则底层 char[] value = new char[16] ;
创建一个长度是16的char数组
sb1.append(‘a’); // value[0] = ‘a’;StringBuffer sb2 = new StringBuffer(“abc”);
如果是有参数的的构造器,则底层 char[] value = new char[str.length()+16];
创建的时候,不管怎么都多16
但是要输出 sb1.length() ------3 -
如果添加的数据底层char型数组装不下了,需要扩容
默认情况下,扩容为原来容量的 2倍+2,同时将原有数组中的元素复制到新数组中
如果要添加的数组实在太大,就索性拿要添加的数组的长度来当做扩容的长度
在使用时,建议使用 StringBuffer(int capacity)/StringBuilder(int cap)这个构造方法
StringBuffer(StringBuilder)中的常用方法
增、删、改、查、插、遍历、长度
StringBuffer sb1 = new StringBuffer(20);
s1.append(1); //append方法提供了各种重载 并可以方法链 可以一直append
s1.delete(2,4); //删掉索引为 2,3的元素
s1.replace(2,4,"hello"); //替换原先索引是2,3上的元素,要添加的数组长度随意
s1.insert(2,"hello");
s1.reverse(); // 翻转 String翻转不了
s1.setCharAt(int n,char ch);
字符串常量池在JVM中的位置:
1.6 方法区(永久区)
1.7 堆空间
1.8 方法区(元空间)
下一篇: 第一章语言篇