欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

String常用类及常用方法

程序员文章站 2024-02-28 11:41:10
...

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

相关标签: 个人学习