Java的常用类之一 ---- String、StringBuffer、StringBuilder类

1、String的使用

1.1、String的实例化方式

方式一:通过字面量定义的方式(数据声明在方法区的字符串常量池中)
方式二:通过new+构造器的方式(保存的时地址值,数据在堆空间中)

	 String s1 = "javaEE";
     String s2 = "hadoop";

     String s3 = "javaEEhadoop";
     String s4 = "javaEE" + "hadoop";
     String s5 = s1+ "hadoop";
     String s6 ="javaEE" +s2;
     final  String s7 = "javaEE";//常量
     String s8 = s7 + "hadoop";

     System.out.println(s3 == s8);//在常量池
     System.out.println(s3 == s4);
     System.out.println(s3 == s5);
     System.out.println(s3 == s6);
     System.out.println(s5 == s6);
     

输出结果:true、true、false、false、false

1.2、 拼接结论:常量与常量的拼接结果在常量池,且常量池不会存在相同内容的常量,只要其中有一个变量,结果就在堆中,如果拼接的结果调用intern(),返回值就在常量池中
1.3、 String:字符串

1.String声明为final的,不可以被继承,使用""引起来表示
2.String实现了Serializable接口,表示字符串时支持序列化的
实现了Comparable接口:表示字符串可以比较大小
3.String内部定义了final char[] value用于存储字符串数据、
4.String:代表不可变性的字符序列:简称:不可变性
体现:1.当对字符串重新赋值时需要重新指定内存区域赋值,不能使用原有的value进行赋值
2.当对现有的字符串进行拼接操作时,也需要重新指定内存区域赋值,不能使用原来的value赋值
3.当调用String的replace()进行修改指定的字符串或字符时,也要重新指定内存区域赋值。
5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在方法区–>字符串常量池中
6.字符串常量池是不会存储相同内容的字符串的

  String s1 = "abc";//字面量创建方式
       String s2 = "abc";
       s1 = "hello";

       System.out.println(s1 == s2 );

       System.out.println(s1);//hello
       System.out.println(s2);//abc

       System.out.println("****************************");

       String s3 = "abc";
       s3 +="def";
       System.out.println(s3);//abcdef
       System.out.println(s2);//abc  说明s3在拼接之后是,新开辟了一块空间

       System.out.println("*************");

       String s4 = "abc";
       String s5 = s4.replace('a','m');
       System.out.println(s4);//abc
       System.out.println(s5);//mbc
1.4、String设计到与其他结构的转换问题

① String 与 byte[]之间的转换
编码:String --> byte[]:调用String的getBytes()
解码:byte[] -->String :调用String的构造器

说明:解码时,要求使用的字符集必须和编码时使用的字符集一致,否则会乱码

  		String str = "abc123";
        byte[] bytes = str.getBytes();//使用默认的编码集
        System.out.println(Arrays.toString(bytes));

② String 与char[]之间的转换
String --> char[]:调用字符串的toCharArray()
char[] --> String:调用string的构造器

  		String str1 = "abc123";
        char[] c = str1.toCharArray();
        for (int i = 0; i < c.length; i++) {
            System.out.println(c[i]);
        }

③ String 与基本数据类型、包装类之间的转换关系

String-->基本数据类型、包装类:调用包装类的静态方法parseXxx(str);
基本数据类型、包装类 --> String:调用重载的方法valueOf(xxx);
1.5、String方法的使用
(1)charAt(int index) 返回指定索引处的 char 值
 (2)compareTo(String anotherString) 按字典顺序比较两个字符串,
 (3)compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写
 (4)concat(String str) 将指定字符串连接到此字符串的结尾,等价于用"+"
 (5)contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true
 (6)endsWith(String suffix) 测试此字符串是否以指定的后缀结束
 (7)equals(Object anObject) 将此字符串与指定的对象比较
 (8)format(String format, Object args) 使用指定的格式字符串和参数返回一个格式化字符串
 (9)indexOf(int ch) 与 indexOf(int ch, int fromIndex)
 返回在此字符串中第一次出现指定字符处的索引,后者要从指定的索引开始搜索
 (10)indexOf(String str) 与 indexOf(String str, int fromIndex)
 返回指定子字符串在此字符串中第一次出现处的索引,后者要从指定的索引开始搜索
 (11)isEmpty() 当且仅当 length() 为 0 时返回 true
 (12)lastIndexOf(int ch) 与 lastIndexOf(int ch, int fromIndex)
 返回指定字符在此字符串中最后一次出现处的索引,后者要从指定的索引处开始进行反向搜索
 (13)lastIndexOf(String str) 与 lastIndexOf(String str, int fromIndex)
 返回指定子字符串在此字符串中最后一次出现处的索引,后者要从指定的索引开始反向搜索
 (14)length() 返回此字符串的长度
 (15)matches(String regex) 字符串是否匹配给定的正则表达式
 (16)replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
 (17)replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
 (18)replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串
 (19)split(String regex) 根据给定正则表达式的匹配拆分此字符串
 (20)startsWith(String prefix)
 startsWith(String prefix, int toffset)
 测试此字符串是否以指定的前缀开始,后者要从指定的索引开始搜索
 (21)toCharArray() 将此字符串转换为一个新的字符数组
 (22) toLowerCase() 与toLowerCase(Locale locale)
 将此 String 中的所有字符都转换为小写,前者是使用默认环境,后者是使用指定Locale的规则
 (23)toString() 返回此对象本身
 (24)toUpperCase() 与 toUpperCase(Locale locale)
 将此 String 中的所有字符都转换为大写,前者是使用默认环境,后者是使用指定Locale的规则
 (25)trim() 返回字符串的副本,忽略前导空白和尾部空白
 (26)valueOf(int i) 返回 int 参数的字符串表示形式(int 可以换成其他类型)
面试题:String s = new String(“abc”);这种方式创建对象,在内存中创建了几个对象?

答案:两个,一个是堆空间中new出来的结构,一个是char[]对应的常量池中的数据:“abc”

体现字符串的不可变性
    String str = new String("good");
   char[] ch = {'t','e','s','t'};

   public void chage(String str,char ch[]){
       str ="test ok";
       ch[0] = 'b';
   }

   public static void main(String[] args) {
       StringTest st = new StringTest();
       st.chage(st.str,st.ch);
       System.out.println(st.str);//good;
       System.out.println(st.ch);//best
   }

2、关于StringBuffer和StringBuilder的使用(两者类似,以下由StringBuffer进行举例)

2.1、String和 StringBuffer 和 StringBuilder 三者的异同
  1. String:不可变的字符序列,底层使用char[]进行存储
  2. StringBuffer:可变的字符序列,底层使用char[]进行存储,线程安全的,效率低
  3. StringBuilder:可变的字符序列,底层使用char[]进行存储,jdk5.0新增,线程不安全的,效率高
2.2、源码分析和扩容问题

源码分析

 	String str = new String();//char[] value = new char[0];
    String str1 = new String();//char[] value = new char[]{'a','b','c'};

      StringBuffer sb = new StringBuffer();//char[] value = new char[16];底层创建了一个长度为16的char数组

扩容问题;

  1. 如果要添加的数据底层数组放不下了,需要扩容底层数组。
  2. 默认情况下,扩容为原来数组的两倍+2,同时将原来的数组的元素复制到新的数组中
2.3、方法的使用

1、append方法

public StringBuffer append(boolean b)

该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变。

2、insert方法

public StringBuffer insert(int offset, boolean b)

作用是在StringBuffer对象中插入内容,然后形成新的字符串。

3、deleteCharAt方法

public StringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。

4、reverse方法

public StringBuffer reverse()

作用是反转StringBuffer对象中的内容,然后形成新的字符串。

5、trimToSize方法

public void trimToSize()

该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

6、setCharAt方法

public void setCharAt(int index, char ch)

作用是修改对象中索引值为index位置的字符为新的字符ch。

public int indexOf(String str)
public int length(String str)
public String subString(int start,int end)左闭右开
public char charAt(int n)

	    //构造函数:可以空参构造,也可以用String、CharSequence来构造
        //public StringBuffer(int capacity)   capacity默认为16,如果用int来构造可以自己设置默认的capacity。
        StringBuffer sbuffer = new StringBuffer("Hello");

        //appen():不需要创建新对象,直接返回append后的StringBuffer对象。
        sbuffer.append(" World !");
        System.out.println(sbuffer);

        //reverse():翻转StringBuffer对象并返回。
        sbuffer.reverse();
        System.out.println(sbuffer);

        //replace():用于替换指定位置的内容,如果start和end相同,效果等同于insert()。
        sbuffer.replace(0, 1, "~");
        sbuffer.reverse();
        System.out.println(sbuffer);

        //insert():在指定位置插入(char、String、int、folat、boolean等)。
        //length():返回StringBuffer的长度。
        sbuffer.insert(sbuffer.length(), " !");
        System.out.println(sbuffer);

        //delete():删除指定位置区间的字符。
        sbuffer.delete(sbuffer.length() - 1, sbuffer.length());
        System.out.println(sbuffer);

Java的常用类之二 ----日期时间类

https://blog.csdn.net/weixin_43244120/article/details/105188644

Java的常用类之三----其他类(接口)

https://blog.csdn.net/weixin_43244120/article/details/105189069

发布了19 篇原创文章 · 获赞 0 · 访问量 491

猜你喜欢

转载自blog.csdn.net/weixin_43244120/article/details/105187804