• String和stringbuffer和stringbuilder


     

    我们经常会使用到String和stringbuffer和stringbuilder简单说几个方法。

    @1:

    一、String类

    String类在java.lang包中,是一个引用类,java使用String类创建一个字符串变量,字符串变量属于对象。java把String类声明的final类,不能有类。String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间。

    二、String类对象的创建

    1.String str = "Hello";

    2.String str = new String("Hello");

    三、String类常用方法

    1.求字符串的长度

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "爱党爱国,乐于助人";
    4. System.out.println("我的长度int"+str.length());//str.length()返回字符串的长度9
    5. System.out.println("我的长度int"+str1.length());//str.length()返回字符串的长度9
    6. }

    2.提取子串

    用String类的substring方法可以提取字符串中的子串,该方法有两种常用参数:

    .public String substring(int beginIndex) // 该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。


    .public String substring(int beginIndex, int endIndex) // 该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。
     

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "爱党爱国,乐于助人";
    4. System.out.println(str.substring(3));//456789
    5. System.out.println(str1.substring(0,4));//爱党爱国
    6. }

    3.求字符串某一位置字符

    public char charAt(int index)   //   返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "爱党爱国,乐于助人";
    4. System.out.println(str.charAt(0));//1
    5. System.out.println(str1.charAt(8)); //人
    6. }

    4.字符串比较

    1)public int compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
    2)public int compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
    3)public boolean equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
    4)public boolean equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。
     

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "爱党爱国,乐于助人";
    4. String str2 = "abc";
    5. String str3 = "ABC";
    6. System.out.println(str.compareTo(str1)); //-29184
    7. System.out.println (str.compareToIgnoreCase(str1));//-29184
    8. System.out.println (str2.compareTo(str3));//32
    9. System.out.println (str2.compareToIgnoreCase(str3));//0
    10. boolean c = str2.equals(str3); //c=false
    11. boolean d = str2.equalsIgnoreCase(str3); //d=true
    12. }

    5、字符串连接
    public String concat(String str) // 将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "爱党爱国,乐于助人";
    4. String str2 = "abc";
    5. String str3 = "ABC";
    6. System.out.println(str.concat(str1)); //123456789爱党爱国,乐于助人
    7. }

    6、字符串中单个字符或字符串的查找
    1)public int indexOf(int ch/String str)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
    2)public int indexOf(int ch/String str, int fromIndex)//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
    3)public int lastIndexOf(int ch/String str)//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
    4)public int lastIndexOf(int ch/String str, int fromIndex)//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。
     

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "爱党爱国,乐于助人";
    4. System.out.println(str.indexOf('5'));//4
    5. System.out.println(str.indexOf('3',1));//2
    6. System.out.println(str.lastIndexOf('5'));//4
    7. System.out.println(str.lastIndexOf('3',1));//-1
    8. }

    7、字符串中字符的大小写转换
    1)public String toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
    2)public String toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串

    1. public static void main(String[] args) {
    2. String str = "123456789";
    3. String str1 = "abcdEFGH";
    4. System.out.println(str1.toLowerCase());//abcdefgh
    5. System.out.println(str1.toUpperCase());//ABCDEFGH
    6. }

    8、字符串中字符的替换
    1)public String replace(char oldChar, char newChar) //用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。
    2)public String replaceFirst(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
    3)public String replaceAll(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
     

    1. public static void main(String[] args) {
    2. String str = "Hello";
    3. String str1 = str.replace('e','E');//str1 = "HEllo"
    4. String str2 = str.replaceFirst("l","qw");//str2 = "Heqwlo"
    5. String str3 = str.replaceAll("l","df");//str3 = "Hedfdfo"
    6. System.out.println(str1);
    7. System.out.println(str2);
    8. System.out.println(str3);
    9. }

    9.string若干方法

    1)String trim //忽略字符串前导和尾部的空格,返回字符串

    String s = " Hello  ";
    System.out.println(s.trim()); // s = "Hello"
    2)isEmpty()  // 判断字符串是否为空。

    String s = " Hello  ";
    System.out.println(s.isEmpty()); // s = "false"
    3) contains()  //判断是否包含指定的字符串

    String s = " Hello  ";
    System.out.println(s.contains("ll")); // s = "true"
    4) char[] toCharArray() // 将此字符串转换为一个新的字符数组。

    5)boolean startsWith(String prefix) // 测试此字符串是否以指定的子串开始。

    6)  boolean endsWith(String prefix) // 测试此字符串是否以指定的子串结束。 

    7)String[] split(String regex,int limit) // 根据匹配给定的正则表达式来拆分此字符串
     

    有借鉴的地方~ 表示欢迎~

    @2:

    stringbuffer和stringbuilder

    我们在实际的开发中,如果需要进行字符串的频繁拼接,会出现以下问题:

    java中的字符串是不可变的,每一次拼接都会产生新字符串。
    这样会占用大量的方法区内存。造成内存空间的浪费。

    ==String为什么是不可变的?
    源代码内,String类中有一个 byte[ ] 数组,这个byte[ ]数组采用了 final 修饰,

    因为数组一旦创建长度不可变。并且被final修饰的引用一旦指向某个对象之后,不可再指向其它对象,所以String是不可变的!

    所以"abc" 无法变成 “abcd”
     

    因此引出StringBufferStringBuilder可变字符串!

    ==StringBuilder和StringBuffer为什么是可变的呢?
    源代码内,StringBuffer和StringBuilder内部实际上是一个 byte[ ]数组,这个byte[]数组没有被final修饰,

    StringBuffer和StringBuilder的初始化容量是 16,当存满之后会进行扩容,底层调用了数组拷贝的方法System.arraycopy()。所以StringBuilder和StringBuffer适合于使用字符串的频繁拼接操作。

    注意:
    StringBuffer和StringBuilder默认初始化容量为16个byte[] 数组

     

    1,StringBufferStringBuilder的创建方法

    1. public static void main(String[] args) {
    2. StringBuffer s1 = new StringBuffer();//创建一个容量为16的StringBuffer对象
    3. StringBuffer s2 = new StringBuffer("我是中国人");
    4. System.out.println(s2);
    5. StringBuffer s3 = new StringBuffer(100);//创建一个容量为100的StringBuffer对象
    6. StringBuilder s4 = new StringBuilder(100);//创建一个StringBuffer对象
    7. }

    2. 优化StringBuffer和StringBuilder的性能?

    在创建StringBuffer和StringBuilder的时候尽可能给定一个初始化容量。

    最好减少底层数组的扩容次数。预估计一下,给一个大一些初始化容量。

    关键点:给一个合适的初始化容量。可以提高程序的执行效率。

    3.StringBuffer和StringBuilder的区别?

    StringBuffer中的方法都有:synchronized 关键字修饰。表示StringBuffer在多线程环境下运行是安全的。

    StringBuilder中的方法都没有:synchronized 关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。

    -StringBuffer是线程安全的。

    -StringBuilder是非线程安全的。
     

    4.方法(StringBuffer和StringBuilder构造方法和方法一样)

    构造方法名
    StringBuilder()
    StringBuilder(int capacity)
    StringBuilder(String str)

    --StringBuilder append(char c)    在字符串尾巴追加字符
    --int capacity()    当前StringBuffer/StringBuilder的容量
    --char charAt(int index)    返回指定位置的字符
    --StringBuilder delete(int start, int end)    删除[start, end)范围的字符
    --StringBuilder deleteCharAt(int index)    删除指定位置的字符
    --void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)    将字符串转换成char复制到dst数组中
    --int indexOf(String str)    返回str第一次出现的位置
    --int lastIndexOf(String str)    返回str最后一次出现的位置
    --StringBuilder insert(int offset, char c)    在offset位置插入字符
    --int length()    返回字符串长度
    --StringBuilder replace(int start, int end, String str)    将[start, end)的内容替换成str
    --StringBuilder reverse()    字符串翻转
    --void setCharAt(int index, char ch)    将index位置的字符设置为ch
    --String substring(int start)    从start开始截取字串
    --String substring(int start, int end)    截取start到end - 1的字符串
    --void setLength(int newLength)    设置StringBuffer/StringBuilder的长度,默认补空格,并自动扩充容量
    --CharSequence subSequence(int start, int end)    和substring一样,只不过返回CharSequence
     


    总结

    --StringBuffer/StringBuilder可以看做 可变长度字符串。
    --StringBuffer/StringBuilder初始化容量 16.
    --StringBuffer/StringBuilder是完成字符串拼接操作的,方法名:append
    --StringBuffer是线程安全的。StringBuilder是非线程安全的。
    --频繁进行字符串拼接不建议使用“+”
     

  • 相关阅读:
    基于标签量信息的联邦学习节点选择算法
    通过Linux命令监控CPU案例
    SpringBoot配置多环境开发
    TypeScript基本信息总结
    HDFS 基本 shell 操作
    【大数据】CDC 技术:变化数据捕获
    Java中如何借助InputStream写入文件及保存文件呢?
    2022年9月2日:面向初学者的 web 开发--使用 JavaScript 制定决策
    代码随想录Day03 | 链表基础1 LeetCode T203 移除链表元素 T707设计链表 T206 反转链表
    IDEA远程断点调试jar包项目
  • 原文地址:https://blog.csdn.net/s_sos0/article/details/126040617