java中关于String的理解

String、StringBuilder以及StringBuffer(重点)


1.String
1.概述:Java程序中的所有字符串文本(例如“abc”)都是此类的实例。
2.创建方式:

 String str1 = “Hello”;
 String str2 = new String(“World”);

二者创建区别:
String str1 = “Hello”;首先在字符串常量池中查找有没有“Hello”,如果有则直接从字符串常量池中引用;如果没有则在字符串常量池中创建"Hello",并指向其引用。
String str2 = new String(“World”); 首先在字符串常量池中查找有没有“World”,如果有在堆内存中创建一个字符串对象,并指向常量池中的"World";即只在堆内存中创建了一个对象;如果在字符串常量池中没有找到"World",则在字符串常量池中创建"World",并在堆内存中创建对象指向字符串常量池;

示例:

 String str1 = “Hello”;
 String str2 = "Hello";
 String str3 = new String(“Hello”);
 System.out.println(str1==str2);  //true  ==比较的内存地址
 System.out.println(str1==str3);  //false

即使用直接创建方式创建字符串,最多创建一个对象;而使用new的方式创建则是创建了一个或两个,凡是new都会在堆内存中开辟新空间;所以str1==str3为false。
字符串常量池(String Pool):
字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能。
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为字符串开辟一个字符串常量池,类似于缓存区,创建字符串常量时,首先坚持字符串常量池是否存在该字符串,存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中。ps:编译期就已经存在。
String不可变的原因:

public final class String
  	 private final char value[];  //底层源码

使用final修饰保证内存地址不可变;再使用private修饰极大的保证其封装性不被破坏;且不可被继承。
ps:jdk1.8后底层实现为byte数组
常用方法

方法名作用
public char charAt(int index)根据下标获取字符
public boolean contains(String str)判断当前字符串中是否包含str
public char[] toCharArray()将字符串转换成数组。
public int indexOf(String str)查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1
public int length()返回字符串的长度
public String trim()去掉字符串前后的空格
public String toUpperCase()将小写转成大写
public boolean endsWith(String str)判断字符串是否以str结尾
public String replace(char oldChar,char newChar)将旧字符串替换成新字符串
public String[] split(String str)根据str做拆分
public String subString(int beginIndex,int endIndex)在字符串中截取出一个子字符串

2.可变字符串StringBuilder,StringBuffer
1.概述:可在内存中创建可变的缓冲空间,存储频繁改变的字符串,也称字符串缓冲区。
2.创建方式:

  String str1 = new StringBuilder("hello");

3.常用方法

方法名作用
public StringBuilder append(String str)追加内容。
public StringBuilder insert(int dstOffset, CharSequence s)将指定 字符串插入此序列中。
public StringBuilder delete(int start, int end)移除此序列的子字符串中的字符
public StringBuilder replace(int start, int end, String str)使用给定字符串替换此序列的子字符串中的字符。start开始位置、end结束位置
public int length()返回长度(字符数)

3.三者区别
Sring一旦创建不可修改,StringBuilder,StringBuffer可以修改(即内存地址可改变)。
执行效率:
StringBuilder>StringBuffer>Sring
StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全。
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值