`
一片秋叶一树春
  • 浏览: 1835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java String类的一点总结

阅读更多

1.重要特征:
        
          String 字符串常量---》是不可改变的量,在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算。
         
          StringBuffer 字符串变量(线程安全)---》运行在多线程环境,且频繁进行字符串运算(如拼接、替换、删除等),则可以考虑使用 StringBuffer,
                                                   例如 XML 解析、HTTP 参数解析和封装。
         
          StringBuilder 字符串变量(非线程安全)---》运行在单线程的环境中,且频繁进行字符串运算(如拼接、替换、和删除等),则可以考虑使用 StringBuilder,
                                                     如 SQL 语句的拼装、JSON 封装等。
   1.2创建字符串的三种方式:
            使用new关键字创建字符串,比如String s1 = new String("abc");

            直接指定。比如String s2 = "abc";-----》使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,
                                                   池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。

            使用串联生成新的字符串。比如String s3 = "ab" + "c";

      原理1:当使用任何方式来创建一个字符串对象s=X时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
 
      原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
 
      原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
 
      原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。


2.String特性【不能被继承】:

           String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法
         
           String类其实是通过【本质】char数组来保存字符串的【实现了charsequence接口】
 
           对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象【如concat sub replace】
   
    2.2JVM常量池:
           常量池中的数据是那些在编译期间被确定,并被保存在已编译的.class文件中的一些数据。除了包含所有的8种基本数据类型
          (char、byte、short、int、long、float、double、boolean)外,还有String及其数组的常量值,另外还有一些以文本形式出现的符号引用。

    2.3java栈【数据共享】:
            栈的特点是存取速度快(比堆块),但是空间小,数据生命周期固定,只能生存到方法结束。

            【例子】:如boolean b = true、char c = ‘c’、String str = “123”
                      true、c、123,这些等号右边的指的是编译期间可以被确定的内容,都被维护在常量池中
                      b、c、str这些等号左边第一个出现的指的是一个引用,引用的内容是等号右边数据在常量池中的地址
                      boolean、char、String这些是引用的类型
             
       2.4String【intern()】及其他基本数据类型也都是一样的:先看常量池中有没有要创建的数据,有就返回数据的地址,没有就创建一个。

       2.5String += “hello”或者字符串连接符 +
                               【会生成多个builder对象】 编译器每次碰到”+”的时候,会new一个StringBuilder出来,接着调用append方法,在调用toString方法,生成新字符串。
                                         
                                ---》会自动被JVM优化成:StringBuilder str = new StringBuilder(string);----》多个”+“将会创建很多的StringBuilder对象
                                                        str.append(“hello”);
                                                        str.toString();

         2.6String的concat()--》
                                通过两次字符串的拷贝,产生一个新的字符数组buf[],再根据字符数组buf[],new一个新的String对象出来
                                concat方法调用N次,将发生N*2次数组拷贝以及new出N个String对象,无论对于时间还是空间都是一种浪费。
        
    2.7String重写了equals()----》==比较的是引用类型变量的地址,基本类型变量的值
                                  equals()比较的不在是地址而是值


3.StringBuffer特性【线程安全】:
            StringBuffer和StringBuilder原理一样,无非是在底层维护了一个char数组,每次append的时候就往char数组里面放字符而已,在最终sb.toString()的时候,
            用一个new String()方法把char数组里面的内容都转成String。整个过程就new了一个StringBuilder对象一个String对象

        3.1同StringBuilder,在append()追加,将只会创建一次对象,在原来的基础上追加

        3.2都用在频繁进行字符串运算的环境中

        3.3对于间接相加(即包含字符串引用),形如s1+s2+s3; 效率要比直接相( String str = "111" + "222" + "333")加低,因为在编译器不会对引用变量进行优化。
            编译时优化:
            【例】String a = “hello2″;   String b = “hello” + 2; ------》  a==b在编译期间被优化为hello2,故运行期间指向相同的常量池地址
                  String a = “hello2″;    String b = “hello”;       String c = b + 2;----》!a==c存在引用,未能在编译期优化,生成的对象保存在堆上,地址不一致
                  String a = “hello2″;    final String b = “hello”; String c = b + 2;-----》a==c final定义,b在编译期直接被真实值替换,地址同
                  String a = "hello2";      final String b = getHello();  String c = b + 2;-----》赋值通过方法调用返回,b的值在运行期间才能知道,故地址不一致
    
               String str1 = "I"; str1 += "love"+"java";(1)    str1 = str1+"love"+"java";(2)(1会进行优化,而2不会,故1的效率高)
                

4.StringBuilder特性【线程不安全】:

      
       4.1StringBuilder唯一的性能损耗点在于char数组不够的时候需要进行扩容,扩容需要进行数组拷贝,一定程度上降低了效率。
          优化:如果可以估计到要拼接的字符串的长度的话,尽量利用构造函数指定他们的长度。


5.String str = new String(“abc”)创建了多少个对象
 
       5.1代码在运行期间确实只创建了一个对象,即在堆上创建了”abc”对象

       5.2运行时常量池中创建了一个”abc”对象,而在代码执行过程中确实只创建了一个String对象。

       5.3涉及到2个String对象

6.toString()   每个java类都会从Object类继承toString()方法。如:println()编译器会自动添加toString(),不用手动显示添加

7.null与“”的区别

         13.1String s="";【分配了一个内存空间,存了一个字符串对象】
                声明了一个对象实例,这个引用已经指向了一块是空字符串的内存空间,是一个实际的东西了,所以你可以对它进行任何操作

         13.2String a=null;【null是未分配堆内存空间,引用未指向任何内存空间】
                声明了一个空对象,对空对象做任何操作都不行的(报NullPointException),除了=和== 

         13.3String b;【声明一个字符串对象,但并没有分配内存】
                在成员变量的定义中,String s;等同于String s=null;-----》初始化为null

                而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值【否则报异常】。
               
                在方法中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器会自动赋初值。

    解决空字符串问题:
             对于字符串空值的判定,建议使用 apache-commons-lang  http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html

             有 isBlank/isNotBlank【包含“ ”】 和 isEmpty/isNotEmpty【不包含“ ”做非空处理】 方法【对于null “”的判定相同】

0
0
分享到:
评论

相关推荐

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    Java常用类与基础API-String的理解与不可变性

    ### Java常用类与基础API-String的理解与不可变性 #### 一、字符串相关类之不可变字符序列:String ##### (1) 对String类的理解(以JDK8为例说明) **1. 环境** 本文档使用JDK 8进行演示。JDK 8的环境设置确保了...

    Java内部类总结

    3. **代码简洁性**:使用内部类可以减少代码的冗余,尤其是在需要频繁访问外部类成员的情况下,内部类可以轻松做到这一点。 4. **灵活性**:内部类提供了一种将类的定义和实现与外部逻辑紧密耦合的方式,使得类的...

    区分java中String+String和String+char

    在Java编程语言中,字符串操作是常见的任务,而`String`类提供了多种方式来组合或连接字符串。本文将深入探讨`String+String`和`String+char`这两种不同操作之间的区别。 首先,我们要理解Java编译器的优化机制。在...

    corejava基础知识复习与总结

    ### Java基础知识复习与总结 #### 变量与方法 在Java中,对于实例变量,如果没有显式地赋值,那么会根据其数据类型自动获得一个默认值:数值型变量为0,布尔型变量为`false`,引用类型的变量为`null`。然而,局部...

    Java 最常见面试题总结.pdf

    但是,许多Java类(如`String`和`Integer`)重写了`equals`方法来实现更灵活的比较逻辑,通常是基于对象的内容(值)进行比较。 - **示例**:下面通过一个简单的例子来理解这一点: ```java class Cat { ...

    (2020最新)Java面试题.pdf

    :不属于,因为String是Java中的一个类。 7. Java中的字符串操作类有哪些?它们之间有什么区别?:String、StringBuilder、StringBuffer等,String是不可变的,StringBuilder和StringBuffer是可变的。 8. String str...

    java String 可变性的分析

    总结来说,Java中的String对象虽然表面上看起来不可变,但在进行如`replace()`、`substring()`等操作时,实际上是创建了新的String对象,原对象的引用并未改变,因此从引用的角度来看,String对象是不可变的。...

    在linux和windows下动态设置classpath调用java类方法脚本代码

    总结,理解并正确设置Java的类路径对于有效地运行Java应用程序至关重要。无论是Linux还是Windows,都有多种方式来实现这一目标。动态设置classpath在某些情况下非常有用,比如处理模块化系统、加载运行时库或者测试...

    java基础知识大总结

    ### Java基础知识大总结 #### 一、基础概念与特性 1. **Null的打印结果**:在Java中,如果尝试打印一个null值的对象引用,输出结果将会是`null`。 2. **字符串常量的拼接问题**:当在字符串中出现如`'10'`这样的...

    Java中BigInteger方法总结

    这一点与 `String` 类相似,但 `BigInteger` 的初始化过程稍微复杂一些。以下是几种常见的 `BigInteger` 构造函数: 1. **BigInteger(String val)**:接受一个包含十进制数值的字符串作为参数,将其转换为 `...

    java代码-BigDecimal转String

    总结一下,`BigDecimal`到`String`的转换主要涉及`toString()`、`DecimalFormat`以及`NumberFormat`。在处理金融计算时,确保精度是至关重要的,而`BigDecimal`和相关的转换方法可以帮助我们实现这一点。理解这些...

    StringTable.pdf

    StringTable确保了这一点,它是一个哈希表,存放的是字符串引用而非字符串本身。 2. **内存分布**:在JDK6及之前,StringTable位于JVM的永久代;JDK7开始,移到了Java堆;JDK8进一步改到了元空间,以减少永久代的...

    Java中常用的各种技能

    在 Java 中,可以使用 `String` 类的 `join()` 方法将数组中的元素组合成字符串,但是 Java 中没有内置的方法可以直接实现这一点。 5. Java 中的命名规范 在 Java 中,方法名通常使用小写字母开头,而类名使用大写...

    java基础总结(非常详细)

    以下是关于Java基础知识的详细总结: 首先,我们讨论Java的运行机制。Java源代码首先由Java编译器(javac)编译成字节码(.class文件),这是一种平台无关的中间表示。字节码在Java虚拟机(JVM)上运行,JVM将字节...

    java replace

    在Java编程语言中,`replace`方法是字符串(String)类的一个重要成员,用于替换字符串中的特定字符或子串。这个方法在处理文本数据时非常常用,尤其在我们需要替换某个字符或者模式时。下面我们将详细探讨`replace`...

    java除去类里面的黄色警告

    例如,当你从`List`转换到`List<String>`而没有显式地使用`List<String>`创建`List`时,就会触发此类警告。为了抑制这种警告,可以使用`@SuppressWarnings("unchecked")`注解,但需谨慎使用,因为这可能隐藏了潜在的...

    JAVA调用webservice并解析xml

    总结,调用Java中的Web服务并解析XML涉及到了Web服务的基础概念、Java的Web服务客户端创建、XML解析技术以及实际的调用与响应处理。熟练掌握这些知识点,能够帮助开发者有效地集成和利用各种Web服务资源。

    Java必须理解的六大问题及学习方向和方法

    在Java中,`String`类被设计为不可变的,这意味着一旦创建了一个`String`对象,它的内容就不能被更改。例如: ```java String s = "Hello"; s = s + " world!"; ``` 在这个例子中,虽然看起来像是在修改`s`的值,...

Global site tag (gtag.js) - Google Analytics