Java Foundationの研究ノート(6) - データ構造とコレクション

データ構造の知識

1.データ構造の使用は何ですか?

 データ構造の合理的な使用は、あなたがより簡単に格納されたデータを見つけることができます。

2.一般的なデータ構造

一般的なデータ記憶構造:スタック、キュー、配列、リンクリスト、および赤黒木。

  • スタック:線形計算テーブルにより制限されるスタック(スタック)は、唯一のテーブル(スタック)の一方の端部に挿入および欠失を可能にします。入口と出口の最後のアウトスタックによって特徴付けスタックの最上部にあります。
  • キュー:線形形式が制限スタックとして頭字チーム(キュー)、その動作は同じであり、唯一のテーブルに挿入され一端、削除の一端を可能にします。FIFOキューと入口半分と出口側が特徴。
  • 配列:配列、それは要素の順序付けられたシーケンスです。配列は、メモリ内の記憶素子に連続したオープンスペースです。(新しい配列を作成し、各要素に追加および削除)特性の要素が速い検索(配列インデックスでは、迅速要素を見つけることができます)、低速の要素を追加または削除。
  • リスト:リンクされたリスト、ノード組成、ノードは、実行時に動的に生成されたノードの集合(リスト内の各要素は、ノードと呼ばれます)。データを格納する次のデータフィールドと、ノードを指すポインタ・フィールド:各ノードは、2つの部分から構成されています。(次のノードのメモリアドレスにできるだけの編集リンク)遅い機能の検索(ノードだけに目を通す引き返す)、高速な要素を追加または削除。
  • 赤黒木:それは、バイナリツリーに属します。バイナリツリー、バイナリツリーは、各ノードは、順序付けられたツリーのせいぜい2ではありません。赤黒木の特性ルートノードが黒である、ブラックリーフノードは、各ノードの子ノードは、黒、赤、各黒ノードの同一のリーフノードへのすべてのパス上にある任意のノードです。

第二に、コレクション

理解のコレクション

コレクションは、複数のデータを格納するために使用することができ、Javaで提供される容器です。

コレクションと配列の違い:

  • 可変長の固定長組のアレイ。
  • アレイは、要素の同じタイプを格納することができます。オブジェクトのセットを格納し、オブジェクトの種類が異なっていてもよいです。

1.  コレクションコレクション

コレクションは、ある一連の要素を格納するための特定の規則を満たして、ルート・インタフェース別のコレクションクラス。

これは、それぞれ、二つの重要なサブインターフェースを有し、java.util.Listそしてjava.util.Set

  • List整然とした要素によって特徴づけられる、要素を繰り返すことができます。
  • Set障害は、要素、及び反復しないことを特徴とします。
一般的な方法の別のセット 機能
パブリックブールの追加(E電子)  コレクションに指定されたオブジェクトを追加します
公共のボイドをクリア() コレクションの要素のすべての空
パブリックブール削除(E電子) 現在のコレクション内の指定したオブジェクトを削除します。
パブリックブール値が含まれている(E電子) コレクション内の現在のオブジェクトが指定され含まれているかどうかを決定します
パブリックブールのisEmpty() セットが空であるかどうかを判断
公共int型のサイズ() セット内の要素数を返します。
パブリックオブジェクト[]のtoArray() コレクションの配列を変換します

 

 

 

 

 

 

 

 

 

 

 

 

1.1リスト・コレクション

 

Listインタフェースの一般的な方法 機能
公共ボイド追加(int型のインデックス、E要素) のセットに指定された場所に指定された要素    
公共Eは、(int型のインデックス)を取得します 位置指定された要素のコレクションを返します。
公共E削除(int型のインデックス) リスト位置に指定された要素を削除し、それが取り除かれた要素を返します。
公共Eセット(int型のインデックス、E要素)

位置指定された要素は、更新値の前に設定された復帰要素で指定された要素に置き換えられます。

 

 

 

 

 

 

 

 

 

Listそこにメインインターフェイスの実装クラスjava.util.ArrayListjava.util.LinkedList。 

public class TestList {
    public static void main(String[] args) {
    // 创建List集合对象
        List<String> list = new ArrayList<String>();
        // 尾部添加
        list.add("1");
        list.add("2");
        list.add("3");
        // 指定位置添加
        list.add(1,"没头脑");
        // 删除索引位置为2的元素 
        System.out.println(list.remove(1));
        // 修改指定位置元素
        list.set(0, "5");
  
}

 

1.11 ArrayList 集合

java.util.ArrayList集合数据存储的结构是数组结构。(见 https://www.cnblogs.com/lyxdw/p/11649759.html 第三节)

1.12 LinkedList集合

java.util.LinkedList集合数据存储的结构是链表结构。

 

LinkedList 方法 功能
public void addFirst(E e) 将指定元素插入此列表的开头
public void addLast(E e) 将指定元素添加到此列表的结尾
public E getFirst() 返回此列表的第一个元素
public E getLast() 返回此列表的最后一个元素
public E removeFirst() 移除并返回此列表的第一个元素
public E removeLast() 移除并返回此列表的最后一个元素
public E pop() 从此列表所表示的堆栈处弹出一个元素
public void push(E e) 将元素推入此列表所表示的堆栈
public boolean isEmpty() 如果列表不包含元素,则返回true

 

 

 

 

 

 

 

 

 

 

 

 

 

在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)

public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
        //添加元素
        link.addFirst("1");
        link.addFirst("2");
        link.addFirst("3");
        System.out.println(link);
        // 获取元素
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
        // 删除元素
        System.out.println(link.removeFirst());
        System.out.println(link.removeLast());
    
        while (!link.isEmpty()) { //判断集合是否为空
            System.out.println(link.pop()); //弹出栈顶元素
        }
        System.out.println(link);
    }
}

 1.2 set 集合

Set接口的主要实现类有java.util.HashSet。LinkedHashSet是HashSet子类。

区别:

  • HashSet存储元素无序。LinkedHashSet存储元素有序。
  • HashSet集合存储数据的结构是哈希表,LinkedHashSet是链表和哈希表组合的一个数据存储结构。

什么是哈希表?

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

public class TestHashSet{
    public static void main(String[] args) {
        //创建 Set集合
        HashSet<String>  set = new HashSet<String>();
        //添加元素
        set.add(new String("1"));
        set.add("1");
        set.add("2"); 
        //遍历
        for (String name : set) {
            System.out.println(name);
        }
    }
}
public class TestLinkedHashSet {
    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<String>();
        set.add("1");
        set.add("2");
        set.add("3");
        set.add("4");
        //迭代器
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}            

 

2 . Collections 集合工具类

public static <T> boolean addAll(Collection<T> c, T... elements) 往集合中添加一些元素
public static void shuffle(List<?> list) 打乱集合顺序
public static <T> void sort(List<T> list) 将集合中元素按照默认规则排序
public static <T> void sort(List<T> list,Comparator<? super T> ) 将集合中元素按照指定规则排序

 

 

 

 

 

 

 

 

java.utils.Collections是集合工具类,用来对集合进行操作。

public class TestCollections {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        //添加元素  
        Collections.addAll(list, 1, 2, 3,4);
        //排序
        Collections.sort(list);
   } }
//Comparator
import
java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class TestCollections { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("cbae"); list.add("abafaa"); list.add("sba"); list.add("nb"); //排序方法 按照长度排序 Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.length() - o1.length(); } }); System.out.println(list); } }
//Comparable
public class TestStudent implements Comparable<Student>{
    @Override
    public int compareTo(Student o) {
        return this.age-o.age;//升序
    }
}
  • Comparable:强行对实现它的每个类的对象进行整体排序。通过实现类 重写 compareTo 方法实现,直接使用Collections.sort(list)即可。
  • Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

 

3. Map集合

map 集合属于双列集合。存储的数据是多个键值对,并且键不可以重复,值可以。

 常用方法    功能
 public V put(K key, V value) 把指定的键与指定的值添加到Map集合中。
 public V remove(Object key) 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
 public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
 boolean containsKey(Object key) 判断集合中是否包含指定的键。
 public Set<K> keySet() 获取Map集合中所有的键,存储到Set集合中。
 public Set<Map.Entry<K,V>> entrySet() 获取到Map集合中所有的键值对对象的集合(Set集合)。

 

 

 

 

 

 

 

 

 

HashMap集合

HashMap集合是无序的,存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。可以实现有序存取。

import java.util.HashMap;
public class TestMap {
    public static void main(String[] args){
        //创建HashMap
        HashMap<String, String>  map = new HashMap<String, String>();
        //添加键值对
        map.put("1","张三");
        map.put("2","李四");
        map.put("3","张三");
        //获取键对应值
        System.out.println(map.get("3"));
        //删除键,返回删除键的值
        System.out.println(map.remove("2"));
    }
}

Map中存在两种对象,key和value,Entry(项)将键值对封装成了对象。

  • public K getKey():获取Entry对象中的键。

  • public V getValue():获取Entry对象中的值。

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

 遍历Map集合

import java.util.HashMap;
import java.util.Map.Entry;
public class TestMap {
    public static void main(String[] args){
        //创建HashMap
        HashMap<String, String>  map = new HashMap<String, String>();
        //添加键值对
        map.put("1","张三");
        map.put("2","李四");
        map.put("3","张三");

        for (Entry<String, String> entry : map.entrySet()) {
            // 解析
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"的值:"+value);
        }
    }
}

 

温馨提示

  • 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
  • 如果本文帮助了您,也请评论关注,作为对我的一份鼓励。
  • 如果您感觉我写的有问题,也请批评指正,我会尽量修改。

おすすめ

転載: www.cnblogs.com/lyxdw/p/11655981.html