Какой класс использовать для ArrayList?

Я просто хотел уточнить этот вопрос, который у меня возник некоторое время для более эффективного и «правильного» кода.

Я дал класс «Студент» с объектами в списке массивов объектов. У меня есть еще один класс под названием Class, в котором есть массив ссылок на те же самые объекты в классе Student.

Должен ли я объявить класс «Класс» как

ArrayList<Student> myStudents = new ArrayList<Student>();

or

ArrayList<Class> myStudents = new ArrayList<Class>();

Также другая часть вопроса заключается в том, что я видел, как люди объявляют arrayLists как ArrayList<Student> myStudents = new ArrayList<>(); , где вторая половина моркови остается пустой. В чем именно разница? Означает ли это, что список массивов не является объектом какого-либо класса?

Большое спасибо за ваше время и помощь Ура


person eArshdeep    schedule 12.11.2016    source источник
comment
Морковь? ???????? xaxaxa epic!. Вы имеете в виду алмазного оператора . Взгляните на: stackoverflow.com/questions/4166966/   -  person GOXR3PLUS    schedule 12.11.2016
comment
Я помню, как давным-давно смотрел видео, и кто-то назвал его морковью и добавил, что это спорно или что-то в этом роде. Я не хотел сейчас искать правильный термин, так как был занят этим. В любом случае, я понимаю, дураком это заставляет меня выглядеть :}   -  person eArshdeep    schedule 12.11.2016
comment
Я не это имел в виду, просто было так смешно :)   -  person GOXR3PLUS    schedule 12.11.2016
comment
Итак, в List‹String› list = new LinkedList‹›(); Что такое LinkedList? Как у вас может быть что-то подобное?   -  person eArshdeep    schedule 12.11.2016
comment
А в ArrayList‹Class› myStudents = new ArrayList‹Class›(); это объект класса ArrayList или класса «Класс»   -  person eArshdeep    schedule 12.11.2016


Ответы (2)


Это зависит от того, что вы хотите сохранить в списке, а не от того, где вы его используете. Если вы храните объекты Student, вы будете использовать ArrayList<Student>().

Тип, опущенный в правой части, называется выводом типа (добавлен в java 7), что означает, что параметр типа в правой части будет выводиться из типа переменной присваивания слева. Это помогает писать код чище. Например,

Написать ниже проще:

List<Some<Type<Another>>> var = new ArrayList<>();

чем:

List<Some<Type<Another>>> var = new ArrayList<Some<Type<Another>>>();
person Gurwinder Singh    schedule 12.11.2016

Технически ни то, ни другое.

Вы хотели бы сделать:

List<Student> myStudents = new ArrayList<>();

если вы хотите создать ArrayList с Student объектами и

List<Class> myClasses = new ArrayList<>();

если вы хотите создать ArrayList с Class объектами.

1) Обратите внимание на имена переменных.

2) Обратите внимание, что вы всегда должны пытаться кодировать интерфейс (слева — List, а не ArrayList). Это обеспечивает гораздо большую гибкость, поскольку вы не зависите от конкретной реализации ArrayList в дальнейшем. Эта точка очень мощная! Вы можете написать сигнатуры методов, чтобы принимать объекты типа List, а затем использовать ArrayList, LinkedList или Stack или любой класс, который реализует List. В зависимости от того, как вы будете использовать ArrayList позже, вместо этого может быть достаточно интерфейса Collection.

Алмазный оператор позволяет компилятору вывести значение аргумента типа, не вводя его целиком. Это необходимо для обратной совместимости со старыми версиями Java.

В качестве общей практики для оптимизации производительности вам также потребуется указать начальную емкость ArrayList, если это возможно. Итак, если вы знаете, что есть только 5 классов, вы бы сделали:

List<Class> myClasses = new ArrayList<>(5);
person vphilipnyc    schedule 12.11.2016