黑马程序员技术交流社区

标题: day16 [打印本页]

作者: Echo0912    时间: 2015-9-11 23:55
标题: day16
ArrayList存储元素去重:
        思路:
                A:创建一个新的集合对象。
                B:通过老集合获取一个迭代器对象,然后遍历老集合。
                C:判断新集合中是否包含当前遍历到的元素,
                        如果包含,不添加,
                        如果不包含,就把该元素添加到新集合中。
                        自定义方法名:getSingle();

        案例1:ArrayList存储字符串如何去除重复元素
        案例2:ArrayList存储自定义对象如何去除重复元素
                   注意:对象的成员变量值相同,我们就认为他是同一个元素
                        示例:
                                自定义对象:用Person类来做,name,age属性
                                        list.add(new Person("张三",25));
                                        list.add(new Person("张三",25));
                                        list.add(new Person("李四",26));
                                        list.add(new Person("王五",27));
                                        list.add(new Person("王五",27));
                                        list.add(new Person("王五",27));


                解题思路:
                        注意事项:
                                contains()方法判断集合中是否包含某个元素,或者remove()移除集合中的某个元素,这两个方法的底层都是调用了equals()方法,所以我们要在基本类(Person类)中重写equals()方法。

LinkedList:
        void addFirst() 和 addLast()                          添加
        Object removerFirst() 和 removeLast();   删除
        Object getFirst()  和   getLast();       获取
        Object get(int index);

        数据结构:
                栈:先进后出。
                队列:先进先出。

        面试题:用LinkedList来模拟栈的数据结构。  1 2 3   
                思路:自己封装一个集合类,然后提供,进栈,出栈,判断栈结构是否为空三个方法就可以了。

                class Stack{
                        private LinkedList list = new LinkedList();

                        //进栈
                        public void in(){
                                list.addLast();
                        }

                        //出栈
                        public Object out(){
                                list.removeLast();
                        }

                        //判断栈结构
                        public boolean isEmpty(){
                                list.isEmpty();
                        }
                }

泛型:
        概述:泛指某种类型。
        好处:
                1、提高安全性。(把运行期异常转移到编译期)
                2、不用强转了。
        泛型的格式:
                <>    <>中的数据类型必须是引用类型
        注意事项:
                1、前后泛型必须一致,或者后边的泛型可以不写。
                        ArrayList<String> list = new ArrayList<String>();
       
        案例:ArrayList存储字符串、自定义对象并遍历(泛型版)

        泛型的由来:
                以前的集合能存的是Object类型的数据,这样什么类型的数据都可以存进集合了。
                但是好多时候我们要做类型转换,这样就不安全。而泛型就是来解决这个问题的

        泛型类:
                格式:
                        在类名后边加泛型即可。
                        class Person<T> {  //type

                                public void show(T t){
                               
                                }

                                public <V> void method(V v){
                               
                                }

                                public static <B> void function(B b){
                               
                                }
                       
                        }

        泛型方法:
                注意:方法的泛型最好和类型的泛型一致。
                分类:
                        非静态方法:
                                1、泛型可以与类的泛型一直,这样不用定义自己的泛型。
                                                public void show(T t) { }
                                2、泛型与类的泛型不一致,需要定义自己的泛型。
                                                public <V> void method(V v) {  }

                        静态方法:
                                必须定义自己的泛型,为什么?
                                        因为静态成员是随着类的加载而加载的,类加载的时候,对象还没有创建。
                                格式:
                                        public static <B> void function(B b){ }


        泛型接口:
                格式:
                        interface Smoke<T>{
                                void smoke(T t);
                        }
                实现方式:
                        1、用普通类来实现。
                                class Demo1 implements Smoke<Student> {   //较常用

                                        public void smoke(Student s){
                                       
                                        }
                                }

                                class Demo2 implements Smoke<Teacher> {

                                        public void smoke(Teacher t){
                                       
                                        }
                                }

                        2、用泛型类来实现。
                        class Test<T> implements Somke<T> {
                                public void somke(T t){
                               
                                }
                        }


        通配符:<?>
                向下限定
                        ? extends E  E及其子类

                向上限定
                        ? super E   E及其父类



集合加强:
        增强for:
                格式:
                        for(元素的数据类型 变量名 : 数组或者集合名){
                                //具体的功能代码
                        }
                ArrayList<String> list = new ArrayList<String>();

        案例:ArrayList存储字符串、自定义对象并遍历(增强for版)

        遍历集合:
                1、普通for: get(),size()方法
                2、迭代器。
                3、增强for。
                        底层是依赖于迭代器的。

                问:这三种遍历方式能不能在遍历集合的同时,删除集合中的元素。
                        A:普通for。
                                可以。但是注意索引要--。 (看需求)
                        B:迭代器。
                                可以。但是要调用迭代器的remove()方法,不要调用集合的remove()方法。
                                注意:
                                        遍历集合的同时,往集合中添加元素,
                                        如果使用的是普通的迭代器,是不可以的,会报并发修改异常。
                                        如果使用的是列表迭代器,是可以的,但是要使用列表迭代器中的add()方法。
                        C:增强for。
                                不可以。
               

可变参数:
        什么时候使用?
                定义的方法,不知道形参的个数的时候就可以考虑使用。
        格式:
                修饰符 返回值类型 方法名(数据类型... 变量名){  //int... b
               
                }
        注意事项:
                1、可变参数底层其实是一个数组。
                2、如果方法有多个参数,并且有可变参数时候,可变参数必须放参数列表最后。

集合和数组之间的相互转换:
        集合转数组:
                toArray();   
                注意:
                        如果数组的长度大于集合的长度,转换后的数组长度是数组自己的长度。
                        如果数组的长度小于等于集合的长度,转换后的数组长度是集合的长度。
                示例:
                        集合:10 20 30  (Integer)
                        数组长度是5:  10 20 30 null null
                        数组长度是3:  10 20 30
                        数组长度是2:  10 20 30

        数组转集合:
                Arrays类中的asList()。
                注意:
                        数组转成集合后,集合中的元素不能添加或删除。
                        要转集合的数组必须是引用类型,如果基本类型,会直接吧该基本类型的数组当做集合中的一个元素。


ArrayList集合的嵌套:
        关键点:
                1、创建一个学科集合。
                        ArrayList<ArrayList<Person>> list = ArrayList<>();
                2、遍历的时候,通过增强for的嵌套遍历,获取到每一个学员,然后输出学员的信息。
       

作者: zzq18217362451    时间: 2015-9-12 00:01
赞,必须赞啊,困扰了很久了




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