一、String与基本数据类型

​ String类是我们Java语言中一个重要的组成部分,在开发的过程中与基本数据类型一样重要。在我面试的大部分应届生中好多人会把它归类为基本数据类型中的一个,其实它是非基本数据类型。

二、String类简述

2.1 String类被final修饰,所以它不能被继承;String一旦被创建,就无法修改,从而它是一个常量,同时可以被共享。

例如: String str = "abc"; 等效于: char data[] = {'a', 'b', 'c'}; String str1 = new String(data); 等效的意思,是堆中只存在一份"abc"字符串对象,而str和str1的引用指向的是此对象。 ps:一旦被创建,就无法修改的意思就是当在堆中创建String对象后,就无法对该对象进行修改了,直到该对象被虚拟机回收。

2.2 String类实现了Serializable、Comparable、CharSequence三个接口。

 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
 }

实现Serializable表示支持序列化与反序列化

实现Comparable表示可以按自然顺序排序

实现CharSequence表示char值得一个可读序列

2.3 String类中变量/常量

/** The value is used for character storage. */
    private final char value[];
    /** Cache the hash code for the string */
    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
    * 
        * Object Serialization Specification, Section 6.2, "Stream Elements"
    */
    private static final ObjectStreamField[] serialPersistentFields =  new ObjectStreamField[0];

2.4 String类中的构造器

        public String() {
        this.value = new char[0];
    }
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

2.5 String类中的方法

这里捡一些比较有意思的方法出来简单的说说。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
             while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                    i++;
             }
             return true;
            }
        }
        return false;
    }

三、String与堆栈

四、String与序列化

五、延伸

jdk 1.8 String类为什么把 offset去掉?

5.1 不可变类设计原则

1.类添加final修饰符,保证类不被继承。

2.保证所有成员变量必须私有,并且加上final修饰

3.不提供改变成员变量的方法,包括setter

4.通过构造器初始化所有成员,进行深拷贝(deep copy)

5.在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

六、小知识

关于Java中有种标记的语法,在看public String toUpperCase(Locale locale) {...}时,才知道还可以这么写。

scan: {
        for (firstLower = 0 ; firstLower < len; ) {
            int c = (int)value[firstLower];
            int srcCount;
            if ((c >= Character.MIN_HIGH_SURROGATE) && (c <= Character.MAX_HIGH_SURROGATE)) {
                c = codePointAt(firstLower);
                srcCount = Character.charCount(c);
            } else {
                srcCount = 1;
            }
            int upperCaseChar = Character.toUpperCaseEx(c);
            if ((upperCaseChar == Character.ERROR) || (c != upperCaseChar)) {
                break scan;
            }
            firstLower += srcCount;
        }
        return this;
    }

这里的scan没有其他作用,只是一种跳出循环的标记罢了。现在知道了,以后可以写代码的时候装一下了。

六、备注

源码基于jdk-1.8.0_31

©2020 洛易                        皖ICP备15026941号-4 该文件修订时间: 2019-08-20 22:53:25

results matching ""

    No results matching ""