Java String类学习笔记

String 不是java中的基本类型,在java中,字符串属于对象,Java 提供了 String 类来建立和操做字符串。java

  • 建立字符的两种方式

        String 类是不可改变的,因此你一旦建立了 String 对象,那它的值就没法改变了数组

String  message = "hello";
        System.out.println(message);
        
        char []  mes_1= {'h','e','l','l','o'};
        String message_1 = new String(mes_1);
        System.out.println(message_1);
  1. String类是final类,也即意味着String类不能被继承,而且它的成员方法都默认为final方法。在Java中,被final修饰的类是不容许被继承的,而且该类中的成员方法都默认为final方法。
  2. String类实际上是经过char数组来保存字符串的。
  3. 不管是sub操做、concat仍是replace操做都不是在原有的字符串上进行的,而是从新生成了一个新的字符串对象。也就是说进行这些操做后,最原始的字符串并无被改变。“String对象一旦被建立就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操做都会生成新的对象”
  4. 使用String不必定建立对象,使用new String,必定建立对象

        在执行到双引号包含字符串的语句时,如String a = "123",JVM会先到常量池里查找,若是有的话返回常量池里的这个实例的引用,不然的话建立一个新实例并置入常量池里。因此,当咱们在使用诸如String str = "abc";的格式定义对象时,老是想固然地认为,建立了String类的对象str。担忧陷阱!对象可能并无被建立!而可能只是指向一个先前已经建立的对象。只有经过new()方法才能保证每次都建立一个新的对象。安全

    5.关于equals和==多线程

(1)对于==,若是做用于基本数据类型的变量(byte,short,char,int,long,float,double,boolean ),则直接比较其存储的"值"是否相等;若是做用于引用类型的变量(String),则比较的是所指向的对象的地址(便是否指向同一个对象)。app

(2)equals方法是基类Object中的方法,所以对于全部的继承于Object的类都会有该方法。在Object类中,equals方法是用来比较两个对象的引用是否相等,便是否指向同一个对象。ui

(3)对于equals方法,注意:equals方法不能做用于基本数据类型的变量。若是没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;而String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。其余的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。线程

    6. String、StringBuffer、StringBuilder的区别对象

(1)可变与不可变:String是不可变字符串对象,StringBuilder和StringBuffer是可变字符串对象(其内部的字符数组长度可变)。继承

(2)是否多线程安全:String中的对象是不可变的,也就能够理解为常量,显然线程安全字符串

        StringBuffer 与 StringBuilder 中的方法和功能彻底是等价的,只是StringBuffer 中的方法大都采用了synchronized 关键字进行修饰,所以是线程安全的,而 StringBuilder 没有这个修饰,能够被认为是非线程安全的。

(3)String、StringBuilder、StringBuffer三者的执行效率:
       StringBuilder > StringBuffer > String 固然这个是相对的,不必定在全部状况下都是这样。

       好比String str = "hello"+ "world"的效率就比 StringBuilder st  = new StringBuilder().append("hello").append("world")要高。

       所以,这三个类是各有利弊,应当根据不一样的状况来进行选择使用:        当字符串相加操做或者改动较少的状况下,建议使用 String str="hello"这种形式;        当字符串相加操做较多的状况下,建议使用StringBuilder,若是采用了多线程,则使用StringBuffer。

相关文章
相关标签/搜索