2013-09-13 2 views
0

Я нахожусь в классе структур данных и имел примерно полтора года опыта работы с JAVA. Я пытаюсь понять код, который четко не определен в книге. В следующей строке:Устный перевод JAVA Command

Queue<Integer> encodingQueue = new LinkedList<Integer>(); 

Я понимаю, что мы создаем новый объект типа LinkedList типа Queue. Мои вопросы:

  1. что такое <> используется с Integer for? И почему это также с объектом LinkedList, а не с параметрами?
  2. Почему слово Integer используется, а не int?

Спасибо!

+2

[Из-за этого] (http://docs.oracle.com/javase/tutorial/java/generics/) –

+0

' int' является примитивным типом, а примитивные типы не могут использоваться аргументами общего типа. –

+2

Возможный дубликат [Java Generics] (http://stackoverflow.com/questions/490091/java-generics) –

ответ

3

удачи в вашем классе структуры данных!

Дженерики

В Java эти структуры данных (т.е. Queue, LinkedList, ...) может содержать любой вид объекта. Однако чаще всего данный экземпляр очереди или LinkedList будет содержать коллекцию того же типа (здесь целые числа).

Синтаксис угловой скобки используется для указания того, какие типы разрешены в этом конкретном экземпляре коллекции.

Таким образом, способ чтения:

Queue<Integer> encodingQueue = new LinkedList<Integer>(); 

является ...

"Create a new linked-list that holds only integers, and assign that instance to the reference variable 'encodingQueue' which will be treated like a queue that holds only integers."

Эта особенность, что вы используете называется "Дженерики". Вы можете прочитать больше об этом здесь: http://en.wikipedia.org/wiki/Generics_in_Java

Autoboxing

В Java есть два вида типов: примитивы и ссылки на объекты. «int» является примитивным, а «Integer» - классом.

Вы не можете создать ссылку на примитив в Java, а коллекции (например, LinkedList) содержат только ссылки на объекты. Таким образом, вы не можете использовать примитив в коллекции (например, вы не можете поместить «int» в LinkedList). Вот почему Java предоставляет эквивалент объекта для примитивов: так, что вы можете создавать коллекции таких вещей, как целые числа, поплавки, булевы и т. Д.

Это может быть немного запутанным, когда вы впервые начинаете использовать примитивы; Java будет пытаться автоматически конвертировать примитивы в ссылки на объекты, если это то, что явно необходимо (и наоборот). Эта функция называется «autoboxing».

List myList = new LinkedList<Integer>(); 
myList.add(2); 

Здесь 2 является примитивным. Но компилятор знает, что вам нужна ссылка на объект, а не примитив. Таким образом, он автоматически «блокирует» это значение (в фоновом режиме), создавая новый экземпляр класса Integer и устанавливая его значение 2.

Итак, это эквивалентно (и это то, что на самом деле происходит):

List myList = new LinkedList<Integer>(); 
myList.add(Integer.valueOf(2)); 

Где Integer.valueOf() сначала смотрит на внутренний кэш, чтобы увидеть, если экземпляр уже существует для этого значения. Если это так, то это возвращается, иначе создается новый объект Integer для этого значения. (Спасибо, Борис, за указание на это)

+0

Очень хороший ответ! Абсолютно верно! Имейте +1 и Добро пожаловать в StackOverflow! – sparks

+1

Не совсем - похоже на 'String's Java имеет кеш-код обертки. Путем создания «нового целого», а не автоматического бокса, создается новый экземпляр, а не один из кэша. –

+0

Спасибо, Борис! Я обновил ответ, чтобы отразить то, что происходит _actually_. – JTigger

3

http://docs.oracle.com/javase/tutorial/java/generics/

  1. Используется для задания параметров типа. Это то, как вы передаете тип в класс. Список/очереди имеют их, потому что это тип объекта, который имеет список.

  2. Целое число используется вместо int, потому что ints не являются объектами. Integer - это просто класс оболочки для него.

+0

«Целое число» также не является «объектом». ** ** является ссылочным типом. –

+2

'System.out.println (новый объект Integer (5) instanceof Object);' prints true, поэтому это Object для всех целей и задач. – Cruncher

+0

, если вы, конечно, не сказали мне, что 'ints are not Objects' – Cruncher

2

Целое - это версия на основе объекта примитива 'int'. Это позволяет базовому типу хорошо воспроизводиться на объектно-ориентированном языке. Подробнее здесь:

Они могут быть использованы как взаимозаменяемые родной и обертка, это называется «Autoboxing/распаковка» http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

<> являются частью Java дженериков (способ сказать компилятору, какой объект вы ожидаете работать с), больше здесь:

http://docs.oracle.com/javase/tutorial/java/generics/

с Днем обучения!

0
  1. Это указывает тип объекта, который будет храниться в очереди. Вы хотите заглянуть в Java Generics.

  2. Коллекции хранят объекты, int - примитивный тип, Integer - это представление объекта Java. Компилятор выполнит автообъекты любых ints, которые вы пытаетесь поместить в очередь как целые.

0

1) <Integer> используется для указания на этапе компиляции, что объекты, содержащиеся в вашем Collection будут Integer s, поэтому, например, это не будет компилироваться:

Double d = 10d; 
encodingQueue.add(d); <-- Compilation error 

2) причина, почему Integer используется вместо int, заключается в том, что вы не можете хранить в коллекциях примитивные типы данных, но вам нужно использовать объекты; вы все равно можете записать encodingQueue.add(10) благодаря автоматическому боксу ints внутри Integer, но когда вы объявляете типизированную коллекцию (или, в общем, параметризованный класс), вы должны использовать класс, который расширяет Object в качестве параметра.

0

<Integer> указывает тип данных, которые объект будет удерживать. это Integer вместо int, потому что LinkedList предназначен для хранения объекта, а не примитива. так

Queue<Integer> q = new LinkedList<Integer>(); 

означает, что мы создаем объект LinkedList, который содержит объекты типа Integer и мы отсылая его с эталонным переменной Queue.

0

what is the <> used with Integer for? And why is it also with the LinkedList object and not in the parameters?

Если у вас есть параметризованный коллекция Queue<Integer> чем сырье типа Queue это гарантирует, что ни один из других, чем Integer объектов не добавляются в коллекции.

Эта функция была введена с Java 1.5

Why is the word Integer used and not int?.

Коллекция сделок с объектами и не примитивы.



Рассмотрим этот пример из Эффективное Java Пункт 23

// Now a raw collection type - don't do this! 
/** 
* My stamp collection. Contains only Stamp instances. 
*/ 
private final Collection stamps = ... ; 

If you accidentally put a coin into your stamp collection, the erroneous insertion compiles and runs without error:

// Erroneous insertion of coin into stamp collection 
stamps.add(new Coin(...)); 

You don’t get an error until you retrieve the coin from the stamp collection:

// 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

// Parameterized collection type - typesafe 
private final Collection<Stamp> stamps = ... ; 

From this declaration the compiler knows that stamps should contain only Stamp instances and guarantees this to be the case, assuming your entire code base is compiled with a compiler from release 1.5 or later and all the code compiles with- out emitting (or suppressing; see Item 24) any warnings. When stamps is declared with a parameterized type, the erroneous insertion generates a compile-time error message that tells you exactly what is wrong:

Test.java:9: add(Stamp) in Collection<Stamp> cannot be applied to (Coin) 
stamps.add(new Coin()); 
0

Они представляют собой тип общего (см @ ответ JTigger в) это означает, что они могут быть очереди/список всех объектов Java, включая пользовательские объекты Java, это позволяет использовать функции очереди/списка на чем-либо внутри Java, не изобретая колесо.

Пример: Скажем, у нас есть пользовательский объект «планета»:

public Class Planet { 
    private String name; 
    public Planet(String name) { this.name = name; } 
    public String getName() { return name; } 
} 

и мы хотим поместить список планет в очереди. Мы могли бы создать указанную очередь и использовать уже созданные методы add() и remove(). Если Queue не был классом Generic, нам пришлось бы создавать собственные функции add() и remove(). Таким образом, использование Generics мы можем перечислить все имена планет в Солнечной системе:

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(); 
    } 
} 
Смежные вопросы