Javaコレクションとソースコード分析

導入する

  1. コレクションと配列は、複数のデータを格納できる構造であり、略してJavaコンテナと呼ばれます。
  2. 配列ストレージデータの機能:
    1. 配列が初期化されると、配列の長さが決定されます
    2. 配列が定義されると、要素を格納できるデータ型が決定されます
  3. 配列にデータを格納することのデメリット:
    1. 不変の長さ
    2. 配列で提供されるメソッドは制限されており、追加や削除などの操作に不便であり、効率は高くありません。
    3. 配列内の有効な要素の数を取得することは困難です
    4. 無秩序で非反復的なニーズを満たすことができない

1つは、Javaコレクションフレームワークです。

コレクションインターフェイス:単一列のコレクション、オブジェクトを1つずつ保存する

リストインターフェイス:順序付けられた繰り返し可能なデータ(動的配列として理解できます)

ArrayList、LinkedHashSet、Vector

セットインターフェース:順序付けられていない、繰り返し不可能なデータ(高校の数学のセットとして理解できます)

HashSet、LinkedHashSet、TreeSet

マップインターフェイス:(キー値)データのペアを格納する2列のコレクション(関数として理解できます)

HashMap、LinkedHashMap、TreeMap、HashTable、Properties

2、コレクションインターフェイスメソッド

コレクションインターフェイスを見ると、実装クラスに実装する抽象メソッドが15あり、そのうち13が以下で詳細に説明されていることがわかります。


1 boolean add(E e)	向集合中添加元素,只能添加引用类型,不能添加基本类型
    
2 boolean addAll(Collection c)	将形参集合的元素添加到当前集合
    
3 void clear()	删除当前集合所有元素
    
4 boolean comtains(Object obj)	会调用obj对象所在类的equals方法,判断形参传入集合中的值是否在当前集合内
    
5 boolean contains(Collection coll)	判断形参coll的元素是否都在当前集合内
    
6 boolean equals(Object o)	判断当前集合和形参集合元素是否相等
    
7 int hashCode()	返回当前集合的hashCode值
    
8 boolean isEmpty()		判断当前集合是否为空
   
9 boolean remove(Object obj)		从当前集合删除obj元素
    
10 boolean removeAll(Collection coll)	从当前集合删除coll集合的所有元素
    
11 boolean retainAll(Collection coll) 	求两个集合的交集,并返回给当前集合
    
12 int size()		返回当前集合的长度
    
13 Object[] toArray() 		将当前集合转换为数组

3、イテレータインターフェイス

Iteratorオブジェクトはイテレーターと呼ばれ、主にコレクションコレクション内の要素をトラバースするために使用されます。また、トラバース中にコレクション内の要素を削除することもできます。

イテレータはコレクショントラバーサルにのみ適用されます

コレクションオブジェクトは、iterator()メソッドが呼び出されるたびに、まったく新しいイテレータオブジェクトを取得します。デフォルトのカーソルは、コレクションの最初の要素の前にあります。

Collection coll = new ArrayList();
Iterator iterator = coll.iterator();

//遍历集合
while(iterator.hasNext()){
    
    
    iterator.next();
}

hasNext()   判断是否还有下一个元素
next()   指针下移、下移后将集合位置上的元素返回

4、コレクションサブインターフェイス1:リスト

List 一般的に使用されるインターフェースの実装クラスは次のとおりです。ArrayList LinkedList Vector

類似点と相違点:

同じ:3つのクラスすべてがリストインターフェイスを実装します

配列リスト Listのメイン実装クラスとして、スレッドは安全で効率的ではなく、最下層はObject []ストレージを使用します
LinkedList 最下層は、二重にリンクされたリストを使用して、効率的に保存、頻繁に追加、および削除します
ベクター リストの古代の実装クラスとして、スレッドセーフ、低効率、および下部のObject []ストレージ

リストインターフェイスの一般的なメソッド

void add(int index,Object ele)	在index位置插入ele元素

boolean addAll(int index,Collection eles)	从index位置开始将eles中的所有元素添加进来
    
Object get(int index)	获取index位置的元素
    
int indexOf(Object obj)		返回obj第一次出现的索引
    
int lastIndexOf(Object obj)		返回obj在当前集合最后一次出现的索引
    
Object remove(int index)	移除index位置的元素,并返回该元素
    
Object set(int index,Object obj)	设置index位置的元素为obj
    
list subList(int fromIndex,int toIndex)		返回从fromIndex到toIndex的子集合	

リストトラバーサル(3つの方法)

ArrayList list = new ArrayList();
list.add(123);
list.add("asd");

//方式一:Iterator方式
Iterator iterator = list.iterator();
while(iterator.hasNext()){
    
    
    iterator.next();
}
//方式二:增强for循环
for(Object obj : list){
    
    
    System.out.println(obj);
}
//方式三:普通for循环
for(int i = 0; i < list.size ; i++){
    
    
    System.out.println(list.get(i));
}

ArrayListソースコード分析:

ArrayList arr = new ArrayList();	//底层创建长度为10的Object[]数组

arr.add(123);	//elementDate[0] = 123
...
arr.add(11);	
//如果此次添加元素导致底层elementDate数组容量不够,则扩容,默认情况下扩容为原来的1.5倍,同时将原数组的元素复制到新数组中
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);

ArrayList arr = new ArrayList();//底层并没有创建长度为10的数组
arr.add(123);	//第一次调用add方法时,才创建长度为10的数组
后续和7之前一样
    
总结:
    7类似于饿汉式、8类似于懒汉式,节省内存

5、コレクションサブインターフェイス2:設定

Setインターフェイスは、Collectionインターフェイスのサブインターフェイスです。追加のメソッドは提供さません。Collectionによって宣言されたすべてのメソッドが使用されます。

セットコレクションに同じ要素を含めることはできません

1.セットの理解

1.1障害

格納された要素は、下部の配列インデックスの順序では追加されませんが、配列のハッシュ値に従って決定されます

1.2、非再現性

1.3、セットに要素を追加するプロセス

ステップ1:要素aをhashSetに追加します。最初に、aが配置されているクラスのhashCodeメソッドを呼び出してハッシュ値を計算し、次にこのハッシュ値を使用して、特定のアルゴリズムを通じて配列に格納されている要素のインデックス値を計算します。 。

ステップ2:インデックス値を取得した後、その位置に要素があるかどうかを判断します。この位置に要素がない場合、追加は成功します。

この位置に要素がある場合は、最初にaとこの位置の要素のハッシュ値を比較します

ハッシュ値が異なる場合、要素aは正常に追加されます

ステップ3:ハッシュ値が同じである場合は、aがであるクラスのequalsメソッドを呼び出し、他の要素をequalsメソッドの仮パラメーターに渡します

メソッドがtrueを返す場合、要素aは追加に失敗しました

メソッドがfalseを返す場合、追加は成功します(リンクリストに保存されます)

2、treeSet

1. treeSetに追加される要素は、同じクラスのオブジェクトである必要があります(サイズを比較できるようにするため)。

2、2つのソート方法

自然順(比較可能なインターフェースの実装)

2つのオブジェクトを同じものと比較するための基準は等しくなくなりましたが、compareToメソッドは0を返します

カスタムソート

2つのオブジェクトが等しいかどうかを比較するための基準は等しくありませんが、

6、マップインターフェイス

1.マップインターフェースのフレーム構造

| ------マップ:キーと値のペアのデータを格納します

| ------ HashMap:Mapのメイン実装クラスとして;スレッドは安全ではありません;高効率

| ------ LinkedHashMap

| ------ TreeMap:並べ替えることができます(キーで並べ替えることができます)

| ------ハッシュテーブル:Mapの古い実装クラスとして;スレッドセーフ;低効率

| ------プロパティ:構成ファイルの処理に一般的に使用されます。キーと値のペアはすべて文字列タイプです

HashMapの基本的な実装原則は?

2.キー値の理解

①マップのキー:順序付けられていない、繰り返し不可(セットで保存)それが配置されているクラスは、equalsメソッドとhashCodeメソッド(HashMapの場合)をオーバーライドする必要があります

②マップの値:順序なし、繰り返し可能(コレクションに格納)クラスのequalsメソッドを書き直す必要があります(HashMapの場合)

③キーと値のペアは、Entryオブジェクトを構成します(セットとともに格納されます)

putに入れられたKey-Valueペアは、実際にはEntryオブジェクトに格納されます。Entryには、keyとvalueの2つの属性があります。

エントリーは無秩序で再現性がありません

3.HashMapの基本的な実装原則

以JDK7说明
    
HashMap map = new HashMap();	实例化以后,底层创建了长度为16的数组Entry[] table
map.put(key,value);		
首先调用key所在类的hashCode方法,计算key的哈希值,此哈希值经过某种算法计算后,得到key在Entry[]中的存放位置
如果此位置数据为空,则键值对添加成功
    如果此位置数据不为空(意味着此位置存放一个或多个数据(链表存储)),比较当前key和这些数据的哈希值,
    	如果key的哈希值与已经存在的数据局哈希值都不相同,则键值对添加成功
    	如果key的哈希值与已经存在的某个key的哈希值相同,则调用key所在类的equal方法
    		返回true,用value去替换已经存在key的value值
    		返回false,则键值对添加成功
默认扩容方式为原来的2倍,并且赋值过来
    
87的不同点
    1new时,底层并没有创建长度为16的数组
    2 jdk8底层的数组是 Node[],而非Entry[]
    3 首次调用put方法时,底层创建长度为16的数组
    4 JDK8底层使用 数组+链表+红黑树(当数组的某个索引位置上以链表形式存在的数据个数>8且当前数组长度>64,此时索引位置上的所有数据改为使用红黑树存储)

4.マップインターフェイスの一般的なメソッド

V put(K key,V value)	向map中添加数据
  
V remove(Object key)	通过指定key移除键值对
    
void clear()	清空map集合
    
Object get(Object key)		通过key获取指定value
    
Boolean containsKey(Object key)		是否包含指定的key
    
Boolean containsValue(Object value)		是否包含指定的value
    
int size() 		返回map键值对的个数
    
Boolean isEmpty()	判断map是否为空
    
Boolean equals(Object obj)	判断两个map是否相等

5.マップトラバーサル

        //遍历所有key
        Set keySet = map.keySet();
        Iterator iterator = keySet.iterator();
        while(iterator.hasNext()){
    
    
            System.out.println(iterator.next());
        }

        //遍历所有value
        Collection values = map.values();
        Iterator iterator1 = values.iterator();
        while(iterator1.hasNext()){
    
    
            System.out.println(iterator1.next());
        }

        //遍历所有键值对
        Set set = map.entrySet();
        for (Object o : set){
    
    
            Map.Entry entry = (Map.Entry) o;
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

セブン、コレクションツール

コレクションは、セット、リスト、およびマップを操作できるツールクラスです。

reverse(List)	反转List中元素的顺序
    
shuffle(List)	对List集合中的元素进行随机排序
    
sort(List)		根据元素的自然排序对List集合元素进行升序排序
    
sort(List,Comparator)	根据指定的Comparator产生的顺序对List进行排序
    
swap(List,int,int)		将指定List集合中的i处元素和j处元素进行交换
    
int frequency(Collection Object)	返回指定元素出现的次数
    
void copy(List dest,List src)		将原集合复制带目标集合

おすすめ

転載: blog.csdn.net/weixin_45321793/article/details/110096891