String类的相关知识

2018-11-22  本文已影响22人  Swen_9826
当你发现时光是贼了,它早已经偷光了你的所有选择!
  • public final class String
  • extends Object
  • implements Serializable, Comparable<String>, CharSequence

API中描述:

中文翻译为:

String类的成员变量:

    /** String的属性值 */  
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    /**数组被使用的开始位置**/
    private final int offset;

    /** The count is the number of characters in the String. */
    /**String中元素的个数**/
    private final int count;

    /** Cache the hash code for the string */
   /**String类型的hash值**/
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
    /**
     * Class String is special cased within the Serialization Stream      Protocol.
     *
     * A String instance is written into an ObjectOutputStream according to
     * <a href="{@docRoot}/../platform/serialization/spec/output.html">
     * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
     */

  private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

String的每个成员变量是被final修饰的,是不可以被改变的,因此String的值只要有改变就会生成一个新的String类型对象。

String类的构造方法:

String() 
//初始化一个新创建的 String 对象,使其表示一个空字符序列。 

String(byte[] bytes) 
//通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 

String(byte[] bytes, Charset charset) 
//通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。 
 
String(byte[] bytes, int offset, int length) 
//通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。 

String(byte[] bytes, int offset, int length, Charset charset) 
//通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。 

String(byte[] bytes, int offset, int length, String charsetName) 
//通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。 

String(byte[] bytes, String charsetName) 
//通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。 

String(char[] value) 
//分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。 

String(char[] value, int offset, int count) 
//分配一个新的 String,它包含取自字符数组参数一个子数组的字符。 

String(int[] codePoints, int offset, int count) 
//分配一个新的 String,它包含 Unicode 代码点数组参数一个子数组的字符。 

String(String original) 
//初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
//换句话说,新创建的字符串是该参数字符串的副本。 

String(StringBuffer buffer) 
//分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。 

String(StringBuilder builder) 
//分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。

构造方法测试:

    public static void main(String[] args) {
        //方法一:String();
        String s1=new String();
        //String这个类重写了Object父类的方法,return this;
        System.out.println("s1:"+s1);
        System.out.println("s1.length:"+s1.length());
        System.out.println("*********************");
  
        //方法二:String(byte[] bytes)
        byte[] byts={97,98,99,100,101,102};
        String s2=new String(byts);
        System.out.println("s2:"+s2);
        System.out.println("s2.length:"+s2.length());
        System.out.println("*********************");
        
        //方法三:String (byte[] bytes,int index,int length)
        byte[] byts2={97,98,99,100,101,102};
        String s3=new String(byts2,2,4);
        System.out.println("s3:"+s3);
        System.out.println("s3.length:"+s3.length());
        System.out.println("*********************");
        
        //方法四:String(char[] value)
        char [] value={'a','b','c','d','e','f'};
        String s4=new String(value);
        System.out.println("s4:"+s4);
        System.out.println("s4.length:"+s4.length());
        System.out.println("*********************");
        
        //方法五:String(char[] value,int index,int length)
        char [] value2={'a','b','c','d','e','f'};
        String s5=new String(value,2,4);
        System.out.println("s5:"+s5);
        System.out.println("s5.length:"+s5.length());
        System.out.println("*********************");
        
        //方法六:String(String str)
        String s6=new String("abcdef");
        System.out.println("s6:"+s6);
        System.out.println("s6.length:"+s6.length());
        System.out.println("*********************");
        
    }

测试结果:

s1:
s1.length:0
*********************
s2:abcdef
s2.length:6
*********************
s3:cdef
s3.length:4
*********************
s4:abcdef
s4.length:6
*********************
s5:cdef
s5.length:4
*********************
s6:abcdef
s6.length:6
*********************

字符串实例化方法与区别:

对于方法一来说,采用直接赋值的方式(String str="Hello Swen ")进行对象的实例化,则会将匿名对象“Hello Swen”放入对象池,每当下一次对不同的对象进行直接赋值的时候会直接利用池中原有的匿名对象,这样,所有直接赋值的String对象相等,返回true;

对于方法二来说,第一次实例化时在堆中分配内存,如图:


第一次new

在第二次new相同字符串时会在堆内存中重新分配内存,创建对象,见图:


第二次new

String类常用方法:

        String str = "Hello Swen";      
        System.out.println("字符串的长度:"+str.length());
        //字符串的长度:10
        String str = "Hello Swen";  
        System.out.println("指定位置的字符:"+str.charAt(0));
        //指定位置的字符:H
        String str = "Hello Swen";
        System.out.println("提取字符串中的子串:"+str.substring(6));
        //提取字符串中的子串:Swen
        System.out.println("提取字符串中的子串:"+str.substring(6,10));
        //提取字符串中的子串:Swen
        String str = "Hello Swen";
        System.out.println("字符串比较:"+str.equals("Hello Swen"));
        //字符串比较:true
        System.out.println("字符串比较:"+str.equalsIgnoreCase("hello swen"));
        //字符串比较:true
        System.out.println("字符串比较:"+str.compareTo("Hallo Swen"));
        //字符串比较:4
        System.out.println("字符串比较:"+str.compareToIgnoreCase("hello swem"));
        //字符串比较:1
        String str = "Hello Swen";
        System.out.println("字符串连接:"+str.concat("--记得加油哦!"));
        //字符串连接:Hello Swen--记得加油哦!
        String str = "Hello Swen";
        System.out.println("字符串中单个字符查找:"+str.indexOf('l'));
        //字符串中单个字符查找:2
        System.out.println("字符串中单个字符查找:"+str.indexOf("Swen"));
        //字符串中单个字符查找:6
        System.out.println("字符串中单个字符查找:"+str.indexOf('l',3));
        //字符串中单个字符查找:3
        System.out.println("字符串中单个字符查找:"+str.lastIndexOf("l"));
        //字符串中单个字符查找:3
        System.out.println("字符串中单个字符查找:"+str.lastIndexOf("wen"));
        //字符串中单个字符查找:7
        String str = "Hello Swen";
        System.out.println("字符串中字符的大小写转换:"+str.toUpperCase());
        //字符串中字符的大小写转换:HELLO SWEN
        System.out.println("字符串中字符的大小写转换:"+str.toLowerCase());
        //字符串中字符的大小写转换:hello swen
        String str = "Hello Swen";
        System.out.println("字符串中字符的替换:"+str.replace('l', 'a'));
        //字符串中字符的替换:Heaao Swen
        System.out.println("字符串中字符的替换:"+str.replace("l", "oo"));
        //字符串中字符的替换:Heooooo Swen
        System.out.println("字符串中字符的替换:"+str.replaceFirst("He", "xxx"));
        //字符串中字符的替换:xxxllo Swen
        System.out.println("字符串中字符的替换:"+str.replaceAll("l", "qq"));
        //字符串中字符的替换:Heqqqqo Swen
        String str = "Hello Swen ";
        System.out.println("去掉空格前:"+str.length());
        System.out.println("去掉空格后:"+str.trim().length());
        //去掉空格前:11
        //去掉空格后:10
        String str = "Hello Swen";
        System.out.println("包含:"+str.contains("Swen"));
        //包含:true
        String str = "Hello Swen";
        System.out.println("分割:"+str.split(" ")[0]+"----"+str.split(" ")[1]);
        //分割:Hello----Swen
        System.out.println(String.valueOf(12.23).length());
        //5
        String s = "236";
        System.out.println(Integer.parseInt(s) == 236);
        //true
上一篇 下一篇

猜你喜欢

热点阅读