• Java学习笔记--字符串String、StringBuffer和StringBuilder


    1.Java中的字符串类和字符的表示

    2.区分String,StringBuilder和StringBuffer

    3.从命令行中给main方法传递参数

    1 Java中的字符串和字符

     String类

    字符串就是由一系列的字符组成的序列,在很多语言中,比如C语言,将其存储在一个数组中。现在运用Java的思想,就要将字符串视为一个对象,其中Java规定的String类有11个构造方法,同时还有至少40种实现的方法,通过String类的学习,可以很好地了解面向对象的类和对象的思想。

    构造一个类     

    String newString = new String (StringLiteral);
    String newStr = new String ("Hello Java!");

    按照这个语法可以构造一个字符串类,字符串变量保存了存储字符串值的对象的参考。严格而言,String变量,String对象,String值是不一样的,但是大部分时候这些区别被无视了。但是按照上面的例子的理解 newStr变量指向一个存储“Hello Java”的数据区,此时如果将newStr = “I do like Java”,此时操作和以前编程的想法不太一样,此时原来的数据“Hello Java”还在,只是创建了“I do like Java”的字符串,然后将变量指向这个字符串。参照以下的例子:

    public class Welcome {
        public static void main(String[] args){
            System.out.println("Welcome to Java!");
            String s1 = "Welcome to Java";
            String s2 = new String("Welcome to Java");
            String s3 = "Welcome to Java";
        
            System.out.println("s1 is" + s1);
            System.out.println("s2 is" + s2);
            System.out.println("s3 is" + s3);
            
            System.out.println("s1 == s2 is " + (s1==s2));
            System.out.println("s1 == s3 is " + (s1==s3));
        }
    }

    运行结果可以看到 s1,s2,s3,字符串变量都指向同样的值“Welcome to Java” 但是1和3是同一个字符串,2和另外两个不是。在Java中,JVM在堆中分配好内存用于存储字符串“Welcome to Java”,此时s1和s3都指向了同一个字符串,而s2通过new方法生成,此时JVM在堆中重新分配空间用于存储该字符串。

    “==”只是表示两个字符串变量是不是指向同一个变量,可以用 +equals(string2)来验证两个字符的内容是不是一样的。同样的String类,提供了equalsIgnoreCase,compareToIgnoreCase以及regionMatches的方法来比较字符串。

    字符串的属性:字符串类有读取字符串长度和获得某个字符的方法,也可以连接两个字符串。根据离散数学搜索算法字符串匹配问题,Java中的String也有相关的方法来处里这类问题,获得子串+subString(beginIndex: int): String,+subString(beginIndex: int, endIndex: int): String。同样字符串也可大小写转化。

    字符串和字符数组的转化,参照下面的例子:

    char[] chars = "Java".toCharArray();

    2.区分String,StringBuilder和StringBuffer

    StringBuilder/StringBuffer 类

    StringBuilder/StringBuffer 对于String而言是可选择的,总体上而言,StringBuilder/StringBuffer 在String能用的场合下都能用,而且这两个类都比String还要更灵活,应为String类生成的对象之后的字符串是固定的,并不能像StringBuilder/StringBuffer一样增加内容,对于多任务的情况下使用StringBuffer,对于单一任务的情况下,使用StringBuilder。

     StringBuilder 

    • StringBuilder有三个构造方法, +StringBuilder(),+StringBuilder(capacity: int), +StringBuilder(s: String).
    • toString,capacity,length,setLength 和charAt 方法
    • StringBuilder提供了额外的方法来实现建立字符串和获得它的内容:
    • +toString(): String 从StringBuilder返回字符串对象
    • +capacity(): int      获得StringBuilder 的内容
    • +charAt(index: int ): char  从inex位置返回单个字符
    • +length() : int        返回字符串的长度
    • +setLength(newLength: int) : void
    • +substring(startIndex: int) : String
    • +substring(startIndex: int , endIndex: int ):String
    • +trimToSize(): void

    笔记:String 的length是长度,也就是bulider里面的实际的长度,capacity是现在的长度

    不可变和可变字符序列使用陷阱

    String一经初始化后,就不会再改变其内容了,对String字符串的操作实际上是对其副本的操作,例如

    String a = "a";
    s = a+"b";

    在s=a+"b";语句中,原来的字符串对象“a”已经丢弃了,现在又产生另外一个字符串,如果多次执行这些改变内容的操作,会导致大量副本字符串对象存留在内存中,降低效率,如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至造成系统的崩溃。相反,如果使用StringBuffer和StringBuilder,可以对原字符串本身进行操作。

    • String:不可变字符串序列
    • StringBuffer:可变字符串序列,且线程安全,有线程同步检查,但是效率低
    • StringBuilder:可变字符串序列,线程不安全,不做线程同步检查,但是效率高

     3.从命令行中给main方法传递参数

    1.给main 方法传递参数,当你编程的时候从命令行里传入,可以按照下面的例子

    java TestMain arg0 arg1 arg2

    这些参数是字符串,但是他们不会在命令行里面出现两次,他们都是通过空格来隔开的,当main 方法被唤起的时候Java 解释器创造了数组来存储命令行的参数,并且传递参数给args。例如你唤起了一个n个参数程序,java解释器会按照如下创造一个数组

    args = new String[n];

    Java解释器然后传递args来唤起main方法。

    笔记:如果说没有传递字符串,但是运行程序了,那么数组将会创建为 new String[0],在这种情况下,数组时空的长度为0,args 参考了一个空的数组,因此,args不是Null、但是args.length = 0;

  • 相关阅读:
    phpize使用方法
    PHP安装redis扩展
    lnmp 搭建后,nginx下php文件404但是html文件正常访问
    nginx配置https访问安装ssl证书
    Linux安装git最新版本
    微信公众号开发处理微信昵称带图片问题
    如何撰写技术文档
    Asp.Net Core 2.0实现HttpResponse中繁切换
    EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改
    Windows注册表详解
  • 原文地址:https://www.cnblogs.com/rynerlute/p/6384155.html
Copyright © 2020-2023  润新知