µ±Ç°Î»Öà ²©ÎÄÊ×Ò³ > weixin_33883178µÄ²©¿Í£º½ÌÃÃѧ Java£º´óÓпÉΪµÄ¼¯ºÏ

    weixin_33883178µÄ²©¿Í£º½ÌÃÃѧ Java£º´óÓпÉΪµÄ¼¯ºÏ

    ×÷Õߣº[db:×÷Õß] ʱ¼ä£º2021-07-10 22:31

    00¡¢¹ÊʵÄÆðÔ´

    ¡°¶þ¸ç,ÉÏһƪ¡¶·ºÐÍ¡·µÄ·´ÏìЧ¹ûÔõôÑù°¡?¡±ÈýÃöÔËýÌáÒéµÄ¡¶½ÌÃÃѧ Java¡·×¨À¸ºÜÊǹØÐÄ¡£

    ¡°ÓÐÈËÆÀÂÛ˵,¡®¶þ¸çÄãÇôúÂ붼Çóö»ÃÏëÁË°¡¡£¡¯¡±

    ¡°ºÇºÇ,Õâ¾ä»°³ä³â×ÅÂúÂúµÄ·í´ÌÒâζ°¡¡£¡±ÈýÃÃÓеãÄѹýÁËÆðÀ´¡£

    ¡°²»¹ý,Ò²ÓÐÈËÆÀÂÛ˵,¡®½¨ÒéÕâ¸öϵÁеÄÎÄÕ¶àд°¡,ÒòΪÎÒ»¨ÁË°ë¸öÔ¶¼Ã»¿´¶®¡¶ Java ±à³Ì˼Ïë¡·ÖйØÓÚ·ºÐ͵Ľ²½â,µ«ÔÙ¿´ÍêÕâƪÎÄÕºóÖÕÓÚÈÚ»á¹áͨÁË,±ÈÐÄ¡£¡¯¡±

    ¡°¶þ¸ç,ÄãÄܲ»ÄÜÏÈ˵ºÃÏûÏ¢°¡?ÕæÊǵġ£ÎÒÒ²Òª¸øÕâλůÐĵĶÁÕß±ÈÐÄÁË¡£¡±ÈýÃÃ˵ÍêÕâ¾ä»°¾ÍÔÚÎÒÃæÇ°±ÈÁËÒ»¸öÐÄ,ÎÒ³òÁËËýÒ»ÑÛ,·¢ÏÖËý֮ǰµÄ³îÈÝÒ²ÎÞÓ°ÎÞ×ÙÁË¡£

    ¡°ÄǽÓÏÂÀ´,¶þ¸ç»¹Òª¼ÌÐøдÂð?¡±ÎÒ¿´µ½ÁËÈýÃÃÉîÇéµÄÄ¿¹â¡£

    ¡°àÅ,ÎÒÏë¸Ãд¼¯ºÏÁË¡£¡±

    ¡°ÄǾÍÈÃÎÒ¼ÌÐøÀ´ÌáÎÊ°É,¶þ¸çÄã¼ÌÐøÀ´»Ø´ð¡£¡±ÈýÃÃÒѾ­Ô¾Ô¾ÓûÊÔÁË¡£

    01¡¢¶þ¸ç,ʲôÊǼ¯ºÏ°¡?

    ÈýÃÃ,Ìý¸çÂýÂý¸øÄã½²°¡¡£

    JDK 1.2 µÄʱºòÒýÈëÁ˼¯ºÏµÄ¸ÅÄî,ÓÃÀ´°üº¬Ò»×éÊý¾Ý½á¹¹¡£ÓëÊý×鲻ͬµÄÊÇ,ÕâЩÊý¾Ý½á¹¹µÄ´æ´¢¿Õ¼ä»áËæ×ÅÔªËØÔö¼Ó¶ø¶¯Ì¬Ôö¼Ó¡£ÆäÖÐ,ÓÐһЩ¼¯ºÏÀàÖ§³ÖÌí¼ÓÖظ´ÔªËØ,¶øÁíһЩ²»Ö§³Ö;ÓÐһЩ֧³ÖÌí¼Ó null ÔªËØ,¶øÁíһЩ²»Ö§³Ö¡£

    ¿ÉÒÔ¸ù¾Ý¼Ì³ÐÌåϵ½«¼¯ºÏ·ÖΪÁ½´óÀà,Ò»ÀàʵÏÖÁË Collection ½Ó¿Ú(¼ûͼ 1),ÁíÒ»ÀàʵÏÖÁË Map ½Ó¿Ú(¼ûͼ 2)¡£

    ½éÉÜÒ»ÏÂͼ 1:

    1)Collection ÊÇËùÓм¯ºÏÀàµÄ¸ù½Ó¿Ú¡£

    2)Set ½Ó¿ÚµÄʵÏÖÀ಻ÔÊÐíÖظ´µÄÔªËØ,ÀýÈç HashSet¡¢LinkedHashSet¡£

    3)List ½Ó¿ÚµÄʵÏÖÀàÔÊÐíÖظ´ÔªËØ,¿Éͨ¹ý index ·ÃÎʶÔӦλÖÃÉϵÄÔªËØ,ÀýÈç LinkedList¡¢ArrayList¡£

    4)Queue ½Ó¿ÚµÄʵÏÖÀàÔÊÐíÔÚ¶ÓÁеÄβ²¿»òÕßÍ·²¿Ôö¼Ó»òÕßɾ³ýÔªËØ,ÀýÈç PriorityQueue¡£

    ½éÉÜÒ»ÏÂͼ 2:

    1)HashMap ÊÇ×î³£ÓÃµÄ Map,¿ÉÒÔ¸ù¾Ý¼üÖ±½Ó»ñÈ¡¶ÔÓ¦µÄÖµ,Ëü¸ù¾Ý¼üµÄ hashCode Öµ´æ´¢Êý¾Ý,ËùÒÔ·ÃÎÊËٶȷdz£¿ì¡£HashMap ×î¶àÖ»ÔÊÐíÒ»Ìõ¼Ç¼µÄ¼üΪ null (¶àÌõ»á¸²¸Ç);µ«ÔÊÐí¶àÌõ¼Ç¼µÄֵΪ null¡£

    2)TreeMap Äܹ»°ÑËü±£´æµÄ¼Ç¼¸ù¾Ý¼ü(²»ÔÊÐí¼üµÄֵΪ null)ÅÅÐò,ĬÈÏÊÇÉýÐò,Ò²¿ÉÒÔÖ¸¶¨ÅÅÐòµÄ±È½ÏÆ÷,µ±Óõü´úÆ÷(Iterator)±éÀú TreeMap ʱ,µÃµ½µÄ¼Ç¼ÊÇÅŹýÐòµÄ¡£

    3)Hashtable µÄ¼üºÍÖµ¾ù²»ÔÊÐíΪ null,ÊÇÏß³Ìͬ²½µÄ,Ò²¾ÍÊÇ˵ÈÎһʱ¿ÌÖ»ÓÐÒ»¸öÏß³ÌÄÜд Hashtable,Ïß³Ìͬ²½»áÏûºÄµôһЩÐÔÄÜ,Òò´Ë Hashtable ÔÚдÈëʱ»¨·ÑµÄʱ¼äÒ²»á±È½Ï¶à¡£

    4)LinkedHashMap ±£´æÁ˼ǼµÄ²åÈë˳Ðò,µ±Óõü´úÆ÷(Iterator)±éÀú LinkedHashMap ʱ,Ïȵõ½µÄ¼Ç¼¿Ï¶¨ÊÇÏȲåÈëµÄ¡£¼üºÍÖµ¾ùÔÊÐíΪ null¡£

    ÓÐÁ˼¯ºÏµÄ°ïÖú,³ÌÐòÔ±²»ÔÙÐèÒªÇ××ÔʵÏÖÔªËصÄÅÅÐò¡¢²éÕҵȵײãËã·¨ÁË¡£ÁíÍâ,»ùÓÚÊý×éʵÏֵļ¯ºÏÀàÔÚƵ·±¶ÁȡʱÐÔÄܸü¼Ñ,±ÈÈç˵ ArrayList;»ùÓÚ¶ÓÁÐʵÏֵļ¯ºÏÀàÔÚƵ·±Ôö¼Ó¡¢¸üС¢É¾³ýÊý¾ÝʱЧÂʸü¸ß,±ÈÈç˵ LinkedList;³ÌÐòÔ±ËùÒª×öµÄ¾ÍÊÇ,¸ù¾ÝÒµÎñÐèҪѡÔñÊʵ±µÄ¼¯ºÏÀà,ÖÁÓÚÐÔÄܵ÷ÓÅÂï,¿ÉÒÔ΢ÐÅÕÒ¶þ¸ç¡£

    02¡¢¶þ¸ç,LinkedList ºÍ ArrayList ÓÐʲôÇø±ð°¡?

    ÈýÃÃ,¸ÕÌáÍêÎÊÌâ¾Í´òíï°¡,¼ÌÐøÌý¸ç¸øÄãÂýÂý½²°¡¡£

    LinkedList ÆäʵÊÇÒ»¸öË«ÏòÁ´±í,À´¿´Ô´Âë¡£

    public class LinkedList<E>
    {
        transient int size = 0;
    
        /**
         * Pointer to first node.
         * Invariant: (first == null && last == null) ||
         *            (first.prev == null && first.item != null)
         */
        transient Node<E> first;
    
        /**
         * Pointer to last node.
         * Invariant: (first == null && last == null) ||
         *            (last.next == null && last.item != null)
         */
        transient Node<E> last;
    
        private static class Node<E> {
            E item;
            Node<E> next;
            Node<E> prev;
    
            Node(Node<E> prev, E element, Node<E> next) {
                this.item = element;
                this.next = next;
                this.prev = prev;
            }
        }
    }
    ¸´ÖÆ´úÂë

    1)LinkedList °üº¬Ò»¸ö·Ç³£ÖØÒªµÄÄÚ²¿Àࡪ¡ªNode¡£Node ÊǽڵãËù¶ÔÓ¦µÄÊý¾Ý½á¹¹,item Ϊµ±Ç°½ÚµãµÄÖµ,prev ΪÉÏÒ»¸ö½Úµã,next ΪÏÂÒ»¸ö½Úµã¡ª¡ªÕâÒ²ÕýÊÇ¡°Ë«Ïò¡±Á´±íµÄÔ­Òò¡£first Ϊ LinkedList µÄµÚÒ»¸ö½Úµã,last Ϊ×îºóÒ»¸ö½Úµã¡£

    2)size ÊÇ LinkedList µÄ½Úµã¸öÊý¡£µ±Íù LinkedList Ìí¼ÓÒ»¸öÔªËØʱ,size+1,ɾ³ýÒ»¸öÔªËØʱ,size-1¡£

    ArrayList ÆäʵÊÇÒ»¸ö¶¯Ì¬Êý×é,À´¿´Ô´Âë¡£

    public class ArrayList<E>
    {
         /**
         * The array buffer into which the elements of the ArrayList are stored.
         * The capacity of the ArrayList is the length of this array buffer. Any
         * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
         * will be expanded to DEFAULT_CAPACITY when the first element is added.
         */
        transient Object[] elementData; // non-private to simplify nested class access
    
        /**
         * The size of the ArrayList (the number of elements it contains).
         *
         * @serial
         */
        private int size;
    }
    ¸´ÖÆ´úÂë

    1)elementData ÊÇ Object ÀàÐ͵ÄÊý×é,ÓÃÀ´±£´æÌí¼Óµ½ ArrayList ÖеÄÔªËØ¡£Èç¹ûͨ¹ýĬÈϹ¹Ôì²ÎÊý´´½¨ ArrayList ¶ÔÏóʱ,elementData µÄĬÈÏ´óСÊÇ 10¡£µ± ArrayList ÈÝÁ¿²»×ãÒÔÈÝÄÉÈ«²¿ÔªËØʱ,¾Í»áÖØÐÂÉèÖÃÈÝÁ¿,еÄÈÝÁ¿ = ԭʼÈÝÁ¿ + (ԭʼÈÝÁ¿ >> 1)(²ÎÕÕÒÔÏ´úÂë)¡£

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    ¸´ÖÆ´úÂë

    >> ÔËËã·û»¹Ã»ÓмÝÔ¦ÁË¡£²»¹ý,ͨ¹ý´úÂë²âÊÔºóµÄ½áÂÛÊÇ,µ±Ô­Ê¼ÈÝÁ¿Îª 10 µÄʱºò,еÄÈÝÁ¿Îª 15;µ±Ô­Ê¼ÈÝÁ¿Îª 20 µÄʱºò,еÄÈÝÁ¿Îª 30¡£

    2) size ÊÇ ArrayList µÄÔªËظöÊý¡£µ±Íù ArrayList Ìí¼ÓÒ»¸öÔªËØʱ,size+1,ɾ³ýÒ»¸öÔªËØʱ,size-1¡£

    ÓÉÓÚ LinkedList ºÍ ArrayList µ×²ãʵÏֵIJ»Í¬(Ò»¸öË«ÏòÁ´±í,Ò»¸ö¶¯Ì¬Êý×é),ËüÃÇÖ®¼äµÄÇø±ðÒ²ºÜһĿÁËÈ»¡£

    ¹Ø¼üµã1 :LinkedList ÔÚÌí¼Ó(add(E e))¡¢²åÈë(add(int index, E element))¡¢É¾³ý(remove(int index))ÔªËصÄÐÔÄÜÉÏÔ¶³¬ ArrayList¡£

    ΪʲôÄØ?ÏÈÀ´¿´ ArrayList µÄÏà¹ØÔ´Âë¡£

    // ensureCapacityInternal() ·½·¨ÄÚ²¿»áµ÷Óà System.arraycopy()
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    
    public void add(int index, E element) {
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }
    
    public E remove(int index) {
        E oldValue = elementData(index);
    
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    
        return oldValue;
    }
    ¸´ÖÆ´úÂë

    ¹Û²ì ArrayList µÄÔ´Âë,¾ÍÄܹ»·¢ÏÖ,ArrayList ÔÚÌí¼Ó¡¢²åÈ롢ɾ³ýÔªËصÄʱºò,»áÓÐÒâ»òÕßÎÞÒâ(À©ÈÝ)µÄµ÷Óà System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) ·½·¨,¸Ã·½·¨¶ÔÐÔÄܵÄËðºÄÊǷdz£ÑÏÖصġ£

    ÔÙÀ´¿´ LinkedList µÄÏà¹ØÔ´Âë¡£

    /**
     * Links e as last element.
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
    }
    /**
     * Unlinks non-null node x.
     */
    E unlink(Node<E> x) {
    
        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }
    
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }
    
        x.item = null;
        return element;
    }
    ¸´ÖÆ´úÂë

    LinkedList ²»´æÔÚÀ©ÈݵÄÎÊÌâ,Ò²²»ÐèÒª¶ÔÔ­ÓеÄÔªËؽøÐи´ÖÆ;Ö»ÐèÒª¸Ä±ä½ÚµãµÄÊý¾Ý¾ÍºÃÁË¡£

    ¹Ø¼üµã2:LinkedList ÔÚ²éÕÒÔªËØʱҪÂýÓÚ ArrayList¡£

    ΪʲôÄØ?ÏÈÀ´¿´ LinkedList µÄÏà¹ØÔ´Âë¡£

    /**
     * Returns the (non-null) Node at the specified element index.
     */
    Node<E> node(int index) {
        // assert isElementIndex(index);
    
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }
    ¸´ÖÆ´úÂë

    ¹Û²ì LinkedList µÄÔ´Âë,¾ÍÄܹ»·¢ÏÖ, LinkedList ÔÚ¶¨Î» index µÄʱºò»áÏÈÅжÏλÖÃ(ÊÇÔÚ 1 / 2 µÄÇ°Ã滹ÊǺóÃæ),ÔÙ´ÓÇ°Íùºó»òÕß´ÓºóÍùÇ°Ö´ÐÐ for Ñ­»·ÒÀ´ÎÕÒ¡£

    ÔÙÀ´¿´ ArrayList µÄÏà¹ØÔ´Âë¡£

    @SuppressWarnings("unchecked")
    E elementData(int index) {
        return (E) elementData[index];
    }
    ¸´ÖÆ´úÂë

    ArrayList Ö±½Ó¸ù¾Ý index ´ÓÊý×éÖÐÈ¡³ö¸ÃλÖÃÉϵÄÔªËØ,²»ÐèÒª for Ñ­»·±éÀú°¡¡ª¡ªÕâÑùÏÔÈ»¸ü¿ì!

    03¡¢¶þ¸ç,HashMap ºÍ TreeMap ÓÐʲôÇø±ð°¡?

    ÈýÃÃ,ÌáÎÊÌâÔ½À´Ô½ÓÐÒÕÊõÁË°¡?¼ÌÐøÌý¸ç¸øÄãÂýÂý½²°¡¡£

    HashMap ´æ´¢µÄÊǼüÖµ¶Ô,Æä¼üÊÇÒ»¸ö¹þÏ£Âë(Hash µÄÖ±Òë,Ò²³Æ×÷É¢ÁÐ)¡£À´¿´Ô´Âë¡£

    public class HashMap<K,V>
    {
        transient Node<K,V>[] table;
        static class Node<K,V> implements Map.Entry<K,V> {
            final int hash;
            final K key;
            V value;
            Node<K,V> next;
        }
        public HashMap(int initialCapacity, float loadFactor) {
            this.loadFactor = loadFactor;
            this.threshold = tableSizeFor(initialCapacity);
        }
    }
    ¸´ÖÆ´úÂë

    1)table ÊÇÒ»¸ö Node Êý×é,¶ø Node ÊÇÒ»¸öµ¥ÏòÁ´±í(Ö»ÓÐ next)¡£HashMap µÄ¼üÖµ¶Ô¾Í´æ´¢ÔÚ table Êý×éÖС£

    2)loadFactor ¾ÍÊÇ´óÃû¶¦¶¦µÄ¼ÓÔØÒò×Ó,ĬÈϵļÓÔØÒò×ÓÊÇ 0.75, ¾Ý˵ÕâÊÇÔÚʱ¼äºÍ¿Õ¼ä³É±¾ÉÏÑ°ÇóµÄÒ»ÖÖÕÛÖÔ¡£

    3)initialCapacity ¾ÍÊdzõʼÈÝÁ¿,ĬÈÏΪ 16¡£ ?? 4)threshold ÊÇ HashMap µÄãÐÖµ¡ª¡ªÅжÏÊÇ·ñÐèÒª¶Ô HashMap ½øÐÐÀ©ÈÝ,threshold µÄÖµ = ÈÝÁ¿ * ¼ÓÔØÒò×Ó,µ± HashMap Öд洢µÄÊý¾ÝÊýÁ¿´ïµ½ threshold ʱ,¾ÍÐèÒª½« HashMap µÄÈÝÁ¿¼Ó±¶¡£

    ¡°³õʼÈÝÁ¿¡± ºÍ ¡°¼ÓÔØÒò×Ó¡±¶Ô HashMap µÄÐÔÄÜÓ°ÏìÆÄ´ó¡£ÈÝÁ¿ÊÇ HashMap ÖÐÍ°(¼ûÏÂͼ)µÄÊýÁ¿,³õʼÈÝÁ¿Ö»ÊÇ HashMap ÔÚ´´½¨Ê±µÄÈÝÁ¿¡£¼ÓÔØÒò×ÓÊÇ HashMap ÔÚÆäÈÝÁ¿×Ô¶¯Ôö¼Ó֮ǰ¿ÉÒÔ´ïµ½¶àÂúµÄÒ»Öֳ߶ȡ£

    TreeMap ´æ´¢µÄÊÇÓÐÐòµÄ¼üÖµ¶Ô,»ùÓÚºìºÚÊ÷(Red-Black tree)ʵÏÖ¡£¿ÉÒÔÔÚ³õʼ»¯µÄʱºòÖ¸¶¨¼üλµÄÅÅÐò·½Ê½,Èç¹ûûÓÐÖ¸¶¨µÄ»°¾Í¸ù¾Ý¼üλµÄ×ÔȻ˳Ðò½øÐÐÅÅÐò¡£À´¿´Ô´Âë¡£

    public class TreeMap<K,V>
    {
        private final Comparator<? super K> comparator;
        private transient Entry<K,V> root;
        private static final boolean RED   = false;
        private static final boolean BLACK = true;
        static final class Entry<K,V> implements Map.Entry<K,V> {
            K key;
            V value;
            Entry<K,V> left;
            Entry<K,V> right;
            Entry<K,V> parent;
            boolean color = BLACK;
        }
    }
    ¸´ÖÆ´úÂë

    1)root ÊǺìºÚÊ÷µÄ¸ù½Úµã,ÊÇÒ»¸ö Entry ÀàÐÍ(°´ÕÕ key ½øÐÐÅÅÐò),°üº¬ÁË key(¼ü)¡¢value(Öµ)¡¢left(×ó±ßµÄ×Ó½Úµã)¡¢right(ÓұߵÄ×Ó½Úµã)¡¢parent(¸¸½Úµã)¡¢color(ÑÕÉ«)¡£

    2)comparator ÊǺìºÚÊ÷µÄÅÅÐò·½Ê½,ÊÇÒ»¸ö Comparator ½Ó¿ÚÀàÐÍ,¸Ã½Ó¿ÚÀïÃæÓÐÒ»¸ö compare ·½·¨,ÓÐÁ½¸ö²ÎÊý T o1 ºÍ T o2,ÊÇ·ºÐ͵ıíʾ·½Ê½,±íʾ´ý±È½ÏµÄÁ½¸ö¶ÔÏó,¸Ã·½·¨µÄ·µ»ØÖµÊÇÒ»¸öÕûÐÎ, o1´óÓÚo2,·µ»ØÕýÕûÊý; o1µÈÓÚo2,·µ»Ø0;o1СÓÚo3,·µ»Ø¸ºÕûÊý¡£

    ×ܽáһϾÍÊÇ,HashMap ÊÊÓÃÓÚÔÚ Map ÖвåÈ롢ɾ³ýºÍ¶¨Î»ÔªËØ;TreeMap ÊÊÓÃÓÚ°´×ÔȻ˳Ðò»ò×Ô¶¨Òå˳Ðò±éÀú¼ü(key)¡£

    04¡¢¶þ¸ç,ÔÙ½²½²¶þ·Ö²éÕÒßÂ!

    ÈýÃÃ,ûÓÐÈκÎÎÊÌâ,°üÔÚÎÒÉíÉÏ¡£²»¹ý,ÔÚ½²Ö®Ç°,ÄãÄÜÏÈÈ¥¸ø¸çÅݱ­¿§·ÈÂð?

    ͨ³£,ÎÒÃÇ´ÓÊý×éÖвéÕÒÒ»¸öÔªËØʱ,ÐèÒª¶ÔÕû¸öÊý×é½øÐбéÀú¡£µ«Èç¹ûÕâ¸öÊý×éÊÇÅÅÐò¹ýµÄ,¾Í¿ÉÒÔ½øÐжþ·Ö²éÕÒÁË¡£

    ¶þ·Ö²éÕҵķ½Ê½:

    µÚÒ»²½,½«Êý×éÖмäλÖÃÉϵÄÔªËØÓëÒª²éÕҵĶÔÏó½øÐбȽÏ,Èç¹ûÁ½ÕßÏàµÈ,Ôò²éÕҳɹ¦;·ñÔò½øÐеڶþ²½¡£

    µÚ¶þ²½,ÀûÓÃÖмäλÖý«Êý×é·Ö¸î³ÉÇ°¡¢ºóÁ½¸ö×Ó¼¯¡£

    µÚÈý²½,±È½ÏÒª²éÕҵĶÔÏóÓëÖмäλÖÃÉϵÄÔªËØ,Èç¹ûÇ°Õß´óÓÚºóÕß,ÔòÔÚºóÃæµÄ×Ó¼¯Öа´ÕÕ֮ǰµÄ·½Ê½½øÐвéÕÒ;·ñÔò,ÔÚÇ°ÃæµÄ×Ó¼¯Öа´ÕÕ֮ǰµÄ·½Ê½½øÐвéÕÒ¡£

    ÕâÑù×ö¿ÉÒÔ½«²éÕÒ·¶Î§Ëõ¼õÒ»°ë,´ó´óµÄ¼õÉÙÁ˲éѯµÄ´ÎÊý¡£

    Collections ÀàµÄ binarySearch() ·½·¨ÊµÏÖÁ˶þ·Ö²éÕÒÕâ¸öËã·¨,¿ÉÒÔÖ±½ÓʹÓÃ,Ç°ÌáÊÇÏÈÒªÅÅÐò,·ñÔò½«·µ»Ø -2¡£Ô´ÂëÈçÏ¡£

    private static <T>
    int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
        int low = 0;
        int high = list.size()-1;
    
        while (low <= high) {
            int mid = (low + high) >>> 1;
            Comparable<? super T> midVal = list.get(mid);
            int cmp = midVal.compareTo(key);
    
            if (cmp < 0)
                low = mid + 1;
            else if (cmp > 0)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found
    }
    ¸´ÖÆ´úÂë

    ÎÒÃÇÀ´²âÊÔһϡ£

    List<String> list1 = new ArrayList<>();
    list1.add("³Á");
    list1.add("Ĭ");
    list1.add("Íõ");
    list1.add("¶þ");
    
    Collections.sort(list1); // ÏÈÒªÅÅÐò
    System.out.println(Collections.binarySearch(list1, "Íõ")); // 2
    ¸´ÖÆ´úÂë

    05¡¢¹ÊʵÄδÍê´ýÐø

    ¡°¶þ¸ç,ÖÕÓÚ½²Í꡶¼¯ºÏ¡·ÁË,ºÈ¿Ú¿§·È°É!¡±ÈýÃõÄ̬¶ÈºÜÌåÌù¡£

    ¡°Ð»Ð»¡£¡±

    ¡°¶þ¸ç,Èç¹ûÕâƪÎÄÕ¼ÌÐøÔâÊܵ½ÅúÆÀ,Äã»á²»»áÆøÄÙ°¡?¡±ÈýÃÃÕ£ÁËÕ£ÑÛ¾¦,¼ÌÐøÎÊÎÒ,ÎÒ¿´µ½Ëý³¤³¤µÄ½Þë,ÕæµÄºÜÃÀ¡£

    ¡°àÅ,¶ÔÓÚ×÷ÕßÀ´Ëµ,µ±È»Ï£ÍûÎÄÕÂÄܹ»µÃµ½ÕýÃæµÄ·´À¡,Èç¹ûÊǸºÃæµÄ·´À¡,ÄÇÒ²ÔÚÎÒµÄÒâÁÏÖ®ÖС£¡±

    ¡°ÎªÉ¶?¡±ÈýÃúܺÃÆæ¡£

    ¡°¡¶½ÌÃÃѧ Java¡·ÊÇÒ»ÖÖ´´ÐµÄд×÷ÊÖ·¨,ÊÐÃæÉÏ»¹Ã»ÓÐ,ÐÂÏÊ¡¢ÓÐȤµÄÊÂÎï×ÜÐèÒªÒ»¶Îʱ¼ä²ÅÄܱ»´óÖÚ½ÓÊÜ,·ñÔòÒ²¾Í²»½Ð´´ÐÂÁË¡£¡±

    ¡°¶þ¸ç,ΪÄãµÄÓÂÆøµãÔÞ!¡±¿´µ½ÈýÃúÜΪÎÒ½¾°ÁµÄÑù×Ó,ÎÒµÄÐÄÀïÊ¢¿ªÁËÒ»¶äĵµ¤»¨¡£

    cs