《Java编程思想》-- 字符串(一)

  字符串一直是Java开发中最常用的技术之一,也是面试时需要重点复习的知识点,弄清楚字符串的工作原理是我们每个程序员的基本要求,接下来我们就来回顾一下字符串的相关内容

1.String 对象是不可变的

  首先我们得明确,字符串不是8大基本数据类型之一。字符串String对象是不可变的,它是由final修饰的类,String类中每一个看似会修改值的方法,其实都是创建了一个新的String对象,而最初的String对象一直未变。若创建的字符串没有任何引用时,GC(垃圾回收器)将对它进行回收。

例如:

String str="abc";
String str="def";

该过程首先创建了字符串"abc",随后创建了字符串"def"。虽然此时的引用str指向"def",但字符串"abc"依旧存在于字符串常量池中,并没有改变。

2.字符串按值传递

  之前在学习《Java核心技术Ⅰ》有幸学到了一点该方面的知识,java语言不同于C++语言,所用参数传递都是按值传递。

值传递:将参数的值进行传递,而自身不受影响
引用传递:将对象的引用进行传递,可以修改被引用对象的值

Java是按值传递的,字符串也是如此,
例如:

String str1="abc";
print(str1);
String str2=str1.toUpperCase();
print(str1);

当你前后两次打印str1的时候,会发现都是"abc",也验证按值传递。

更具体的有关Java按值传递的内容请参考该博客

3.String与StringBuffer、StringBuilder区别

  String是不可变的字符串,而Stringbuffer(安全)和StringBuilder(不安全)可以改变字符串内容,以此可以减少由不可变字符串引起的内存压力,这是他们最主要的区别。

  StringBuilder的常用方法,

  除此之外,Java也对String进行了优化,对于使用 "+" 进行连接字符串,

String str = "ab"+"cd"+12;

  编译器会自动调用StringBuilder对象中的append()来操作字符串。但这并不意味着我们就是用 "+" 来完成开发工作,当上述代码出现在循环里时,会产生多次创建StringBuilder的烦恼,此时直接创建对象会极大地提高效率。

4.String类的常用方法(一)

  在之前很长一段时间里,我都认为对于一个类中的方法只要了解一下,在实际编程过程中遇到问题去查文档就好了!这个思想一直困扰了我很长时间,因为对方法的不熟悉,当遇到难题时解决思路会受到很大的限制,编程过程中就会产生磕磕绊绊的现象。所以说,对于一些常用的类,我们需要熟记其方法,这样才能做到游刃有余。接下来,我们就来回顾String类的常用方法。

  • length(),这不用我多说吧,懂的人在评论区扣1,需要注意的是字符串里的空格也计算长度。
  • charAt(),取得String中该索引位置的字符char。FBI友情提示,位置范围为0至length() - 1 。 该序列的第一个char值在索引0 ,下一个索引为1 ,依此类推,与数组索引一样。
  • getChars(int srcBegin,int srcEnd,char[] dst, int dstBegin),该方法将此字符串中的字符复制到目标字符数组中。
  • getBytes(),获得字符串的字节码数组,常用于序列化和反序列化过程中。
  • toCharArray(),该方法将字符串转换为char[]数组。
  • equals(),equalsIgnoreCase(),比较两个String的内容是否相同
  • compareTo(),按照字典顺序比较两个字符串
  • contains(),判断字符串中是否包含某字串
  • startsWith(),endsWith(),判断字符串的开头和结尾
  • indexOf(),lastIndexOf(),具体用法如下
public class test {
    public static void main(String[] args) {
        String str = "weimob weimob";
        //     0,1,2,3,4,5, 6 ,7,8,9,10,11,12
        System.out.println(str.length());
        System.out.println(str.indexOf('o'));
        System.out.println(str.indexOf('o',5));
        System.out.println(str.indexOf('o',4));
        System.out.println(str.indexOf("mob"));
        System.out.println(str.indexOf("mob",4));
    }
}
//结果(注意,所有的下标都是从0开始计算)
13
4
11
4
3
10

5.String类的常用方法(二)

  • subString(int start, int end),返回指定下标范围的字符子串,例子(注意范围):
    "hamburger".substring(4, 8) returns "urge"
    "smiles".substring(1, 5) returns "mile"
  • concat(String str),字符串的拼接。
  • replace(char old,char new),将字符串中的字符替换,注意当字符old不存在时,原字符串不变,不会抛出异常
  • toUpperCase(),toLowerCase(),大小写变化
  • trim(),去除点字符串前后端的空格
  • valueOf(),输入不同的数据类型,返回其字符串格式。
  • intern(),将字符串存放到字符串常量池中。

6.基于Formatter的格式化输出

使用方法

Formatter formatter = new Formatter([destination]);

formatter.format(String format, Object…args);

format格式如下,%[argument_index$][flags][width][.precision]conversion

根据不同的输出需要,可以选择不同的format格式,详情请参考

Formatrer格式化说明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容