Java-String类

API解释
public int length()返回字符串的长度。
public char charAt(int index)根据下标获取字符。
public boolean contains(String str)判断当前字符串中是否包含str。public char[] toCharArray() :将字符串转换成数组。
public int indexOf(String str)查找str首次出现的下标,存在,则返回该下标:不存在,则返回-1。
public int lastIndexOf(String str)查找字符串在当前字符串中最后一次出现的下标索引。
public String trim()去掉字符串前后的空格。
public String toUpperCase()将小写转成大写。
public boolean endWith(String str)判断字符串是否以str结尾。
public String replace(char oldChar, char newChar)将旧字符串替换成新字符串
public String[] split(String str)根据str做拆分。

String
方式一:直接赋值String s = “hsp”;
方式二:调用构造器 String s2 = new String(“hsp”);

  1. 方式一:先从常量池查看是否有"hsp”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
  2. 方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
    在这里插入图片描述

String对象特性

  1. String是一个final类,代表不可变的字符序列
  2. 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的

String str = “abc”
String str = new String(“abc”)
更改str的值,就是更改str指向的value/常量池的地址
一个value只能指向一个常量池中的字符串,value还在堆中,value指向的字符串还保存在常量池中

字符串相加
字符串变量 = 常量相加;字符串的地址在池中
字符串变量 = 变量相加;字符串的地址在堆中
String a = “hello”; //创建a对象
String b = “abc”; //创建b对象

String c = a + b;

  • a 和 b 都属于字符串变量。a + b的底层原理是在堆中创建StringBulider的对象(sb),使用append()拼接两个字符串,最后将sb的地址返回给c(字符串变量每次相加,都会new一个StringBuilder)

  • 常量相加,返回的地址在常量池池中。

  • 变量相加,返回的地址在堆中。

  • 常量与变量相加,返回的地址在堆中(new BufferBulider)

String a = "hello";
String b = "world";
String c = a + b; //创建了一个StrBulider
System.out.println(c.hashCode());
c = c + "1"; //创建了一个StrBulider
System.out.println(c.hashCode());


可变字符串

  • String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低(String 底层维护的是private final char value[] 是一个final属性,因此不能改变值)
  • StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上是更新内容,不用更新地址,效率较高(StringBuffer底层维护的是char[] value 每次更新都是将新数据复制到value中,不用改变地址)

StringBuffer

  1. StringBuffer的直接父类是 AbstractstringBuilder
  2. StringBuffer实现了Serializable,即StringBuffer的对象可以串行化
  3. 在父类中 AbstractStringBuilder有属性 char[] value,不是final 该value 数组存放字符串内容,存放在堆中的
  4. StringBuffer是一个 final类,不能被继承
  5. 因为StringBuffer字符内容是存放在char[] value,所有的变化(增加/删除)都是对数组操作
    不用每次都更换地址(即不是每次创建新对象),所以效率高于String

String与StringBuffer相互转换

String s = "hello";
//方式1:
StringBuffer b1 = new StringBuffer(s);
//方式2:
StringBuffer b2 = new StringBuffer();
b2.append(s);

//StringBuffer—->String
//方式1:
String s2 = b1.toString(); //b1 [StringBuffer]
方式2:
String s3 = new String(b1);


StringBuilder

  1. 一个可变的字符序列。此类提供一个与 StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
  2. 在 StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。


String、StringBuffer、StringBuilder的比较

  1. StringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
  2. String:不可变字符序列,效率低,但是复用率高。
  3. StringBuffer:可变字符序列、效率较高(增删)、线程安全
  4. StringBuilder:可变字符序列、效率最高、线程不安全)

String使用注意说明:
string s=“a”; //创建了一个字符串
s +=“b”;//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对String做大量修改,不要使用String


String类

String结构剖析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

String创建剖析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

演示字符串另一种创建方式
在这里插入图片描述
在这里插入图片描述

String对象特性

在这里插入图片描述

字符串变量 = 常量相加;字符串的地址在池中
字符串变量 = 变量相加;字符串的地址在堆中
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

题2
ex.str指向堆中Text1空间的str,str指向常量池中的“java”
ex.ch指向堆中Text1空间的ch
调用ex.change(ex.str,ex.ch)方法
相当于
String str = ex.str;
char ch[] = ex.ch;
str 指向堆中Text1空间的str
ch 指向堆中Text1空间的ch

str = “java”
str 指向常量池中的java对象
ch[0] = ‘h’

当方法执行完,这个栈空间就销毁了
因此,最后输出 hsp and hava

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

String常用方法

在这里插入图片描述

判断字符串长度
在这里插入图片描述
在这里插入图片描述
返回字符串在指定位置的字符
在这里插入图片描述
在这里插入图片描述
判断字符串是否包含指定字符串
在这里插入图片描述
在这里插入图片描述
字符串转换为对应的数组
在这里插入图片描述
在这里插入图片描述

返回字符串首次出现的位置
在这里插入图片描述
在这里插入图片描述

返回字符串最后一次出现的位置
在这里插入图片描述
在这里插入图片描述
去掉字符串前后的空格
在这里插入图片描述
在这里插入图片描述
将字符串中的小写字母转换为大写字母
在这里插入图片描述
在这里插入图片描述

将字符串中的大写字母转换为大写字母
在这里插入图片描述
在这里插入图片描述
判断指定的字符串是否是字符串的结尾
在这里插入图片描述
判断指定的字符串是否是字符串的开头
在这里插入图片描述
在这里插入图片描述

用新的字符或字符串替换旧的字符或字符串
在这里插入图片描述
在这里插入图片描述

分割字符串
在这里插入图片描述
在这里插入图片描述

判断两个字符串是否相等
在这里插入图片描述
在这里插入图片描述
判断字符串大小
在这里插入图片描述
在这里插入图片描述
如果字符串都一样,那就对比大小
在这里插入图片描述
在这里插入图片描述
String案例演示
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可变字符串

StringBuffer

在这里插入图片描述
在这里插入图片描述

String与StringBuffer相互转换
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1、添加
在这里插入图片描述

2、插入
在这里插入图片描述
在这里插入图片描述
3、替换
在这里插入图片描述
在这里插入图片描述
4、删除
在这里插入图片描述
在这里插入图片描述
5、清空
在这里插入图片描述
在这里插入图片描述
查找
在这里插入图片描述
在这里插入图片描述

比较String和StringBuff的效率
在这里插入图片描述
在这里插入图片描述

StringBuilder

在这里插入图片描述

总结

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值