インターフェイスのデータ構造Java--
私は、自己評価、自己概要についてブログを書くために、初心者でした。
間違った場合は、大物を指摘してください。
参考資料:ゼロベースの学習のJava
基本的な構造:
①設定:データ要素の集合が属します
②線形構造:データ要素との間の1人の関係が存在するかに
③ツリー構造:多の関係の間に構造要素
図④(メッシュ)構造:構造要素は、インター対多の関係であります
また、データは、論理的および物理的な構造に分かれています。
①論理構造:関係(論理関係)は、データの論理構造と呼ばれるデータ要素の間に存在します
②物理的構造:呼ばれるデータの物理的な構造のコンピュータ表現内のデータ構造
そのようなデータ構造は、データを格納する方法を指定する多くのデータ構造インタフェースがあります。
例えばキュー・インターフェース:
interface Queue{
void add(Object obj); //向队尾插入元素
Object remove(); //从队头删除元素
int size(); //查看队列的长度
}
このインタフェースを実装することができ、それは容易なアクセスのために、このようなデータ構造にデータを格納します。
例:
import java.util.*;
public class DataStructureInterface {
public static void main(String args[]){
ArrayList al=new ArrayList();
al.add("zzz");
al.add("zst");
al.add("cxk");
for(int i=0;i<al.size();i++){
System.out.println(al.get(i));
}
}
}
1)コレクションコレクションインタフェース:
データ収集インターフェースは、APIのデータ構造の最上部に位置しているインターフェースのコレクションです。構成単位のコレクションは、要素と呼ばれます。インターフェイスは、追加要素やその他の管理データを削除する機能を提供します。地図インタフェース、セット・インタフェースは、Listインタフェース:データ管理の方法に応じて、インターフェースは3つのコレクションの部分、すなわちに分けることができます
:すべてのクラスは、Collectionインタフェースは、2つの標準コンストラクタを提供しなければならない実装する
空のコレクションを作成するには、*引数なしのコンストラクタを
新しいコレクションを作成するためのパラメータを持つコンストラクタ*コレクション。
この新しいコレクション、着信コレクションは同じ要素を持っています。
(パラメータ化コンストラクタは、レプリケーションのコレクションを実装するためのものです)
コレクションの各要素をトラバースするには?関係なくどのようにイテレータを返すイテレータ()メソッドをサポートする実際の型コレクション。各要素のコレクションにアクセスするためのイテレータを使用してください。
以下のような:
Iterator it=collection.iterator(); //获得一个迭代器
while(it.hasnext()){
Object obj=it.next(); //得到下一个元素
}
設定リストインターフェイスとインターフェイスはインターフェイスの2つの非常に有用なセットであり、そのようなアレイおよびリストなどのデータ構造は、基本的に2つのインターフェースから来ます。
1.Listインタフェース:
インターフェイスリストは、各要素が挿入されているために正確に制御することができる。このインタフェースを使用し、コレクションを命じています。ユーザは、配列に類似している一覧の要素にアクセスするためのインデックス(配列インデックスと同様の位置、にリスト要素)を使用することができます。必要なインターフェース・コレクション・イテレータ()メソッドを有することに加えて、リストは、反復子インタフェースを返す反復子()メソッドを提供します。方法及び基準Iteratorインターフェイスに比べ、反復子の数より多くのアドオン()など、追加、削除、要素を設定するだけでなく、前後に横断することができます。
一般的なクラスは、Listインタフェースは、LinkedListはとのArrayListを持って実装しています。
* LinkedListの:objectlist
LinkedListのは、null要素を許可Listインタフェースを実装しています。また)(、最初のLinkedListまたは尾余分のget()で削除して、()メソッドを挿入します。LinkedListのは、複数のスレッドがリストにアクセスする場合、あなたは彼らの訪問の同期を達成しなければならない、メソッドを同期化されていない、1つの解決策は、リストの一覧を作成するときに、同期を構築することです。
一覧リスト= Collection.synchronizedList(新しいLinkedListの(...));
*のArrayList:ArrayListクラス
ArrayListにはヌルを含め、すべての要素の記憶を可能にする可変サイズのアレイを実現します。ArrayListには同期されません。各ArrayListのインスタンスは、容量(キャパシティ)プロパティ、記憶素子のアレイの、すなわちサイズを有し、この能力は、継続的に、自動的に増加させる新たな要素を追加することができるが、成長アルゴリズムが定義されていません。多数の素子を挿入する必要がある場合、挿入前、挿入の効率を改善するために、容量を増大させるensureCapacity()ArrayListのメソッドを呼び出すことができます。そして、LinkedListのは、ArrayListには非同期です。
2.Setインタフェース:
コレクションセット反復要素、任意の二つの要素E1およびE2の即ち比較を含有していない、結果は等しくありません。ヌル要素に設定します。一般的なクラスが実装し、SetインタフェースはHashSetのとTreeSetのを持っています
* HashSetのコレクション
HashSetのクラスは、null要素を許可Setインタフェースを実装しています。それは繰り返し順序、すなわちのセットを保証するものではありませんように、特別な注意の具体的な使用は、それが一連の不変を保証するものではありません。クラスのセットの基本的な動作は、()()、削除、追加は、()、サイズ()メソッドなどが含まれています。
* TreeSetのコレクション
TreeSetのクラスには、ソート機能を実装HashSetのクラスに比べて、Setインタフェースを実装しています。要素は、デフォルトで昇順に要素のセットに格納されている、または使用される方法の異なる構成によれば、要素の自然順序に従って順序付けされ得る、または提供コレクションセットを作成するときにコンパレータによってソート。
3.Mapマッピングインタフェース:
値マッピングへの鍵を提供していませ後継地図Collectionインタフェースません。地図は、各キーには、値をマッピングすることができ、同じキーを含めることはできません。Mapインタフェースはプールの3種類の地図コンテンツキーグループ、グループセット値またはキーと値のマッピングのセットとして設定することができる視聴提供します。
* Hashtableのクラスハッシュテーブル
ハッシュテーブルは、Mapインタフェース、ハッシュテーブルのキーと値のマッピングを継承しました。非空(null以外)の任意のオブジェクトは、キーまたは値として使用することができます。抽出されたデータが取得使用して、入れ(キー、値)メソッドを使用してデータを追加します(キー)メソッドは、二つの基本的な営業費用は一定です。
ハッシュテーブルは、初期容量と負荷係数二つのパラメータによって調整します。通常、デフォルトの負荷係数0.75は、より良い時間を節約するが、このようなgetおよびputなどの操作に影響を与えるであろう、増加し、対応する時間を見つけることができる負荷率を高め、時間と空間のバランスを達成しました。
例:
Hashtable numbers=new Hashtable();
numbers.put("one",new Integer(1));
numbers.put("two",new Integer(2));
numbers.put("three",new Integer(3));
//如果想取出2,可以用相应的key
Integer n=(Integer)numbers.get("two");
System.out.println("two="+n);
キーなどのオブジェクトは、対応する値は、キーオブジェクトのいずれかのhashCode()とequals()メソッドを実装する必要があり、そのハッシュ関数を計算する位置によって決定されるであろう。ルートクラスオブジェクトから継承されたハッシュコード()とequals()メソッド。あなたがキーとしてカスタムクラスを使用している場合、それは非常に注意する必要があります。定義されたハッシュ関数、二つのオブジェクト場合と同じ、すなわちobj1.equals(OBJ2)が真=ように、その後、それらのハッシュコードが同じでなければなりません。2つのオブジェクトが異なる場合でも、彼らは必ずしも異なるハッシュコードではありません。同一の2つの異なるオブジェクト、競合として知られる現象であればハッシュコード。競合がハッシュテーブル増加の時間動作を過ごすにつながる、従って、定義されたハッシュコード()メソッドのように、ハッシュテーブルの動作をスピードアップすることができます。
だから、注意:等号()メソッドとhashCode()メソッドを書き換えるだけではなく、それらのいずれかを書き込むに。ハッシュテーブルが同期されます。
* HashMapのハッシュマップクラス
HashtableのHashMapの等が挙げられるが、HashMapの非同期、およびヌル、ヌル値とヌルキーを許可します。HashMapのコレクション容量イテレータ動作時間費用とHashMapのに比例する、(値()メソッドは、コレクションを返すことができる)場合に考慮されるように。このように、反復の重要な特性は、設定が高すぎるのHashMapの初期容量はない覚えている、または負荷率が低すぎる設定されています。
2)イテレータイテレータインターフェース:実装の様々な要素の集合を読み取ります。
イテレータとは何ですか?trueの場合は2つの要素のhasNext()を呼び出すメソッドの戻りの中間位置にイテレータは、next()メソッドは、次の要素を返し、この時間を呼び出します。あなたは次の要素を削除したい場合は2つの要素間の次の位置へのイテレータは、あなたが次の()メソッドを呼び出す必要があり、その後、()メソッドを削除呼び出します。
イテレータインターフェースは、以下の3つの方法を定義しています。
hasNext():次の要素があります
(次の):次の要素を返します
)(削除を:現在の要素を削除します。
イテレータの役割:
いくつかのインタフェースは、イテレータが情報を取得するために使用することができ、クラスのget()操作を提供していません。すべてのサブクラスインタフェースのコレクションは、サブインターフェイスは、イテレータイテレータをサポートしています。イテレータパターンはまた、カーソルモードとして知られています。
公式の定義:イテレータであるオブジェクトの内部の詳細を露出することなく、コンテナオブジェクトの個々の要素にアクセスするための方法を提供します。
イテレータパターン:以下の役割で構成されています。
(1)イテレータ役割:アクセスを定義するための責任とインタフェースイテレータロールの要素を横切る界面の横断を定義するが、反復を制御するユーザーを指定しませんでした。クライアントによるアプリケーションJavaCollection外部イテレータとして知らトラバーサルプロセスを制御します。別の実装は、内部イテレータとして知ら反復子自体の反復によって制御されます。、柔軟な強力、およびJava、可用性における内部イテレータが弱いという内部イテレータイテレータよりも外部
(2)特定の役割イテレータ:イテレータインターフェースが実装され、トラバーサルの現在の位置を記録します
(3)コンテナの役割:インターフェイスを作成するために、具体的なイテレータの役割を提供する責任を
(4)特定のコンテナの役割は:容器の構造に関連する特定のイテレータインタフェース----イテレータ特定の役割の役割の作成を達成します
注意:イテレータパターンでトラバーサルアルゴリズムを実装します誰が定義されていません。容器上の異なるトラバーサルアルゴリズムで使用することができるように、横断アルゴリズムの一種は、異なる容器に適用することができます。これは彼らの私有財産を開きます梱包----コンテナコンテナの役割を損ないます。これは、達成するためのコンテナの役割なので、反復子単なる名目の役割にそれを置くだけトラバーサル機能の現在の位置を保存する必要がありますが、トラバーサルアルゴリズムと一緒に堅く結ば特定のコンテナ。Javaのコレクションのアプリケーションでは、特定の役割は、このように包装容器を保護、容器内部クラスでイテレータの役割を定義されている提供します。一方トラバーサルアルゴリズムはまた、ユーザーが自分のイテレータを拡張することができ、コンテナのインタフェースを提供します。
コンテナの役割は、一例として、リストに追加します。これは、コンテナの特定の役割をリストしていない、それはリストArrayListクラスのインタフェースを実現することにある唯一のインタフェースです。ここでの唯一のコンテンツと関連するイテレータ、内部クラスショーの形でイテレータ特定の役割。抽出された文字が存在する各特定容器の共通の部分にAbstractList。次のようにデザインコードは次のとおりです。
//迭代器角色,仅仅定义了遍历接口
public interface Iterator{
//声明方法
boolean hasNext();
Object next();
void remove();
}
public abstract class AbstractList implements List{
······
//这个便是负责创建具体迭代器角色的工厂方法
public Iterator iterator(){
return new Itr();
}
}
//作为内部类的具体迭代器角色
private class Itr implements Iterator{ //实现接口
//创建成员变量
int cursor=0;
int lastRet=-1;
int expectedModCount=modCount;
public boolean hasNext(){
return cursor!=size();
}
public Object next(){
checkForComodification();
try{
Object next=get(cursor);
lastRet=cursor++;
return next;
}catch(IndexOutOfBoundsException e){
checkForComodification():
throw new NoSuchElementException():
}
}
public void remove(){
if(lastRet==-1)
throw new IllegalStateException();
checkForComodification();
try{
AbstractList.this.remove(lastRet);
if(lastRet<cursor)
cursor--;
lastRet=-1;
expectedModeCount=modCount;
}catch(IndexOutofBoundsException e){
throw new ConcurrentModificationException();
}
}
//设计方法checkForComodification()
final void checkForComodification(){
if(modCount!=expectedModCount)
throw new ConcurrentModificationException();
}
}
反復モードを使用するように、第一の容器は、反復子特定の役割を取得するために、特定の役割、特定のコンテナを介してそのロールを得ました。だから、コンテナの役割を横断する特定のイテレータを使用することができます。コードは、完全なプログラムではない様々な役割を作成するプロセスを実証することです。
イテレータパターンはの利点をもたらすために、コンテナに適用されます:
(1)様々な方法で支持トラバーサル容器の役割を、実装に応じて、結果に差が存在するであろう。
(2)コンテナのインタフェースを簡素化するが、スケーラビリティを向上させるためのJavaコレクションでは、容器は、トラバーサルインタフェースが設けられています。
トラバーサル状態は各イテレータオブジェクトに保持されているので、(3)同じオブジェクトのコンテナは、同時にトラバースを複数行うことができます。
イテレータパターンの範囲:
(1)内部表現を露出させることなく、コンテナオブジェクトの内容にアクセスします。
(2)オブジェクトを横断コンテナの様々なサポート。
(3)横断異なるコンテナ構造は、統一されたインターフェース(多型反復)を提供します。
反復子は、プログラマが便利を提供し、コードの複雑さを回避しつつ、データ構造内のデータの頻繁な操作を回避する、起こります。実際の開発では、照会、追加、削除、および他の要素に、イテレータに簡単に使用されます。イテレータパターンは特に、それは将来のプログラム開発で広く使われているデータベースであり、実際のアプリケーションでは非常に広いです。
一般的なトラブルシューティング:
インタフェースのコレクションコレクションクラス区分のセットの(1)コレクション:
コレクションクラスには、静的メソッドの操作の様々なセットが含まれているjava.util、下にあります。
インタフェースjava.utilの下のコレクションは、それはインターフェース構造のセットの親です。
*リスト、セットCollectionインタフェースから継承し、地図コレクションインタフェースは継承しません。
(2)ArrayListの配列リストクラスとストレージクラス区別ベクトル:
同期:Vectorがスレッドセーフで、同期されます。ArrayListのは、スレッドセーフである、それが同期されません。
データの増加:あなたが成長する必要がある場合には、ベクトル元のデフォルトの成長が倍増し、ArrayListには、元の半分です。
(3)HashMapのHashtableのハッシュマップとハッシュテーブルの違い:
どちらも、役割が特定の一意のキー値にマッピングされ、Mapインタフェースのクラスに属します。
そしてキーとヌルヌル複数のキーを可能にHashMapのない分類またはソート、。
ハッシュテーブルは、それが同期されるので、それはまた、HashMapのより遅い、HashMapのに似ていますが、nullキーやnull値を許可していません。
(4)データ構造を入力します。
線形および非線形データ構造、データ構造:データ構造は、2つのカテゴリに分類します。線形データ構造であって、線状、スタック、キュー、ストリング、アレイ、及びファイル;を含む非線形データ構造:木、図
(5)一覧とSetインタフェースのインタフェースの違い:
リスト:、注文したコレクションは重複要素を含むことがあり、インデックスによってアクセスするための方法を提供します。ここでは順序が排出量ではなく、ソート順序を意味しています。
インタフェースから継承するコレクションから、しかし、重複要素を含めることはできません新しい抽象実装方法、:設定しません。