如何在Java中创建数组、ArrayList、栈和队列?

41

这是一篇非常过时的文章:“所有源代码都已使用JDK v1.2进行编译和测试”。JDK 1.6是当前稳定版本。 - Ben S
2
所以,无论语言版本如何变化,数据结构都不会改变。 - Kevin
1
请详细阐述您的困惑。您的期望是什么?出乎意料的是什么?此外,“声明中没有差异”太模糊了,请进一步阐述。 - BalusC
3个回答

72

没有更多关于问题确切内容的详细信息,我将回答问题的标题:

创建一个数组

String[] myArray = new String[2];
int[] intArray = new int[2];

// or can be declared as follows
String[] myArray = {"this", "is", "my", "array"};
int[] intArray = {1,2,3,4};
创建一个 ArrayList
ArrayList<String> myList = new ArrayList<String>();
myList.add("Hello");
myList.add("World");

ArrayList<Integer> myNum = new ArrayList<Integer>();
myNum.add(1);
myNum.add(2);

这意味着创建一个由StringInteger对象组成的ArrayList。你不能使用int,因为它是一个原始数据类型,请参考链接获取原始数据类型列表。

创建一个Stack

Stack myStack = new Stack();
// add any type of elements (String, int, etc..)
myStack.push("Hello");
myStack.push(1);
使用LinkedList实现一个Queue(队列):

Queue

Queue<String> myQueue = new LinkedList<String>();
Queue<Integer> myNumbers = new LinkedList<Integer>();
myQueue.add("Hello");
myQueue.add("World");
myNumbers.add(1);
myNumbers.add(2);
ArrayList 相同,这个声明表示创建一个包含 StringInteger 对象的 Queue

更新:

针对您在其他答案中的评论:

我有点困惑了,为什么要使用字符串。以及 <String> 是什么意思?

我们只是使用 String 作为纯粹的示例,但您可以添加任何其他对象,但主要是使用一个对象,而不是原始类型。每种原始数据类型都有自己的原始包装类,请参见链接获取原始数据类型的包装类列表。

我已经发布了一些链接来解释两者之间的区别,但这里是一些原始类型的列表:

  • byte
  • short
  • char
  • int
  • long
  • boolean
  • double
  • float

这意味着,您不能创建一个整数的 ArrayList,如下所示:

ArrayList<int> numbers = new ArrayList<int>(); 
           ^ should be an object, int is not an object, but Integer is!
ArrayList<Integer> numbers = new ArrayList<Integer>();
            ^ perfectly valid

此外,您可以使用自己的对象,这是我创建的Monster对象:

public class Monster {
   String name = null;
   String location = null;
   int age = 0;

public Monster(String name, String loc, int age) { 
   this.name = name;
   this.loc = location;
   this.age = age;
 }

public void printDetails() {
   System.out.println(name + " is from " + location +
                                     " and is " + age + " old.");
 }
} 

这里我们有一个Monster对象,但现在在我们的Main.java类中,我们想要记录我们创建的所有Monster,因此让我们将它们添加到一个ArrayList中。

public class Main {
    ArrayList<Monster> myMonsters = new ArrayList<Monster>();

public Main() {
    Monster yetti = new Monster("Yetti", "The Mountains", 77);
    Monster lochness = new Monster("Lochness Monster", "Scotland", 20);

    myMonsters.add(yetti); // <-- added Yetti to our list
    myMonsters.add(lochness); // <--added Lochness to our list
  
    for (Monster m : myMonsters) {
        m.printDetails();
     }
   }

public static void main(String[] args) {
    new Main();
 }
}

(我帮助女友的兄弟做Java游戏,他也需要做类似的事情,但我希望这个例子已经很好地演示了)


1
当使用 < > 符号时,它期望的是一个类(Integer)而不是一个原始类型(int)。因此,您不能使用int,而必须使用Integer - Anthony Forloney
1
洛奇尼斯湖怪已经20岁了吗?哈 - Rubys
1
@Rubys,我想让他看起来更年轻,他对此很自卑。 - Anthony Forloney
FYI public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { //stuff } 我们可以将 LinkedList 用作队列、优先队列和双端队列。 - roottraveller
public class Stack<E> extends Vector<E> { //stuff } 代码 - http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Stack.java#Stack.peek%28%29 注意 - 它只有5个公共方法。 - roottraveller
显示剩余7条评论

2

我猜想您对类型参数化感到困惑:

// This works, because there is one class/type definition in the parameterized <> field
ArrayList<String> myArrayList = new ArrayList<String>(); 


// This doesn't work, as you cannot use primitive types here
ArrayList<char> myArrayList = new ArrayList<char>();

我现在非常困惑,为什么要使用字符串。而 <String> 又表示什么意思? - Kevin
@theband,我已经更新了我的答案,希望能够消除一些困惑。如果你还有其他问题,请不要犹豫,我很乐意帮助你。 - Anthony Forloney
@Kevin,“<String>”部分表示您正在创建一个元素类型为String的ArrayList。 - davelupt

1

这个帖子的第一个回答稍作更正。

即使在使用java.util包中的Stack时,你仍然需要使用泛型创建新对象。

Right usage:
    Stack<Integer> s = new Stack<Integer>();
    Stack<String> s1 = new Stack<String>();

    s.push(7);
    s.push(50);

    s1.push("string");
    s1.push("stack");

如果有其他用途,请参考上面的帖子,其中提到:

    /*
    Stack myStack = new Stack();
    // add any type of elements (String, int, etc..)
    myStack.push("Hello");
    myStack.push(1);
    */

虽然这段代码可以正常工作,但其中存在不安全或未检查的操作,可能导致错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接