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 可变的原因:

  1. 不是final的

  2. 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

  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 方法区(元空间)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值