我在数据结构课程中,有大约一年半的JAVA经验。我试图理解书中没有明确定义的代码。在以下行中:
Queue<Integer> encodingQueue = new LinkedList<Integer>();
我知道我们正在创建一个Queue类型的新LinkedList对象。我的问题是:
谢谢!
答案 0 :(得分:3)
http://docs.oracle.com/javase/tutorial/java/generics/
用于指定类型参数。这是你将一个类型传递给一个类的方法。列表/队列具有它们,因为它是列表所包含的Object类型。
使用整数而不是int,因为整数不是对象。整数只是它的包装类。
答案 1 :(得分:3)
祝你的数据结构课好运!
在Java中,这些数据结构(即Queue,LinkedList,...)可以容纳任何类型的对象。但是,通常情况下,Queue或LinkedList的给定实例将保存相同类型的集合(此处为整数)。
angle-bracket语法用于指定此特定集合实例中允许的类型。
所以,阅读方式:
Queue<Integer> encodingQueue = new LinkedList<Integer>();
...是
“创建一个只包含整数的新链接列表,并将该实例分配给引用变量'encodingQueue',该变量将被视为仅包含整数的队列。”
您正在使用的此功能称为“Generics”。您可以在此处阅读更多相关信息:http://en.wikipedia.org/wiki/Generics_in_Java
在Java中,有两种类型:基元和对象引用。 “int”是一个原语,“Integer”是一个类。
您无法在Java中创建对基元的引用,而集合(如LinkedList)只能保存对象引用。因此,您不能将基元填充到集合中(例如,您不能将“int”放入LinkedList中)。这就是Java为基元提供等效对象的原因:这样你就可以创建整数,浮点数,布尔值等集合。
当你第一次开始使用原语时,这可能有点混乱; Java将尝试自动将原语转换为对象引用,这是明确需要的(反之亦然)。此功能称为“自动装箱”。
List myList = new LinkedList<Integer>();
myList.add(2);
这里,2是原语。但是编译器知道你需要一个对象引用,而不是一个原语。因此,它会自动“填充”此值(在后台)创建类Integer的新实例并将其值设置为2.
所以,这相当于(这就是实际发生的事情):
List myList = new LinkedList<Integer>();
myList.add(Integer.valueOf(2));
其中Integer.valueOf()首先查看内部缓存,以查看该值是否已存在实例。如果是,则返回,否则将创建该值的新Integer对象。 (谢谢你,Boris,指出这一点)
答案 2 :(得分:2)
Integer是原语'int'的基于对象的包装版本。这允许基本类型在面向对象的语言中很好地发挥作用。在这里阅读更多内容:
它们可以互换使用原生和包装,这称为'自动装箱/拆箱' http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
&lt;&gt;是Java Generics的一部分(一种告诉编译器你希望使用哪个对象的方法),更多信息来自:
http://docs.oracle.com/javase/tutorial/java/generics/
快乐学习!
答案 3 :(得分:0)
推断出要存储在队列中的对象类型。您需要查看Java Generics。
集合存储对象,int是基本类型,Integer是Java对象表示。编译器将自动将您尝试将其作为整数放入队列的任何内容进行自动备份。
答案 4 :(得分:0)
1)<Integer>
用于在编译时指定Collection
中包含的对象将成为Integer
s,因此例如这将无法编译:
Double d = 10d;
encodingQueue.add(d); <-- Compilation error
2)使用Integer
而不是int
的原因是你不能存储到集合原始数据类型,但你必须使用对象;你仍然可以编写encodingQueue.add(10)
,这要归功于Integers中的int自动装箱,但是当你声明一个类型化的集合(或者,通常是一个参数化的类)时,你必须使用一个扩展Object
的类。参数。
答案 5 :(得分:0)
<Integer>
指定对象要保存的数据类型。它是Integer而不是int,因为LinkedList设计用于保存Object而不是基元。所以
Queue<Integer> q = new LinkedList<Integer>();
意味着我们正在创建一个包含Integer类型对象的LinkedList对象,我们使用Queue引用变量引用它。
答案 6 :(得分:0)
什么是&lt;&gt;与Integer一起使用?为什么它也与 LinkedList对象而不是参数?
如果您有参数化集合Queue<Integer>
而不是原始类型Queue
它确保集合中没有添加除Integer之外的任何对象。
此功能是从Java 1.5
引入的为什么使用Integer这个词而不是int?。
Collection处理Objects而不是primitive。
从 Effective Java Item 23
中考虑此示例// Now a raw collection type - don't do this!
/**
* My stamp collection. Contains only Stamp instances.
*/
private final Collection stamps = ... ;
如果你不小心将硬币放入邮票收藏中,那么 错误的插入编译并运行没有错误:
// Erroneous insertion of coin into stamp collection
stamps.add(new Coin( ... ));
在从印章中取回硬币之前,您不会收到错误 系列:
// Now a raw iterator type - don't do this!
for (Iterator i = stamps.iterator(); i.hasNext(); ) {
Stamp s = (Stamp) i.next(); // Throws ClassCastException
... // Do something with the stamp
}
参数化
的示例// Parameterized collection type - typesafe
private final Collection<Stamp> stamps = ... ;
从这个声明中,编译器知道邮票应该包含 只有邮票实例并保证这是这种情况,假设你的 整个代码库是使用1.5或更高版本的编译器编译的 之后,所有代码都会编译而不会发出(或抑制; 见第24项)任何警告。当用a表示邮票时 参数化类型,错误插入生成编译时 错误消息,告诉您到底出了什么问题:
Test.java:9: add(Stamp) in Collection<Stamp> cannot be applied to (Coin)
stamps.add(new Coin());
答案 7 :(得分:0)
它们是一种泛型(参见@ JTigger的答案),这意味着它们可以是包含自定义Java对象的任何Java对象的队列/列表,这允许您在Java内部的任何内容上使用队列/列表函数而无需重新发明轮子。
实施例: 假设我们有自定义对象“planet”:
public Class Planet {
private String name;
public Planet(String name) { this.name = name; }
public String getName() { return name; }
}
我们想在队列中放置一个行星列表。我们可以创建所述队列,并使用已经构建的add()和remove()方法。如果Queue不是Generic类,我们必须构建自己的add()和remove()函数。因此,使用泛型,我们可以列出太阳系中行星的所有名称:
public static void main (String args[]) {
Queue<Planet> solarSystem = new LinkedList<Planet>();
solarSystem.add(new Planet("Mercury"));
solarSystem.add(new Planet("Venus"));
solarSystem.add(new Planet("Earth"));
solarSystem.add(new Planet("Mars"));
solarSystem.add(new Planet("Jupiter"));
solarSystem.add(new Planet("Saturn"));
solarSystem.add(new Planet("Uranus"));
solarSystem.add(new Planet("Neptune"));
solarSystem.add(new Planet("Pluto")); //For Nostalgia's sake
for (int i = 0; i < 9; i++) {
System.out.println(solarSystem.element().getName());
solarSystem.remove();
}
}