zoukankan      html  css  js  c++  java
  • 对Java中字符串的进一步理解

      字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下

      在Java中,字符串被作为String类型的对象处理,和基本数据类型不同,字符串可以直接使用各种字符串对象的方法,而基本数据类型不行,String类位于java.lang包中,默认情况下该包会被自动的导入所有的应用程序

      String对象创建后不能被更改,是不可变的,我们重新赋值并不是修改了对象所引用的内存空间的数据,而是创建了新的对象,只是以前的对象指向了新的地址,所以随着字符串被重新赋值的次数越多,内存中无用的垃圾数据也会越来越多

      看下面一个简单的例子:

     1 public class HelloWorld {
     2     public static void main(String[] args) {
     3         String s1 = "abc";
     4         String s2 = "abc";
     5 
     6         String s3 = "I love" + s1;
     7         
     8                  // 比较字符串s1和s2
     9         System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
    10         
    11                 //比较字符串s1和s3
    12         System.out.println("s1和s3内存地址相同吗?" +  (s1 == s3)               );
    13 
    14         String s4 = "I love " + s1;
    15                 //比较字符串s4和s3
    16         // s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
    17         System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
    18                 String s5 = new String("abcd");
    19                 String s6 = new String("abcd");
    20                 //比较s5和s6
    21                 String.out.println("s5和s6内存地址相同吗?" + (s5 == s6));
    22     }
    23 }

    分析一下运行结果,首先知道==比较的是对象在内存中的地址,而不是引用的值,看s1和s2,因为s1和s2紧接着出现,所以编译器会进行优化,s1和s2会指向同一内存区域,所以s1 == s2返回true

    对s3赋值 I love abc之后,s3是一个新的字符串对象,所以s1 == s3返回false

    对s4赋值后,s4也是一个对象,虽然s3和s4的值相等,但是系统不会因为这个把它们指向同一内存地址,所以s3和s4是两个独立的对象,s3 == s4返回false

    根据s1 == s2返回true,推测s5和s6也是紧接着出现,所以应该指向同一内存地址,其实不是,只要通过new关键字都会创建新的对象,尽管内容相同,所以s5 == s6返回false

      看一下String类常用的方法

      比如实例化String对象:String abc = "abc";就可以通过abc.方法()来调用指定的方法,常用的方法列表如下:

    有几点需要注意一下:

    1、字符串str的字符索引和数组一样从0开始,到str.length()-1

    2、使用indexOf查找时,如果匹配则返回位置索引,如果找不到则返回-1

    3、使用substring方法截取字符串时,包括beginIndex位置的字符串,不包括endIndex位置的字符串

    4、比较两个字符串内容是否相等时,一定要用equals方法,不要用==来比较,前面说了==是比较两个字符串对象指向内存地址的首地址,但比较字符型等基本数据类型时可以用==比较值

    字符串操作的方法有很多,这个需要多练习才可以加强记忆

      String类具有不可变的特性,当频繁操作字符串时,会产生很多额外的临时变量,所以使用StringBuilder或者StringBuffer可以避免这些问题

      StringBuffer是线程安全的,而StringBuilder没有实现线程安全,所以性能比StringBuffer高一些,一般情况下,创建一个内容可变的字符串对象,优先使用StringBuilder类,这个类常用的方法如下图:

    简单使用方法如下:

    1 //创建StringBuilder对象
    2 SrtingBuilder str = new StringBuilder("hello");
    3 str.append("world");
    4 System.out.println("str内容为:" + str + "长度为:" + str.length());
    5 str.insert(5, ",");
    6 str.insert(11, "!");
    7 System.out.println("str内容为:" + str);

    append方法是字符串后面追加一段字符串,和String对象不同,字符串更新后,原来内存地址不会被保留,这样就节省了内存空间

    length方法和String一致

    insert是在指定位置插入字符,比如str.insert(5, ",");是在索引位置5插入",",也可以理解为在原来的位置5之前放置一个","

    toString方法可以把StringBuilder对象转换为String对象,程序中会多出一个对象,转换方式:String str2 = str.toString();

    所以程序输出结果是:

    str内容为:helloworld长度为:10

    str内容为:hello,world!

    对字符串对象的理解到这里

  • 相关阅读:
    django 使用form组件提交数据之form表单提交
    django from验证组件
    django中间件
    gin中http重复解析body数据失败
    go 常用工具链
    git 提交规范
    go简单实现heap
    Go优雅实现选传参数
    [已解决]protoc-gen-go: unable to determine Go import path for "xxx.proto"
    Go编译工具命令
  • 原文地址:https://www.cnblogs.com/freeweb/p/4824567.html
Copyright © 2011-2022 走看看