Frage Implementieren Sie eine eigene ArrayList <> ohne Sammlungen zu verwenden


Ich versuche, meine eigene ArrayList zu implementieren, ohne Java-Sammlungen für Übungszwecke zu verwenden. In diesem Stadium möchte ich zwei der wichtigsten Methoden implementieren, add (E) und get (int) tp die Idee zu bekommen. Mein Code ist unten angegeben. Jedoch stieß ich auf einige Probleme:

  1. Die Zeile "return (E) myData [index]" gibt die Warnung "Type safety: Ungeprüfter Cast von Object to E" aus. Wie kann ich das ansprechen?
  2. Die Java 7-Implementierung von ArrayList.add (T) gibt einen booleschen Wert zurück. Unter welchen Umständen muss add () false zurückgeben. Unter welcher Logik gibt es Falsch zurück und wann kehrt wahr zurück?
  3. Wo finde ich den Quellcode der Java 7-Implementierung von ArrayList?

PS. Bitte beantworte nicht Frage 3 und verweise mich auf den Saccharose-Code für eins und zwei!

import java.util.Arrays;

public class MyArrayList<E>{
    private final int DEFAULT_SIZE=2;
    private Object[] myData = new Object[DEFAULT_SIZE];
    private int actSize=0;

    public boolean add(E data){
        if (actSize>=myData.length/2){
            increaseSize();
        }
        myData[actSize++] = data;
        return true;//when can it be false?
    }

    private void increaseSize()throws RuntimeException{
        myData = Arrays.copyOf(myData, myData.length*2);
    }

    public E get(int index) throws RuntimeException{
        if (index >= actSize){
            throw new IndexOutOfBoundsException(); 
        }
        return (E) myData[index];
    }

    public static void main(String[] args) {
        MyArrayList<String> arList = new MyArrayList<>();
        arList.add("Hello");
        arList.add("Bye bye!");
        System.out.println(arList.get(1));// prints Bye bye! which is correct

    }
}

5
2018-03-31 01:19


Ursprung


Antworten:


Die Zeile "return (E) myData [index]" gibt die Warnung "Type safety:   Deaktivierte Umwandlung von Objekt in E ". Wie kann ich das ansprechen?

Unterdrücken Sie die Warnung

@SuppressWarnings("unchecked")

Die Java 7-Implementierung von ArrayList.add(T) gibt a zurück boolean.   Unter welchen Umständen add() muss zurückkommen false. Unter was   Logik es zurückgeben false und wenn zurückkehrt true?

Siehe die Javadoc

Kehrt zurück:     true (wie angegeben durch Collection.add(E))

Es kehrt immer zurück true.

Wo finde ich den Quellcode der Java 7-Implementierung von ArrayList?

In Ihrer JDK-Installation src.zip archivieren oder online durch einfaches Suchen finden

Java-ArrayList-Quellcode


3
2018-03-31 01:23



Die Zeile "return (E) myData [index]" gibt die Warnung "Type safety: Ungeprüfter Cast von Object to E" aus. Wie kann ich das ansprechen?

Sie erhalten immer eine Warnung für eine ungeprüfte Umwandlung, da Sie mit einem generischen Array arbeiten. Generika und Arrays vermische dich nicht wirklich so gut, aber die bessere Konvention besteht darin, den generischen Typ trotzdem an das Array anzuhängen:

private E[] myData = (E[]) new Object[DEFAULT_SIZE];

Du könntest immer hinzufügen @SuppressWarnings("unchecked") zum Feld selbst, um diese Warnung zu erhalten, wegzugehen.

@SuppressWarnings("unchecked")
private E[] myData = (E[]) new Object[DEFAULT_SIZE];

Die Java 7-Implementierung von ArrayList.add (T) gibt einen booleschen Wert zurück. Unter welchen Umständen muss add () false zurückgeben. Unter welcher Logik gibt es Falsch zurück und wann kehrt wahr zurück?

Das ist eine interessante Frage. Normalerweise würde man erwarten, dass die Einschränkungen auf add komme aus Collections#add:

Sammlungen, die diese Operation unterstützen, können Einschränkungen für die Elemente festlegen, die dieser Sammlung hinzugefügt werden können. Insbesondere werden einige Sammlungen das Hinzufügen von Nullelementen verweigern, und andere werden Beschränkungen für den Typ von Elementen auferlegen, die hinzugefügt werden können. Sammlungsklassen sollten in ihrer Dokumentation klar angeben, welche Elemente hinzugefügt werden dürfen.

...aber seit ArrayList Das Besondere ist, dass es so konzipiert ist, dass es seinen Platz immer erweitert, wenn es ausgeht. immer in der Lage sein, etwas hinzuzufügen. So sollte es sein immer Rückkehr true.

Wo finde ich den Quellcode der Java 7-Implementierung von ArrayList?

Grepcode ist normalerweise eine gute Ressource. Sie können es auch in src.zip finden, wenn Sie das JDK mit Quellen heruntergeladen haben.


2
2018-03-31 01:30



  1. Ich glaube nicht, dass Sie diese Typsicherheitswarnung mit einem generischen Typ umgehen könnten. Wenn es dich wirklich stört, könntest du hinzufügen @SupressWarnings("unchecked").
  2. Hmmm, da bin ich mir nicht sicher, aber die Android-Implementierung von Java, die nicht genau die gleiche ist, sagt, dass sie "immer wahr zurückgibt". Das ist seltsam für mich, aber hier ist der Link: http://developer.android.com/reference/java/util/ArrayList.html#add (E).
  3. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java, aber lade die Quelle definitiv herunter und sieh es dir an.

0
2018-03-31 01:28



Ich habe in Kommentaren wenig Erklärung gegeben, weil es klar zu verstehen ist.

public class MyArrayList<E extends Object> {

    private static int initialCapacity = 5;
    private static int currentSize;
    private Object[] myArrayList = {}, temp = {};

    private static int currentIndex = 0;

    public static void main(String[] args) {
        MyArrayList arrList = new MyArrayList();
        arrList.add("123"); //add String
        arrList.printAllElements();
        arrList.add(new Integer(111)); //add Integer
        arrList.printAllElements();

        arrList.add(new Float("34.56")); //add Integer
        arrList.printAllElements();

        arrList.delete("123");
        arrList.printAllElements();

        arrList.delete(123);
        arrList.printAllElements();
        arrList.delete(123);

        arrList.printAllElements();

    }

    public MyArrayList() {  //creates default sized Array of Objects
        myArrayList = new Object[initialCapacity]; //generic expression

        /* everytime I cross my capacity, 
    I make double size of Object Array, copy all the elements from past myObject Array Object
         */
    }

    public MyArrayList(int size) { //creates custom sized Array of Objects
        myArrayList = new Object[size];
    }

    public void add(Object anyObj) {
        //add element directy
        myArrayList[currentIndex] = anyObj;
        currentSize = myArrayList.length;
        currentIndex++;
        if (currentIndex == currentSize) {
            createDoubleSizedObjectArray(currentSize);
        }
    }

    //print all elements
    public void printAllElements() {
        System.out.println("Displaying list : ");
        for (int i = 0; i < currentIndex; i++) {
            System.out.println(myArrayList[i].toString()); 
        }
    }

    private void createDoubleSizedObjectArray(int currentSize) {
        temp = myArrayList.clone();
        myArrayList = new MyArrayList[2 * currentSize];  //myObject pointer big size data structure

//         myObject = temp.clone(); //probably I can do this here as well. Need to check this
        System.arraycopy(temp, 0, myArrayList, 0, currentSize);

    }

    void delete(Object object) {
        //if already empty 
        if (currentIndex == 0) {
            System.out.println("Already empty!");
            return;
        }
        //you don't need to delete anything. I can simply override the storage
        currentIndex--;
    }
}

-1
2017-07-17 22:15