zoukankan      html  css  js  c++  java
  • Java之String

    1,Java中的String位于lang包下,通过阅读源码可知

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0

    String实现了三个接口,并且由final修饰,final修饰符保证了此类不会被继承,也就是说不能通过子类改变此欸中的方法或者属性,保证了其安全性

    2,查看api文档,可知

    • String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

    • 字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:
     String str = "abc";

      相当于

         char data[] = {'a', 'b', 'c'};
         String str = new String(data);

    并且通过源码可知,Java中String实质上相当于字符数组,

    api中还有一句话 

    Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder (或StringBuffer )类及其append方法实现的。

    可知通过 '+'号来拼接字符串实质上是通过StringBuilder或者StringBuffer两个字符缓冲数组来拼接,而StringBuilder或StringBuffer两个方法实质上是由一个新创建的字符数组,通过System包下的arraycopy方法将原来字符串的重新拷贝得到的。方法源码如下

    * @param      src      the source array.
    * @param      srcPos   starting position in the source array.
    * @param      dest     the destination array.
    * @param      destPos  starting position in the destination data.
    * @param      length   the number of array elements to be copied.
    public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);

    3,String的一些常用方法

    构造方法

    String(char[] value) 
    分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。 
     
    int compareTo(String anotherString)   //按字典顺序比较两个字符串。 

    此方法因继承comparable接口得来

    源码如下

    public int compareTo(String anotherString) {
            int len1 = value.length;
            int len2 = anotherString.value.length;
            int lim = Math.min(len1, len2);
            char v1[] = value;
            char v2[] = anotherString.value;
    
            int k = 0;
            while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
            }
            return len1 - len2;
        }

    通过字符数组的一个个字符相减来判断是否一致,一旦一个结果不为0则返回相减的结果、

    String[] split(String regex) //将此字符串分割为给定的正则表达式的匹配。
    String[] split(String regex, int limit)   //将此字符串分割为给定的正则表达式的匹配。例如limit为2,那么数组的长度最长为2
    String substring(int beginIndex) 
    String substring(int beginIndex, int endIndex) //返回一个字符串,该字符串是此字符串的子字符串。 

    4,String, StringBuffer,StringBuilder

     StringBuffer,StringBuilder是一个字符缓冲数组,当然String通过 '+' 来拼接字符串,也是通过 StringBuffer或者StringBuilder

    通过查看StringBuffer源码得知

    /**
    * Constructs a string buffer with no characters in it and an
    * initial capacity of 16 characters.
    */
    public StringBuffer() {
    super(16);
    }

    进入父类构造
    AbstractStringBuilder(int capacity) {
    value = new char[capacity];
    }

    无参构造创建了一个容量为16的字符数组

    查看其append方法源码,加了synchronized关键字,所以线程安全,用在多线程环境中,而

        @Override
        public synchronized StringBuffer append(String str) {
            toStringCache = null;
            super.append(str);
            return this;
        }

    而StringBuilder的append方法没有synchronized关键字所以线程不安全,用在单线程环境中,当然,相比较,StringBuilder比StringBuffer更高,应为没有锁

        @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }
  • 相关阅读:
    51nod 1125 交换机器的最小代价
    货物运输 51Nod
    hihoCode 1075 : 开锁魔法III
    糖果
    区间 GCD
    poj2186--tarjan+缩点(有向图的强连通分量中点的个数)
    Hdu 4738【tanjan求无向图的桥】割边判定定理 dfn[x] < low[y]
    回文树介绍
    回文树总结
    140. 后缀数组(hash + 二分 / 后缀数组)
  • 原文地址:https://www.cnblogs.com/hunt1coder/p/12775766.html
Copyright © 2011-2022 走看看