理解のJAVA--コレクション

コレクションのレビュー

I.セットとして容器が動的複数のオブジェクトを参照することができます

複数のデータを記憶し、容器に入れました。

アレイは、複数の容器ジャワと呼ばれる操作のデータ構造を格納するように設定されています

第二に、フレームを設定し、

インタフェースCollection:シングルセット、オブジェクトAを格納するための

Interfaceリスト:再生可能な注文データを格納します

実装クラス:ArrayListをLinkedListの

インタフェースセット:ストレージ障害、再現性のないデータ

実装クラス:HashSetの

Mapインタフェース:列のダブルセット、データ対を格納するための1

実装クラス:HashMapの

三、コレクション(なぜないのコレクションは?それは秩序と無秩序なので、繰り返しますが、繰り返さないために、このような容器を見つけることができない、それはリストやセットを使用します)

:(収集方法は、要素のクラスのequalsメソッドをオーバーライドする必要があります)

  1. ブール値を返す)、要素を追加//単純なタイプとすることができ、参照型(追加

    Collection coll=new ArrayList();
           coll.add("aa");
  2. addAll(コレクションc)のデータ収集を追加します//
    Collection coll=new ArrayList();
    Collection coll1=new ArrayList();
    coll1.add("bb");
    coll.addAll(coll1);
  3. クリア()//空のコレクション
    Collection coll=new ArrayList();
    coll.add("aa");
    coll.clear();
  4. isEmpty()//それが空であるかどうかを決定する、無要素
    Collection coll=new ArrayList();
    coll.add("aa");
    coll.clear();
    coll.isEmpty();
  5. 含まれている(オブジェクトOBJ)は//オブジェクトが含まれている、タイプの文字列が書き換えられた方法に等しく、したがってのみコンテンツを決定する必要がある場合、そのコンテンツの決意は、結果と一致するコンテンツが、結果は一貫性のない偽で、真であります同じことができるかどうかが、JAVA BEANタイプのために、私たちは、そうでない場合は、彼らが偽と判断され、彼らのequalsメソッドを書き換える必要があります。要約した後、コードを見ることができます

    例えば:

    private String name;
    private int age;
    public Person() {
       }
    
       public Person(String name, int age) {
           this.name = name;
           this.age = age;
       }
    
       public String getName() {
           return name;
       }
    
       public void setName(String name) {
           this.name = name;
       }
    
       public int getAge() {
           return age;
       }
    
       public void setAge(int age) {
           this.age = age;
       }
    
       @Override
       public String toString() {
           return "Person{" +
                   "name='" + name + '\'' +
                   ", age=" + age +
                   '}';
       }
    //重写equals方法,如果不写,则结果为false
       @Override
       public boolean equals(Object o) {
           System.out.println("kaishi l ");
           if (this == o) return true;
           if (o == null || getClass() != o.getClass()) return false;
           Person person = (Person) o;
           return age == person.age &&
                   Objects.equals(name, person.name);
       }
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.Date;
    
    public class Demo {
       public static void main(String[] args) {
           Collection coll=new ArrayList();
           coll.add("aa");
           coll.add("bb");
           System.out.println(coll.contains("aa"));//true ,判断是否有aa,有,则为true
    
           coll.add(new String ("huhu"));
           System.out.println(coll.contains(new String("huhu")));//结果为true,因为string底层已经把equals重写过了,直接判断内容
    
           coll.add(new Person("wwuu",123));
           System.out.println(coll.contains(new Person("wwuu",123)));//因为上面已经对Person对象进行重写了equals方法,这里直接判断是否有wuwu,123.有则为true
           //如果上面没有对Person对象的equals方法进行重写,那么这里为false
           //总结:contains比较的是内容,等于用equals方法进行比较
           //我们在判断时,会调用obj对象所在类的equals()方法,故而obj所在类要重写equals()方法。
       }
    }
    
  6. containsAll(コレクションcoll1)//蔵すべての要素の集合が現在のコレクションに存在するかどうかを判断する(注:存在しないときには、すべての要素、偽でした)
    Collection coll=new ArrayList();
    Collection coll1=new ArrayList();
    coll.add("123");
    coll1.add("haha");
    coll.addAll(coll1);
    System.out.println(coll.containsAll(coll1));//true,上面用了addAll()方法,把coll1中的数据都放到了coll中,所以coll包含了coll1,为true
    coll1.add("uiui");
    System.out.println(coll.containsAll(coll1));//false,这里是因为coll1新加了一条数据,而coll中没有这条数据,故而为false
  7. (オブジェクトOBJ)を除去(要素を削除し、要素のクラスの等しい()メソッドを書き換えます)
    coll.remove(new Person("wwuu",123));
    System.out.println(coll);//由于上述的方法中已经对Person这个类进行了equals()方法的重写,故而这里是可以对new Person("wwuu",123)这个元素进行删除的,如果不重写equals方法则删除不了
  8. remoeAll(コレクションcoll)は(コル要素()メソッドのクラスを書き換える等しいすべての要素を、削除)
    coll.removeAll(coll1);
    System.out.println(coll1);
    System.out.println(coll);
  9. retainAll(コレクションcoll)(平均の交点要素及び要素の電流のみコレクションを保存するだけでなく、他のセットで、すなわち、要素()メソッドの同じカテゴリを書き換えるコルの現在取得した組の交点)
    
    Collection coll2=new ArrayList();
           coll2.add(123);
           coll2.add(new String ("huhu"));
           coll2.add(new String("bb"));
           coll.retainAll(coll2);
           System.out.println(coll);
  10. 等しい(オブジェクト O)を(ここではOBJがジョブに設定されなければならない場合、二組が等しいかどうかを判断するだけでなく、()要素のクラスのメソッドに等しいを書き換える。同じ位置を持たない順序集合についてそれはその位置が異なっていてもよい非順序集合であれば、唯一の要素は、同じであってもよいです。)
    Collection coll3= Arrays.asList(123,"huhu","bb");
    System.out.println(coll2.equals(coll3));
  11. ハッシュコード()(コンピュータに実装された方法のハッシュコードのハッシュ値、戻り値がintです)
    System.out.println(coll3.hashCode());
  12. toArray()(セットスイッチアレイ)
    Object[] objects = coll3.toArray();
            for (Object o: objects) {
                System.out.println(o);
            }
    この展開:セットへの配列(参照するにはさまざまなニーズに応じて、パラメータは、Arrays.asList(Tを使用する際に注意を払う)が変形可能な人参であることは、パラメータ、整数2つのパラメータになりますintまたはそのパッケージング整数、int型の裁判官を書くことです)
    List list2 = Arrays.asList(new int[]{123, 455});
    List list3 = Arrays.asList(new Integer[]{123, 455});
    System.out.println(list2.size());//结果是1,判断一个参数
    System.out.println(list3.size());//结果是2,判断2个参数
  13. イテレータ()(イテレータインターフェース:時間の使用のコレクションを)
    Iterator iterator=coll2.iterator();
    while (iterator.hasNext()){
           System.out.println(iterator.next());
    }
    開発:内部がremoveメソッドを定義するには、コレクション内の要素を削除することができます
  14. foreachの
    foreach(Object obj: coll2){
        System.out.println(obj);
    }

一覧----(通称:動的配列)反復順序付け

彼は、通常、代わりに配列のリスト、インターフェイスである3実装クラスのArrayList、LinkedListは、ベクトルがあります

類似点と3の間の違い:ArrayListを、LinkedListは、ベクトル?

類似点:リスト3つのクラスのインターフェイスを実装し、同じ特性のデータが保存され、再現性、注文しました

違い:

ArrayListの:彼と一緒に、基本的に、インタフェースを実装するメインクラス、スレッドセーフな、高効率、高速クエリとしてリスト、オブジェクト[]からelementDataデータ・ストレージ・アレイを使用して、ボトム

LikedList:頻繁に挿入や削除の操作のために、二重にリンクされたリストを使用して、基盤となるストレージよりも効率的なのLinkedListのArrayListを使用して

ベクター:そこ一覧旧インタフェースの実装クラス、めったに使われない、JDK 1.0、他の一覧、スレッドセーフな、低効率を含む1.2が表示され、ある;オブジェクト[]からelementData格納されたデータを使用して下層

(java.utilパッケージの下)ArrayListのソース解析:

JDK7:

作られたオブジェクトが配列の底部が初期化される与えるJDK7

ArrayList arraylist=new ArrayList();

1566870572500

1566870822848

JDK8:、元の配列の初期化を与えるメモリ空間を節約、より良いこのように、我々は、addメソッドを呼び出すときに、私たちの配列が作成されますしないでください

1566871345927

1566871300000

要約:

1566871955045

LinkedListのソースコード解析

二重リンクリストです、


import java.util.LinkedList;

public class LinkedListTest<E> {
    int size;
    transient MyNode first;
    transient MyNode last;

    private static class MyNode<E>{
        private E element;
        private MyNode prev;
        private MyNode next;
        public MyNode(MyNode prev, E ele, MyNode next){
            this.element=ele;
            this.prev=prev;
            this.next=next;
        }
    }
//添加元素的方法,里面有一个拼接的方法一个Node分为三部分:【prev】【元素】【next】
    public void add(E ele){
        appendLast(ele);
    }
    //定义l节点为last,
    public void appendLast(E ele){
        MyNode<E> l=last;
        MyNode newNode=new MyNode(l,ele,null);
        //last节点为新节点
        last=newNode;
        //判断新节点的【prev】是否为null,是则表示为该新节点为【null】【ele】【null】
        //表示新结点为first
        //否则,表示不是首节点,则把last的【next】指向新结点
        if(l==null){
            first=newNode;
        }else {
            l.next=newNode;
        }
        size++;
    }

    public void remove(E obj){
        //删除元素
        //从头开始遍历,一直遍历到结尾,只要没到结尾就继续遍历
        for (MyNode pos=first;pos!=null;pos=pos.next){
            //判断,当前元素pos是不是想要删除的元素,是的就进行unlink方法,只要找到了就break
            if (pos.element.equals(obj)){
                unlink(pos);
                break;
            }
        }
    }
    //这里就是删除元素的方法
    private void unlink(MyNode<E> pos){
        //首先定义当前pos元素【prev】【ele】【next】
        E ele=pos.element;
        MyNode<E> prev=pos.prev;
        MyNode<E> next=pos.next;
        //判断当前元素的【prev】是不是空,如果是空,那就表示是first,为第一个节点
        //那就直接把第一个删除,然后把pos后面的节点MyNode<E> next=pos.next 赋值给first
        //并把当前元素pos的【next】变成null,就不会指向后面的结点了,就断开连接了
        if (prev==null){
            first=next;
            pos.next=null;
        }else {
            prev.next=next;
            pos.prev=null;
        }
        //判断当前元素是不是最后一个,如果是就删除最后一个元素,即让前一个元素的变成为最后一个last结点
        //否则把下一个元素的【prev】指向prev结点
        if (next==null){
            last=prev;
            pos.prev=null;
        }else {
            next.prev=prev;
            pos.next=null;
        }
        pos.element=null;
        size--;
    }
}

セットコレクション

インターフェースは、データストレージの障害が重複していない、Setインタフェースは、新しいメソッドが追加されていないが、Collectionインタフェースを拡張し、そのListインタフェースの使用に同じ実装クラスを使用します。要素のサイズを大きくし、要素の数を取得するメソッドを追加する方法があります。

要件:
セットにデータを追加するには、クラスオーバーライドのhashCode()とequals()メソッドでなければなりません。
ハッシュコードを書き換え()とequals()可能な限り一貫性を維持:つまり、同じオブジェクトが(同じオブジェクトが同じハッシュ値を持つ)は、同じハッシュコードを持つ必要があります

三つのクラスで実装:

HashSetのプライマリインターフェイスとして設定する実装クラスは、スレッドセーフ:あなたは、null値を格納することができます

LinkedHashSetの:HashSetのサブクラスは、内部サブクラスは添加順序にトラバースすることができるトラバースするときにポインタが、追加され、HashSetの基礎です。

TreeSetの:データに格納された使用赤黒木はTreeSetのは、同じタイプのものでなければならない必要な、追加するオブジェクトの既知の特性に応じて分類することができ

障害の理解を繰り返すことはできません。

1.障害:HashSetのは、要素のコレクションを格納する方法について説明します。

障害:ランダム性を意味するものではありません。配列の配列インデックスの順に格納されたデータを追加しません。しかし、決定されたデータのハッシュ値に応じました。

我々はHashSetのに要素を格納する場合、この要素は、直接内部HashSetのメンテナンス配列に格納されません。

しかし、現在の最初の要素に応じて(このメソッドは、メソッドのhashCodeオブジェクトクラスである)アルゴリズムと組み合わせて、格納する、この要素の現在位置が配列に格納されなければならない計算します。

​ 在存放数据的时候,如果计算出来的位置上已经有元素,这时还会去调用当前正要存放的这个元素的equals方法,把已经在计算出位置上的那个元素一起进行比较,如果equals方法返回的true,就丢弃当前正要存放的元素。如果equals方法返会的false,当前这个对象还要存储。

2.不可重复性:HashSet集合是如何保证元素不重复

​ 不可重复性:表示在hashset中的元素 是不可重复的

当给hashset中存放元素的时候会先调用对象的hashCode方法,计算哈希值,根据哈希值来决定当前对象在集合中的存储位置。

​ 在存储的时候,如果遇到了哈希值相同的元素,这时集合的底层还会去调用当前对象的equals方法,判断当前正要存放的对象和

​ 位置上已经存在的对象是否是同一个对象,equals方法返回的true,就认为相同对象,不保存,如果equals方法返回的false,当前对象已经会被保存

1566963564305

计算哈希值得时候减少冲突

1566964307805

1566964075136

链表与数组的区别:

  1. 对于在内存中数据的存放顺序及位置:

    数组中元素是按顺序存放的,那么在内存中也是按顺序存放的,但是链表中元素存放的位置与内存中存放的顺序及位置不一致;

    2.对于扩容的速度:

​ 链表的速度要快于数组,数据的扩容需要在内存在新申请一片内存空间,而链表直接扩就行

Map接口

存储双列数据:存储key--value键值对的数据

一、实现类

HashMap:主要实现类;线程不安全,效率高,可以存储null的key和value,key为null可以使用方法,不会报空指针异常
LinkedHashMap---HashMap的子类;保证在遍历map元素时,可以按照添加的顺序实现遍历。

​ 原因:在原有的hashMap底层结构基础上,添加一对指针,指向前一个和后一个元素。

​ 对于频繁的遍历操作, 此类执行效率高于HashMap

TreeMap:可以按照添加的key-value进行排序,实现遍历,按照key进行排序

​ 底层使用红黑树进行排序

ハッシュテーブル----古代の実装クラス、スレッドセーフな、低効率、メソッドを使用してnullに、キーをキーとnull値を格納することができない、それが報告されますnullポインタ例外
プロパティ--- Hashtableのサブクラスは、キーとString型総士の値の設定ファイルを処理するために使用されます
スレッドセーフ

1566965278032

インタビューの質問:

ハッシュマップの基礎となる原理を達成するために1(周波数)

2.HashMapとHashtableの間の類似点と相違点

二、構造のMAPの理解:

キーのマップ:ランダム、非繰り返し、すべてのストレージ・キーのセットを使用して、

要件:クラスあなたが(等号を上書きしたいキー)とhashCode()

値のマップ:無秩序、再現性、格納されている値のコレクションのすべてを使用して

要件:あなたは等号を上書きしたいクラス値()メソッド

キーと値のペア:キー値がエントリを構成し、キー値は、プロパティのエントリであります

地図エントリ:ランダム、非繰り返し、すべてのエントリストレージのセットで

HashMapのの第三に、基本原理

ハッシュ衝突:

溶液1:再ハッシング===ハッシュ値を再度算出され、各要素は一意のインデックス(位置)を有するアップまで

解決方法2:リンクアドレスリンクリスト方式===

JDK7

1567015171057

import java.util.HashMap;

public class HashMapTest <K,V>{

    private Entry<K,V>[]table;
    private static final Integer INITCAPACITY=8;
    private int size;
    public HashMapTest(){
        table=new Entry[INITCAPACITY];
    }
    private int size(){
        return size;
    }
    private V get(Object key){
        int hash=key.hashCode();
        int i=hash%table.length;
        for (Entry<K,V> entry=table[i];entry!=null;entry=entry.next){
            if (entry.k.equals(key)){
                return entry.v;
            }
        }
        return null;
    }
    private V put(K key,V value){

        int hash=key.hashCode();
        int i=hash%table.length;
        for (Entry<K,V> entry=table[i];entry!=null;entry=entry.next){
            if (entry.k.equals(key)){
                V oldvalue=entry.v;
                entry.v=value;
                return oldvalue;
            }
        }
        addEntry(key, value, i);
        return null;
    }

    private void addEntry(K key, V value, int i) {
        Entry<K,V> entry=new Entry<K,V>(key,value,table[i]);
        table[i]=entry;
        size++;
    }

    class Entry<K,V>{
        private K k;
        private V v;
        private Entry<K,V>next;

        public Entry() {
        }

        public Entry(K k, V v, Entry<K, V> next) {
            this.k = k;
            this.v = v;
            this.next = next;
        }

        public K getK() {
            return k;
        }

        public V getV() {
            return v;
        }

    }

    public static void main(String[] args) {
        HashMapTest<Integer ,String>hashMapTest=new HashMapTest<Integer, String>();
        for(int i=0;i<10;i++){
            hashMapTest.put(i,"结束"+i);
            System.out.println(hashMapTest.get(i));
        }

    }
}

1567015212088

おすすめ

転載: blog.51cto.com/14522074/2434382