• ベストアンサー

ArrayListクラスについて

hiraku-jpの回答

  • ベストアンサー
回答No.3

ArrayListの実装がリストならいいんですが、実際は配列だからなぁ・・ その本の記述はあまり良くないかも。。 こういった順序付けされたコレクションの実装は、リストと配列(ベクトル)に分かれます。 配列実装のコレクションは内部に連続したメモリを確保します。連続しているので、インデックスを指定した参照(いきなり5番目の要素の取得等)が可能で、全般的に参照は高速ですが、要素を挿入・削除する場合(特に途中に、もしくは容量の変更が必要な)は遅くなります。 これに対してリスト実装のコレクションは要素と次の要素への参照からなります。これは頭からの順次アクセスは参照を辿って行うので遅くはありませんが、いきなり5番目、と言われても対応できません。(内部的に先頭から5番目まで辿るしかない)しかし、値を挿入する場合には、途中であっても参照を挿げ替えるだけなので高速です。また、連続した空間で無い為、容量の拡張も必要ありません。 で、普通は双方向リストと言うと、このリスト実装で、要素と前後双方への参照で構成され、双方向への順次アクセスが可能なものを言います。片方しか持っていなければ、片方へしか順次アクセスできないですよね? で、本当は説明終わりたい所なんですが・・ ArrayListは先にも言ったとおり本当は配列実装です。(javaだとLinkedListなんかがリスト) なんで、双方向の検索なんて本当は出来て当たり前なんですよね。連続してるんですから。 実際には(効率は無視すれば)リスト実装のようなインターフェースを持つ配列や、配列実装のようなインターフェースを持つリストが作れるわけで、ArrayListは前者なんですね。まぁこんな所でしょうか・・ より詳しく知りたい場合は、アルゴリズムとかデータ構造とかを調べてみて下さい。

homankun
質問者

お礼

回答ありがとうございます。 詳細に説明してくださって大変よく分かりました。 また、助けてください。

関連するQ&A

  • ArrayListのパッケージがlistでない理由

    ・パッケージについて教えてください ■質問1 ・ArrayListのパッケージは、どうして「java.util.List」ではなくて「java.util.ArrayList」なのでしょうか? ・ArrayListは、Listインターフェイス実装クラスなのでListに紐付いている、と思ったのですが… ・「java/util/List.interface」と「java/util/ArrayList.class」は並列の位置づけになるのでしょうか? ・そういう決まりだから? ・Listインターフェイスのパッケージ名は下記で確認するのでしょうか? ・http://docs.oracle.com/javase/jp/7/api/java/util/List.html ■質問2 ・「import java.util.*;」表記ができるなら、全部これで良いようにも思うのですが、どういう風に使い分けるのでしょうか? ・普通はどちらを使う、とかあるのでしょうか?

    • ベストアンサー
    • Java
  • java.util.ArrayListクラスの継承

    Java5年ぶりでちょっと新しい仕様について教えてください。。 java.util.ArrayListクラスを継承したクラスを作成しようと思っているのですが、継承後のクラスでも ArrayListChild<E> というような記述を有効にするには、一体どのような処理をすればよいのでしょうか。 そもそも、<E>とコンストラクタの後などに付けるこの仕様、なんて名前の仕様なんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayList でスタックを

    初歩的でツマラナイかもしれません。 import java.util.ArrayList; でスタックを実現するクラス"MyStack"を書きました。 フィールドは private ArrayList<Integer> stack = new ArrayList<Integer>(); のみという条件です。 MyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MyStack {   private ArrayList<Integer> stack = new ArrayList<Integer>();      // データを先頭に追加   public void push( int item ) {     stack.add( item );   }   // 先頭のデータを取り出す   public int pop( ) {     int rtn;     if( stack.isEmpty() ) {       System.out.println( "スタックは空です." );       System.exit( 1 );     }          rtn = stack.get( 0 );     stack.remove( 0 );     return rtn;   } } このMyStackを実行するクラス"MainForMyStack"を書きます。 実行結果は、標準出力に 43210 と出ることを想定しています。 MainForMyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MainForMyStack {   public static void main(String[] args) {     MyStack stack = new MyStack();     // 0,1,2,3,4 をスタックに追加     for( int i=0; i < 5; i++ ) {       stack.push( i );     }     // スタックのデータを先頭から取り出す     for( int i=0; i < stack.size(); i++ ) {       System.out.print( stack.pop() );     }   } } さて、MainForMyStack.java の i < stack.size(); の箇所でエラーが出るのはなぜでしょう? どなたかご教授の方お願いします。

    • ベストアンサー
    • Java
  • ArrayList

    課題プログラムの中で、いくつかArrayListを使ったメソッドを作って動かすものが出題されているのですが、そのうち「ArrayListの文字を反転させて出力する」というのがわかりません。 何を使ったらよいでしょうか? ちなみに、私の書いたプログラムの中では、 ArrayList<String> list = new ArrayList<String>(); としていますので、それで書いて下さると嬉しいです。 また、課題の中で、listの中に入っているのは、String型のアルファベット10個です。 教えて下さい、よろしくお願いします。 ▼参考API http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/ArrayList.html

    • ベストアンサー
    • Java
  • コレクションクラスについて

    ●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

  • JSPからJavaクラスを参照できない?

    サーブレットを勉強しています。Eclipseを使っています。 WEB-INF/src/m/to_do.java view/list.jsp というファイルがあるのですが、list.jspの中でto_doクラスを使いたいので、 <%@ page import="java.util.ArrayList" %> <%@ page import="m.to_do" %> <jsp:useBean id="list"scope="application"type="java.util.ArrayList<to_do>" /> と記述したのですが、java.util.ArrayList<to_do>のところで、 未定義型:to_do と出て、エラーが出てしまいます。 このJSPの中で、 to_do.getID(); など、to_doクラスのメソッドを呼び出す記述を書いても、やはりto_doを認識していないようです。 どうすれば、to_doクラスを読み込ませられるのでしょうか?

    • ベストアンサー
    • Java
  • ArrayListはListのデフォルト実装とは?

    「ArrayListはListのデフォルト実装」と書いてあるのですが、どういう意味でしょうか? http://topickup.web.fc2.com/java/list_arraylist.html ■自分の理解 ・List … インターフェイス ・ArrayList … インターフェイスを実装するクラスの中の一つ。どの実装クラスを利用するかはユーザーが選択? ■疑問点 ・Listインターフェイスのリファレンスに、デフォルト実装について明記されているかと思ったのですが、見つかりません ・どこかに書いているのでしょうか? http://docs.oracle.com/javase/jp/7/api/java/util/List.html ・検索したら、似た言葉で「デフォルトメソッド」があるのですが、「デフォルト実装」と同じ意味でしょうか? ・「デフォルトメソッド」はJava8の新機能? Java7以下では使えない?

    • ベストアンサー
    • Java
  • ArrayListクラスを利用するプログラムについて質問があるのですが。

    「Genericsを用いたArrayListを使用しループ処理にはiteratorを使用する。 という指定の下、 ArrayListのインスタンスを生成し次の5つの文字列を追加した後、 for文を使ってリストの中身を全て順番に画面表示したいんです。 "AA" "BB" "CC" "DD" "EE" --------------------------- import java.util.ArrayList; class TestA{ public static void main(String args[]) { ArrayList<String> array = new ArrayList<String>(); array.add("AA"); array.add("BB"); array.add("CC"); array.add("DD"); array.add("EE"); } } --------------------------- ここからよく解らないので教えていただけませんでしょうか?

    • ベストアンサー
    • Java
  • 「型 ArrayList は総称ではありません・・・。」エラーについての問題です。

    コンニチハ、javaの初心者s-unです。 Eclipse(Ver:3.1.1)でJavaのプログラムを書いています。 *********************************** import java.util.ArrayList; class collectionTest1{ public static void main(String args[]){ ArrayList<String> array = new ArrayList<String>(); } } *********************************** エラーメッセージは 「型 ArrayList は総称ではありません。引数 <String> でパラメーター化できません。」 JDK準拠>>コンパイラー準拠レベル5.0になっています。 原因をお教え頂けますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • Java
  • ArrayListクラスのインスタンスの宣言について

    まず初めに一言。 今自分が使用している本は3年ぐらいのモノです。 なので、宣言の仕方が変わっているかもしれません。 その上で質問です。 まず、ソースコードを貼り付けます。(JSP) <%@ page language="java" contentType="text/html; charset=Shift_JIS" import=java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>配列の挿入、削除(ArrayList)</title> </head> <body> <% //配列を定義する ArrayList array = new ArrayList(); //値をセットする array.add("1111"); array.add("2222"); array.add("3333"); //配列の値を表示する for (int i=0; i<array.size(); i++) { System.out.println("<p>" + (i+1) + "番目:" + array.get(i)); } //値を挿入する array.add(2, "9999"); //3番目の値を削除する array.remove(2); //変更後の配列の値を表示する for (int i=0; i<array.size(); i++) { out.println("変更後" + (i+1) + "番目:" + array.get(i)); } %> </body> </html> ArrayListクラスのインスタンスの宣言はどこか間違っているでしょうか。 Eclipse曰く、 『ArrayListはraw型です。ArrayListの参照はパラメータ化する必要があります。』 という警告が表示されます。 エラーでは無いみたいなのですが、やはり警告されている状態を放っておくのはあまり気持ちいいモノではありません。 そこで、質問です。 この警告を消す方法はあるのでしょうか。 もし、あるのでしたら教えて頂けると幸いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java