黑马程序员技术交流社区

标题: 个人对于Java中泛型的理解和一些小试题 [打印本页]

作者: yuyanghel61989    时间: 2016-3-7 21:14
标题: 个人对于Java中泛型的理解和一些小试题
泛型的概述:写在尖括号里的用来限定集合数据类型的引用数据类型就是泛型(注意:泛型只能是引用数据类型)。例如泛型是Person,那么集合中只能存储Person类对象
                 * 或者Person类的子类对象(多态)。
                 * 泛型的好处:
                 * 1、提高安全性:将错误从运行期提前到了编译期。
                 * 2、省去了强制类型转换的麻烦。
                 * 解释:因为集合中可以存储多种类型的元素,当存储一个person类型和一个Integer类型时,
                 * 想要获取Person对象下的特有功能时需要强制类型转换,但是Integer类型不能转成Person类型,运行时会报错。
                 * 所以说提高了安全性。如果提前写上泛型以后因为集合中存储的只有Person类型的对象,所以说,不用进行强制类型转换就可以
                 * 直接调用Person类中的特有方法,所以说省去了强制类型转换的麻烦。使用迭代器时要注意,只要写一个it.next()方法,就会
                 * 调用下一个对象。
                 * 泛型中的注意事项:前后的泛型必须一致,或者后面的泛型可以省略不写(菱形泛型是JDK1.7的新特性)。
                 * 类上可以加泛型:可以在基本类中自己定义泛型,当在测试类中对基本类进行创建对象时,测试类中是什么泛型,基本类中就是什么泛型。
                 * 方法上定义泛型:方法泛型最好是与类的泛型一致。如果不一致需要在方法上声明该泛型(也就是说在定义方法时也可以决定使用什么泛型)。
                 * 因为静态方法随着类的加载而加载调用方法时可能还没有创建类的对象,所以说静态方法必须要声明自己的泛型。
                 * 接口泛型:一个类在实现接口的时候一般不会定义泛型,而是在要实现的接口后面给泛型赋值。
                 * 泛型的通配符:<?>当不确定后面的对象是什么类型时可以在前面使用通配符。
                 * 例如:List<?> li = new ArrayList<String>();后面可以是任意类型。
                 * ? extends E:向下限定,也就是说该集合中何以存储E的类型或者是子类(?).
                 * ? super E:向上限定,学完TreeSet再讲
                 *
            */
                Person_generic pg = new Person_generic();
                pg.in("nihao");
                System.out.println(pg.out());
        }
        /*LinkedList集合的特有功能:
        addFirst() 将指定元素插入该列表的开头。
        addLast()  将指定元素插入该列表的结尾
        getFirst() 获取该列表的第一个元素
        getLast()  获取该列表的最后一个元素
        为什么用LinkedList来模拟数据进出栈的情景。
        1、LinkedList底层是链式结构,增删改查都是按照链表结构进行,与栈内存相似。
        2、LinkedList是由存取顺序的
        3、LinkList有以下特有方法:
        addFirst() 将指定元素插入该列表的开头。
        addLast()  将指定元素插入该列表的结尾
        getFirst() 获取该列表的第一个元素
        getLast()  获取该列表的最后一个元素
        removeFirst()删除该列表的第一个元素,并返回该元素。
        removeLast()删除该列表的最后一个元素,并返回该元素。
        能够模拟出数据进出栈的情景。所以用LinkedList集合模拟栈数据结构
        注意:
        这是一类题,面试的时候如果看到这类题:
        "用**(一般是类),来模拟 某个功能",潜台词就是让我们对 **这个类进行封装,然后调用这个类中的一些方法,来实现功能。
        */
        public static void method3() {
                day16_Stack s = new day16_Stack();
                s.in("a");
                s.in("b");
                s.in("c");
                s.in("d");
                while(!s.isEmpty()){
                        System.out.print(s.out());
                }
        }

        public static void method2() {
                // 如果是自定义类型要去重的话,要记得重写equals()方法,因为contains()方法在底层也是依赖equals()方法
                ArrayList<Student> list3 = new ArrayList<Student>();
                list3.add(new Student("张三", 23));
                list3.add(new Student("张三", 23));
                list3.add(new Student("张三", 23));
                list3.add(new Student("李四", 24));
                list3.add(new Student("王五", 25));
                list3.add(new Student("赵六", 26));
                list3.add(new Student("周七", 27));
                System.out.println(list3);
                ArrayList<Student> list4 = new ArrayList<Student>();
                Iterator<Student> it = list3.iterator();
                while(it.hasNext()){
                        Student stu = it.next();
                        //如果不重写equals()方法的话,还是无法去重。在Student类中重写equals()方法以后,就会去重了。
                        //因为contains()方法底层运用的是equals()方法
                        if(!list4.contains(stu)){
                                list4.add(stu);
                        }
                }
                System.out.println(list4);
        }

        public static void mothed1() {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入字符串:");
                String str = sc.nextLine();
                char[] ch = str.toCharArray();
                ArrayList<Character> list = new ArrayList<>();
                // 可以用for循环,也可以用迭代器
                for (int i = 0; i < ch.length; i++) {
                        list.add(ch);
                }
                ArrayList<Character> list2 = new ArrayList<>();
                for (int i = 0; i < list.size(); i++) {
                        if (!list2.contains(list.get(i))) {
                                list2.add(list.get(i));
                        }
                }
                System.out.println(list2);
        }
}


作者: hihiyo    时间: 2016-3-7 23:29
666666666666666666666666 看不懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2