深入理解String及了解常用StringAPI方法

String 类的概念及特点

最终类,没有子类
所有字符串常量都是String类的对象
String类底层是根据不可变字符数组来实现数据的存储,String类创建对象后无法改变对象的内容
所有的常量都是放在方法区的运行时常量池中
如果常量池中定义了字符串对象的引用,后面的字符串对象的内容和前面一致,共同用一个

String s1 = “ab”;
String s2 = new String(“ab”)
在这里插入图片描述
解释:

  • String s1 = “ab”;
  • String s2 = new String(“ab”)
  • s1 指向方法区运行时常量池
  • s2 指向堆
  • 如果运行时常量池已经定义String类对象的内容,后面的对象内容如果和前面内容一致,就共同用一个

String s1 = “ab”
String s2 = “a”
s2 += “b”

在这里插入图片描述
解释:

  • String s3 = “a”+“b” //如果参与运算的都是常量,在编译期间就会进行优化,直接计算结果赋给给左边
  • s2 += “b” 底层执行 StringBuilder操作,创建对象
  • s2指向堆里

StringBuilder 和 + 做拼接效率对比

  String s = "";
  long start = System.currentTimeMillis();
  for(int i=0;i<100000;i++){
      s+="a";  //每次产生3个对象
  }
  long end = System.currentTimeMillis();
  System.out.println(end - start);
  StringBuilder sb = new StringBuilder();
  long start1 = System.currentTimeMillis();
  for(int i=0;i<100000;i++){
      sb.append("i"); 每次产生一个对象
  }
  long end1= System.currentTimeMillis();
  System.out.println(end1-start1);

综上,如果拼接大量数据使用StringBuilder拼接效率更高

StringBuilder从JDK1.5出现,线程不安全,但是效率高
StringBuffer 从JDK1.0出现,线城安全,但是效率低

String API方法

1、charAt()

给定下标值,返回对应的字符

2、length()

返回字符串长度

3、toCharArray()

把字符串转为字符数组
通过new String(char[] cs,int offset,int count,“编码”) 将数组内容转为字符串返回

String s = "sfadsfdsaf";
//给定下标值返回对应的字符
 System.out.println(s.charAt(1));
 //返回字符串长度
 System.out.println(s.length());
 //将字符串转为数组
 char[] chars = s.toCharArray();
 String newStr = new String(chars,0,chars.length);
 System.out.println(newStr);
4、compareTo()

针对两个字符串对象进行字典比较
底层执行:

  • 将两个字符串对象的内容复制给两个字符数组
  • 针对两个字符数组进行求差值
  • 如果差值不为0,就返回差值
  • 如果差值为0,就继续往后移动下一个坐标求差值
  • 如果所有对应字符都为0,就把两个数组长度的差值返回
    通过CompareTo方法可以堆字符串对象进行字典排序
    如果方法的返回值是负数,那么前面对象小于后面对象
    如果方法的返回值是正数,那么前面对象大于后面对象
    如果方法返回值是0,那么前后对象内容一致
String str1 = "abc";
String str2 = "ABC";
System.out.println(str1.equalsIgnoreCase(str2));
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareToIgnoreCase(str2));
5、concat()

把新串拼接到原串的尾部

6、contains()

判断给定字符串是否是原字符串的子串

7、startsWith()/endsWith()

判断是否以字串开头或结尾

8、equals()

不仅仅比较对象的地址值还比较两个对象的内容是否完全一致(重写了Object类的方法)

9、getBytes()

按照指定码表将字符串转为字节数组进行返回
new String(byte[] bs,int offset,int length,charSet charset)

10、hashCode()

重写Object类里的方法,重新定义计算哈希码的值的算法,只和字符串对象的内容以及顺序有关
重写后的方法只和对象的内容及顺序有关系

11、indexOf()

返回子串第一次出现的下标值

12、intern()

可以把地址值的指向改变成指向方法区

String str7 = "abc";
String str6 = new String("abc");
//false
System.out.println(str7 == str6);
str6 = str6.intern();
//true
System.out.println(str7 == str6);
13、isEmpty()

判断字符串对象是否是空串

String str = "1";
//false
 System.out.println(str.isEmpty());
 String str1 = new String("");
 //true
 System.out.println(str1.isEmpty());
 String str2 = null;
 //报错  java.lang.NullPointerException
 System.out.println(str2.isEmpty());
14、matchers()

填入正则表达式语法,根据语法匹配字符串

String string = "9";
System.out.println(string.matches("abc"));
System.out.println(string.matches("[0-9]"));
System.out.println(string.matches("[a-z0-9]"));
System.out.println(string.matches("."));
15、replaceAll()

根据正则表达式,匹配对应信息,把匹配到的信息替换为新的信息

16、split()

根据填入的表达式语法把匹配的信息变成切割符切分字符串,放进字符串数组中,进行返回

String[] split = string.split("\\d");
17、replace()

根据匹配到的信息进行替换

String replace = string.replace("1", "+");
18、subString()

根据匹配到的信息进行替换

//截取10以后的(包含10)
System.out.println(string.substring(10));
//包左不包右
System.out.println(string.substring(1,3));
19、trim()

删除前面和后面的空格

20、valueOf()

可以把其他所有类型转成字符串形式

int a = 10;
String stra = String.valueOf(a);
System.out.println(stra);
int[] arr = {1,5,2,8};
char[] cs = {'a','有','6'};
//底层没有传入string.valueOf()方法,直接拼接地址值进行输出内容
System.out.println(arr);
//底层被传入String.valueOf()方法,之后调用Object类的toString()方法拼接地址值
System.out.println(cs);

编码

文字字符转换为底层数字
文字转换成数字的规则–码表
ISO8859-1 西欧码表
GBK 国际码表
Unicode(utf-8 utf-16)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值