1、请简述泛型是什么?有什么用?在哪里用?
2、请把今天讲解的方法,在API中查找到,并用自己的话进行描述
答案:
Vector
public void addElement(E obj)
Vector特有的的添加方法
public E elementAt(int index)
返回对应索引的元素
public boolean removeElement(Object obj)
根据集合中的元素删除元素
public void removeElementAt(int index)
根据集合中的索引删除元素
public void setElementAt(E obj, int index)
根据集合中的索引改变对相应的元素
public Enumeration elements()
Vector中特有的迭代器
Enumeration
public boolean hasMoreElements()
判断集合是否有元素
public Object nextElement()
获取集合中的元素
LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全
public void addFirst(E e)
将指定元素添加到列表的开头
public void addLast(E e)
将指定元素添加到列表的末尾
public E getFirst()
获取列表中的第一个元素
public E getLast()
获取列表中的最后一个元素
public E removeFirst()
移除列表中的第一个元素
public E removeLast()
移除列表中的最后一个元素
3、请简述List<? extends T>和List<? super T>之间有什么区别?
List<? super T>向上限定:?代表T本身或者T的父类
List<? extends T>向下限定:?代表T本身或者T的子类
4、请简述如何编写一个泛型方法,让它能够接受泛型参数并返回泛型类型?并举例
public class MyDemo1 {
public <P> void show(P p){//泛型方法
System.out.println(p);
}
}
class MyTest1{
public static void main (String[] args) {
MyDemo1 demo1 = new MyDemo1();
demo1.show(100);
demo1.show("acvacav");
}
5、请简述Java中如何使用泛型编写带有参数的类?并举例
在定义一个类的时候,可以给这个类给一个或者多个泛型(可以明确,也可以不明确),在这个类中提供set和get方法,在创建对象时可以给泛型明确具体的类型
public class MyDemo<S,I> {
private S s;
private I i;
public S getS () {
return s;
}
public void setS (S s) {
this.s = s;
}
public I getI () {
return i;
}
public void setI (I i) {
this.i = i;
}
}
class MyTest{
public static void main (String[] args) {
MyDemo<String, Integer> stringIntegerMyDemo = new MyDemo<>();
stringIntegerMyDemo.setS("aaa");
stringIntegerMyDemo.setI(100);
String s = stringIntegerMyDemo.getS();
Integer i = stringIntegerMyDemo.getI();
System.out.println(s);
System.out.println(i);
}
}
B:看程序写结果(写出自己的分析理由),程序填空,改错,看程序写结果。
1、给出以下代码,请问该程序的运行结果是什么?如有问题,请说明原因。
class Test {
private T name;
public T getName() {
return name;
}
public void setName(T name){
this.name = name;
}
public static void main (String[] args) {
Test strTest = new Test();
strTest.setName(“aaa”);
System.out.println( strTest.getName() );
Test intTest = new Test();
intTest.setName(1234);
System.out.println( intTest.getName() );
}
}
结果:
aaa
1234
2、给出以下代码,如有问题,请说明原因。
需求:定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据
public static void printCollection (Collection cols) {
for (Object obj : cols) {
System.out.println( obj );
}
}
Collection参数类型不需要给出泛型
class Test{
public static void printCollection(Collection cols){
for (Object obj : cols) {
System.out.println(obj);
}
}
}
class MyTest3{
public static void main (String[] args) {
Collection<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
Test.printCollection(integers);
LinkedList<String> strings = new LinkedList<>();
strings.add("aaa");
strings.add("bbbb");
strings.add("cccc");
Test.printCollection(strings);
}
}
3、 给出以下代码,如有问题,请说明原因。
class Animal {}
class Dog extends Animal{}
class Cat extends Animal{}
class GenericDemo {
public static void main(String[] args) {
Collection c = new ArrayList();
Collection c1 = new ArrayList();
Collection c2 = new ArrayList();
//改:Collection c2 = new ArrayList<>();
Collection c3 = new ArrayList();
//改:Collection c3 = new ArrayList<>();
Collection<? extends Animal> c4 = new ArrayList();
//改:向下限定Collection<? extends Animal> c4 = new ArrayList<Animal的子类或者本身>();
Collection<? extends Animal> c5 = new ArrayList();
Collection<? extends Animal> c6 = new ArrayList();
Collection<? extends Animal> c7 = new ArrayList();
Collection<? super Animal> c8 = new ArrayList();
Collection<? super Animal> c9 = new ArrayList();
Collection<? super Animal> c10 = new ArrayList();
Collection<? super Animal> c11 = new ArrayList();
//改:向上限定Collection<? super Animal> c10 = new ArrayList<Animal的本身或者父类>();
Collection<? super Animal> c11 = new ArrayList<Animal的本身或者父类>();
}
}
4、给出以下代码,请问该程序的运行结果是什么?如有问题,请说明原因。
interface Inter {
public abstract void method();
}
class SubEx implements Inter {
public void method() {
System.out.println(“SubEx”);
}
}
class GenericTest {
public static void main (String[] args) {
List list = new ArrayList();
SubEx se = new SubEx();
list.add(se);
printList1(list);
printList2(list);
printList3(list);
printList4(list);
}
public static void printList1 (List<? extends Inter> list) {
for (Inter in : list) {
in.method();
}
}
public static void printList2 (List<?> list) {
for (Object obj : list) {
((Inter)obj).method();
}
}
public static void printList3 (List list) {//List< SubEx> list)
for (Inter in: list) {
in.method();
}
}
public static void printList4 (List list) {//List list
for (Object obj : list) {
((Inter)obj).method();
}
}
}
结果:
SubEx
SubEx
SubEx
SubEx
C:编程题
1、请编写程序,将自定义对象存储到ArrayList集合,使用泛型并遍历
a) 使用迭代器遍历、
b) 使用列表迭代器遍历
c) 使用size()和get()方法遍历
d) 使用增强for遍历
public class MyArrayList {
public static void main (String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
integers.add(100);
integers.add(1000);
integers.add(1);
integers.add(2);
//列表迭代器遍历
ListIterator<Integer> integerListIterator = integers.listIterator();
while (integerListIterator.hasNext()) {
Integer next = integerListIterator.next();
System.out.println(next);
}
System.out.println("-------------------");
//迭代器遍历
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println(next);
}
System.out.println("-------------------");
//使用size()和get()方法遍历
for(int i=0;i<integers.size();i++){
Integer integer = integers.get(i);
System.out.println(integer);
}
System.out.println("-------------------");
//forEach方法遍历
integers.forEach(new Consumer<Integer>() {
@Override
public void accept (Integer integer) {
System.out.println(integer);
}
});
System.out.println("-------------------");
//新式for循环
for (Integer integer : integers) {
System.out.println(integer);
}
}
}
2、请编写程序,将自定义对象存储到Vector集合,使用泛型并遍历
a) 使用迭代器遍历
b) 使用Vector特有的迭代器遍历
c) 使用size()和get()方法遍历
d) 使用增强for遍历
public class MyVector {
public static void main (String[] args) {
Vector<Integer> vector = new Vector<>();
vector.add(100);
vector.add(1000);
vector.add(1);
vector.add(2);
//使用迭代器遍历
Iterator<Integer> iterator = vector.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println(next);
}
System.out.println("--------------");
//使用Vector特有的迭代器遍历
Enumeration<Integer> elements = vector.elements();
while (elements.hasMoreElements()) {
Integer integer = elements.nextElement();
System.out.println(integer);
}
System.out.println("-----------------");
//使用size()和get()方法遍历
for (int i = 0; i < vector.size(); i++) {
Integer integer1 = vector.get(i);
System.out.println(integer1);
}
System.out.println("-----------------");
//使用增强for遍历
for (Integer integer2 : vector) {
System.out.println(integer2);
}
}
}
3、请编写程序,将自定义对象存储到LinkedList集合,使用泛型并遍历
a) 使用迭代器遍历
b) 使用列表迭代器遍历
c) 使用size()和get()方法遍历
d) 使用增强for遍历
public class MyLinkedList {
public static void main (String[] args) {
LinkedList<Integer> linkedList = new LinkedList<>();
linkedList.add(100);
linkedList.add(1000);
linkedList.add(1);
linkedList.add(2);
//使用迭代器遍历
Iterator<Integer> iterator = linkedList.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println(next);
}
System.out.println("----------------");
//使用列表迭代器遍历
ListIterator<Integer> integerListIterator = linkedList.listIterator();
while (integerListIterator.hasNext()) {
Integer next = integerListIterator.next();
System.out.println(next);
}
System.out.println("----------------");
// 使用size()和get()方法遍历
for (int i = 0; i < linkedList.size(); i++) {
Integer integer = linkedList.get(i);
System.out.println(integer);
}
System.out.println("----------------");
//使用增强for遍历
for (Integer integer : linkedList) {
System.out.println(integer);
}
}
}
4、请编写程序,完成N个数 相加的功能,并测试
public class Plus {
public static void main (String[] args) {
int sum= add(1,12,4,5,6);//传入的参数就是要相加的数
System.out.println(sum);
}
private static int add (int... n) {//可变参数
int sum=0;
for (int i : n) {//新式for循环
sum+=i;
}
return sum;
}
}