JavaSE -- String、StringBuffer、StringBulider

String类
1.两种实例化方式
直接赋值
String str = “hello”;
变量名str存放在栈上,字符串内容存放在堆内存上;str指向hello,没有产生垃圾空间。hello直接保存在堆上的字符串对象池,会自动入池。
任何一个字符串都是一个String类的匿名对象,都会在堆上分配一块儿内存。
传统方法:new 一个对象
String str = new String(“hello”);
变量名str存放在栈上,hello这个字符转存放在堆上,这时还有一个new,new String出来的对象也放在堆上,这样堆上就有两块空间存放着hello,堆上第一个hello是字符串常量,是垃圾空间,堆上第二个hello是new出来的,str则指向new出来的hello。
2.字符串比较
如果是直接赋值的两个字符串进行比较,可以用’= ='因为直接赋值的字符串会自动入字符串对象池。但是如果是new出来的对象进行比较,需要使用equals()方法,比较对象的内容;“==”比较的对象的地址。

'= ='与equals的区别:
'= ='进行的是数值比较,比如int、double类型的数值;
如果用来比较对象,则==比较的是对象的地址。
equals比较的是对象的内容。

3.String类的共享设计模式
在JVM底层会自动维护一个字符串对象池,如果现在采用了直接赋值的方式实例化String类的对象,则这个对象会自动保存到这个字符串对象池之中,如果下次也有一个直接赋值的String对象,内容与上次相同的话,直接使用上次保存在字符串对象池中的内容,它们是同一块空间,如果直接赋值的内容不相同,会在字符串对象池中再开辟一块空间保存。
手动入池方法:str.intern();
字符串对象池就是一个对象数组,可以减少开销。

4.字符串常量不可变更
字符串一旦定义不可变更,字符串的底层实现是字符数组,数组最大的缺陷是长度固定,在定义字符串常量时,它的内容不可变更。
字符串对象可以修改,但是浪费空间。
比如:String str = “hello”;
str = str+“world”;
str += “!!!”;

内存中str先指向hello,然后空间中有一个单独的空间是world,str指向“hello world”,空间中又有单独的"!!!",然后str指向“hello world!!!”,频繁修改字符串对象的内容,会浪费内存中的大量空间。

5.字符与字符串
字符串就是一个字符数组,所以String类里有字符串转换为字符数组以及字符串变为字符的操作方法。

      a. 字符数组->字符串
          char[ ] -> String
          public String(char[ ] value)
          public String(char[ ] value,int offset,int count)
          包括offset和count这两个下标。
      b.字符串->单个字符
         String -> char
         public char charAt(int index)    //取得指定索引的字符
      c. 字符串->字符数组
         String -> char[ ]
          public char[ ] toCharArray();
         取得字符串长度:public int length();

6.字节与字符串

a. 字节数组->字符串
      public String(byte[] bt)
      public String(byte[] bt,int offset,int count)
b.字符串->字符数组
      public byte[] getBytes()   //str.getBytes();
c.编码转换处理
     public byte[] getBytes(String charsetName) throws 
     UnsupportedEncodingException 

7.字符串比较

a.区分大小写的比较
 public boolean equals(Object obj)  //str1.equals(str2);
b.不区分大小写的比较
 public boolean equalsIgnoreCase(String str2)  
c.比较两个字符串大小关系
  public int compareTo(String str2)
  相等返回0,大于返回大于0,小于返回小于0

8.字符串查找

a.判断一个子字符串是否存在(JDK1.5以后追加)
  public boolean contains(CharSequences s)//父.contains(子字符串);
b.从头开始查找指定字符串的位置,查到了返回位置的开始索引,查不到返回-1
  public int indexOf(String str)  //原字符串.indexOf(指定字符串);
c.从指定位置开始查找字符串位置
  public int indexOf(String str,int fromIndex)
d.从后向前查找子字符串位置
  public int lastIndexOf(String str)
e.由指定位置从后向前查找子字符串位置
  public int lastIndexOf(String str,int fromIndex)
f.判断是否以指定字符串开头
  public int startsWith(String str)
g.从指定位置开始判断是否以指定字符串开头
  public int startsWith(String str,int fromIndex)
h.判断是否以指定字符串结尾
  public boolean endsWith(String str)

9.字符串替换

a.替换所有的指定内容
  public String replaceAll(String 被替换,String 要替换)
b.替换首个内容
  public String replaceFirst(String reges,String replacement)

10.字符串拆分

a.将字符串按照某个字符全部拆分
  public String[] split(String regex) //str.split(":")
b.将字符串部分拆分,该数组长度就是limit,字符串被拆分成limit段
  public String split(String regex,int limit)
11.字符串截取
a.从指定索引截取到结尾
  public String substring(int beginIndex)
b.截取部分内容,包括beginIndex,不包括endIndex
  public String substring(int beginIndex,int endIndex)
12.字符串其他操作方法
a.去掉字符串中的左右空格,保留中间空格
  public String trim()
b.字符串转大写
  public String toUpperCase()
c.字符串转小写
  public String toLowerCase()
d.字符串入池操作
  public native String intern()
e.字符串连接,等同于‘+’,不入池
  public String concat(String str)
f.取得字符串长度
  public int length()
g.判断字符串是否为空,但不是null,是长度为0
  public boolean isEmpty()

StringBuffer类
StringBuilder类

两只sb类(面试)- 方便进行字符串的修改 - java.long 包,基础包自动导入
StringBuffer
StringBuilder
       a. 字符串修改
           public StringBuffer append(各种数据类型);
       b. StringBuffer <-> String
            1. String -> StringBuffer
                调用StringBuffer的构造方法
            2. StringBuffer -> String
                StringBuffer.toString( );
       c. 字符串反转
           public StringBuffer reverse( );
       d. 删除指定范围的数据
           public StringBuffer delete(int start, int end);
       e. 插入数据
           public StringBuffer insert(int offset, 各种数据类型)

两只 sb 类的比较

  1. String 的内容不可修改,而两只sb可以改内容(append)
  2. StringBuffer采用同步处理,线程安全,效率较低。
    StringBuilder采用异步处理,线程不安全,效率较高,
    Strng"+"底层会将String -> StringBuilder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值