java [字符串]-[StringBuffer]-[正则表达式]

本文详细介绍了Java中的字符串、StringBuffer与StringBuilder的使用,包括它们的特点、操作方法以及与字符串拼接的关系。此外,文章还深入讲解了Java中的常量池,探讨了基本类型包装类的常量池特性和对象池范围。同时,讨论了字符串的常见操作,如获取、判断、转换、替换、切割、连接和去空格等。最后,文章阐述了正则表达式的基本概念、优缺点以及如何在Java中运用正则表达式进行匹配、替换和切割等操作。
摘要由CSDN通过智能技术生成

 

  1. 一字符串  
  2. 二StringBuffer 与 StringBuilder
  3. 三正则表达式

一、字符串
 

String 是一个final类 不能复写 不能有子类

1. 用双引号引起的都是字符串对象 该对象位于常量池中

 

2. 字符串中==equals的区别

  1--> String s1= new String("abc");
     String s2= new String("abc");
  2--> String t1 = "abc";
     String t2 = "abc";
     s2 = s2 + " java";
     t2 = t2 + " java";
  `     

① s1 == s2 结果是false 因为创建了两个字符串对象,s1 s2分别指向堆中的两个对象

② s1.equals(s2)结果为true 因为String已经对Object类的equals方法进行了复写,

   Object equals相当于==

③ s1 == t1 结果为false 因为堆中的字符串对象的地址跟常量池地址不一样

④ s1.equals(t1) 结果为true 内容相等
      

⑤ t1 == t2 结果为true 因为t1 t2指向了常量池中同一个字符串常量

⑥ t1.equals(t2) 结果为true 内容相等
     

⑦ s2 跟 " java"连接后指向常量池中新建的 "abc java"的字符串常量,s2原来指向的堆内存中的 abc"对象随垃圾回收器回收

⑧ t2 " java"连接后也指向常量池中的"abc java",t2原来指向的常量池中的"abc"还存在于常量 池中
  
      上面用new  String()创建的字符串不是常量,不能在编译期就确定,所以new String()
      创建的字符串不放入常量池中,他们有自己的地址空间,String 对象(内存)的不变性机制会
      使修改String字符串时,产生大量的对象,因为每次改变字符串,都会生成一个新的String
      java 为了更有效的使用内存,常量池在编译期遇见String 字符串时,它会检查该池内是否已
      经存在相同的String 字符串,如果找到,就把新变量的引用指向现有的字符串对象,不创建
      任何新的String 常量对象,没找到再创建新的。所以对一个字符串对象的任何修改,都会产生
      一个新的字符串对象,原来的依然存在,等待垃圾回收。

一个字符串的例子
   

class  StringDemo
{
 public static void main(String[] args)
 {
    
   /*字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。
     因为 String 对象是不可变的,所以可以共享。例如: */
     String str = "abc";
     // 等效于:
      char data[] = {'a', 'b', 'c'};
     String str = new String(data);

   //空字符串的定义
    //String str1 = "";等同于
    String str1 = new String();
    
   //字符串一旦被初始化就不可以被改变
    String s = "abc";
    s = "cde";//abc仍然在内存中 s由指向"abc"改为指向"cde"字符串
    
   //"=="与equals()的区别
    String s1 = "abc";//s1代表一个对象,
    String s2 = new String("abc");//s2在内存中有两个对象 ,
    String s3 = "abc";
    System.out.println(s1==s2);  //返回fault ,s1与s2分别指向两不同对象,两对象在内存中不同位置
    System.out.println(s1.equals(s2));//,返回true,String复写了Object类的equals方法,该方法比较的是字符串是否相同
    System.out.println(s1==s3);  //返回true,s1与s3指向的是同一个对象
 }
}


 

3. 常量池

3.1. 什么是常量池?

 常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于    类,方法,接口 字段等中的常量,也包括java中用得很多的字符串常量,如String s = "java" 

 故认为常量池是JVM在方法区中为它们开辟一块特殊的内存空间.常量池中除了包含代码中所定

 义的各种基本类型(如intlong等等)和对象型(如String及数组)的常量值外,还包 含一些 以 文本形式出现的符号引用,比如:
  

类或接口的全限定名, 

超类的全限定名,

父接口的全限定名,

类字段名和所属类型名, 

类方法名和返回类型名、以及参数名和所属类型名

            ⑥字符串字面值。


常量池技术是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个
出来(如果池中没有则创建一个)则在需要重复创建相等变量时节省了很多时间和空间。常量池

其实也就是一个内存空间,不同于使用new关键字创建的对象内存空间

 

3.2. 八种基本类型的包装类和对象池 

     java中基本类型的包装类的大部分都实现了常量池技术,这些类是 

Byte,Short,Integer,Long,Character,Boolean,
另外两种浮点数类型的包装类则没有实现 另外 Byte,Short,Integer,Long,Character 

5种前四种整型的包装类也只是在-128~127范围内,Character0~127范围内时才可使用对象 池,也即对象不负责创建和管理大于127或小于-128的这些类的对象。

注意基本数据类型使用常量池技术的前提是用自动装箱装将基本类型数据到包装类的对象,new方法包装的不会放常量池中,能使用常量池的是通过自动装箱包装的Boolean,或通 过自动装箱包装的Byte,Short,Integer,Long,Character且范围在小于等于127 的包装类数    据

3.2.1. 基本数据类型对象的包装类

     boolean  Boolean
    byte    Byte
    char    Character
    short   Short
    int    Integer
    long   Long
    float   Float
    double  D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值