您的位置:首页 > 其它

集合-2

2016-03-21 15:32 183 查看
集合-2
1.去除ArrayList中重复字符串元素方式

*案例演示,通过创建新集合的方式去除ArrayList集合中字符串的重复值(字符串的内容相同)

                   publicstatic void main(String[] args) {

                            ArrayListlist = new ArrayList();

                            list.add("a");

                            list.add("a");

                            list.add("b");

                            list.add("b");

                            ArrayListnewList = getSingle(list);

                            System.out.println(newList);

                   }                

          * 分析:

          * 1,创建新集合

          * 2,根据传入的集合(老集合)获取迭代器

          * 3,遍历老集合

          * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加

                   publicstatic ArrayList getSingle(ArrayList list) {

                            ArrayListnewList = new ArrayList();        //创建一个新集合

                            Iteratorit = list.iterator();       //获取迭代器

                            while(it.hasNext()){         //判断老集合中是否有元素

                                     Stringtemp = (String)it.next();  //将每一个元素临时记录住

                                     if(!newList.contains(temp)){  //如果新集合中不包含该元素

                                               newList.add(temp);//将该元素添加到新集合中,@@遍历老集合的同时,增加新集合的元素,所以不会产生并发修改.

                                     }

                            }

                            returnnewList;          //将新集合返回

                   }

2.去除ArrayList中重复自定义对象元素

*通过创建新集合的方式去除ArrayList集合中自定义对象元素的重复值(对象的成员变量值相同)

* B:注意事项

         *必须重写equals()方法!!!!!!

       @@在添加自定义对象时contains方法判断是否包含,底层依赖的是equals方法

         remove方法判断是否删除,底层依赖的是equals方法,都必须在封装对象属性的那个类中也就是set,get方法下重写equals方法

public class Demo2_ArrayList {

         publicstatic void main(String[] args) {

                   ArrayListlist = new ArrayList();       //创建集合对象

                   list.add(newPerson("张三", 23));

                   list.add(newPerson("张三", 23));

                   list.add(newPerson("李四", 24));

                   list.add(newPerson("李四", 24));

                   list.add(newPerson("李四", 25));

                   list.add(newPerson("李四", 24));

                  

                   //ArrayListnewList = getSingle(list);            //调用方法去除重复

                   //System.out.println(newList);

                   list.remove(newPerson("张三", 23));

                   System.out.println(list);    //[Student [name=张三, age=23],Student [name=李四, age=24], Student [name=李四, age=25]]

         }

          * 分析:

          * 1,创建新集合

          * 2,根据传入的集合(老集合)获取迭代器

          * 3,遍历老集合

          * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加

         publicstatic ArrayList getSingle(ArrayList list) {

                   ArrayListnewList = new ArrayList<>();   //1,创建新集合

                   Iteratorit = list.iterator();                 //2,根据传入的集合(老集合)获取迭代器

                  

                   while(it.hasNext()){               //3,遍历老集合

                            Objectobj = it.next();                //记录住每一个元素

                            if(!newList.contains(obj)){         //如果新集合中不包含老集合中的元素

                                     newList.add(obj);     //将该元素添加

                            }

                   }                

                   returnnewList;

         }

}

public boolean equals(Object obj) {

                   studentp = (student)obj;

                   returnthis.name.equals(p.name) && this.age == p.age;

         }

 

3.LinkedList的特有功能

* A:LinkedList类概述

* B:LinkedList类特有功能

         *public void addFirst(E e)及addLast(E e)  //在链表头位置添加,在末尾位置添加

                   LinkedListlist = new LinkedList();

                   list.addFirst("a");

                   list.addFirst("b");

                   list.addLast("e");     // bae

         *public E getFirst()及getLast()    //获取第一个值,获取最后一个值

                   System.out.println(list.getLast());    //e

         *public E removeFirst()及public E removeLast()  //删除第一个,最后一个元素并返回删除的元素

                   System.out.println(list.removeFirst());  // b

         *public E get(int index);  //获取给定索引处的元素,虽然看起来和数组一样能快速定位找到元素,但它底层还是从前向后或从后向前挨个找的,较数组慢

                   System.out.println(list.get(1));  // e

 

4.栈和队列数据结构

* 栈: 先进后出

* 队列: 先进先出

 

5.用LinkedList模拟栈数据结构的集合并测试

* A:案例演示

         *请用LinkedList模拟栈数据结构的集合,并测试

           模拟队列数据结构的集合,只需将出栈方法改成list.removeFirst()即可!!!

         publicclass Demo4_LinkedList {

                   publicstatic void main(String[] args) {

                            Stacks = new Stack();

                            s.in("a");           //进栈

                            s.in("b");

                            s.in("c");          

                            while(!s.isEmpty()){                  //判断栈结构是否为空

                                     System.out.println(s.out());     //弹栈

                            }

                   }

 

                   classStack {

                            privateLinkedList list = new LinkedList();  //创建LinkedList对象

                                    

                            publicvoid in(Object obj) {

                                     list.addLast(obj);      //模拟进栈方法

                            }

                                    

                            publicObject out() {

                                     returnlist.removeLast();          //模拟出栈

                            }

                                    

                            publicboolean isEmpty() {

                                     returnlist.isEmpty();          //模拟栈结构是否为空

                            }

                   }

6.泛型概述和基本使用

* A:泛型概述

 @@<>指的就是泛型,里面要写一个引用数据类型,它是限定你这个集合存储的数据类型,如果加上了这个引用数据类型,你这个集合只能存储该类型的对象,或该类型的子类对象,比如你放Person,如果Student继承了Person,那我这个集合也可以放Student,这叫父类引用指向子类对象,也可以只放person,这个<>相当于表示了我这个泛型能够存储什么样的引用数据类型; 另<>中只能存放引用数据类型,因为泛型中只能存储对象

* B:泛型好处

         *提高安全性(将运行期的错误转换到编译期)

         *省去强转的麻烦                           @@@参考代码理解Demo1_Generic.java!!!!!!

         publicstatic void demo1() {

                   ArrayList<Person>list = new ArrayList<Person>();

                 //list.add(110);  1

                 //list.add(true); 2 //如果不加泛型,1和2只有到运行的时候才会报错,但加了泛型之后,只要写上这两句话就会报错

                   list.add(newPerson("张三", 23));

                   list.add(newPerson("李四", 24));           

                   Iterator<Person>it = list.iterator();

                   while(it.hasNext()){                           

                            //System.out.println(it.next().getName()+ "..." + it.next().getAge());//next方法只能调用一次,如果调用多次会将指针向后移动多次.   //张三.....24

                            Personp = it.next();             //不用强转!!!!!!!              

                            System.out.println(p.getName() +"..." + p.getAge());

                   }

         }

}

* D:泛型使用注意事项

         *前后的泛型必须一致,

         *或者后面的泛型可以省略不写(1.7的新特性菱形泛型) 

         *泛型最好不要定义成Object,没有意义

 

7.ArrayList存储字符串和自定义对象并遍历泛型版

* A:案例演示

         *ArrayList存储字符串并遍历泛型版(普通字符串类型的自己写!!!)

         publicstatic void main(String[] args) {

             ArrayList<Person> list = newArrayList<>();

             list.add(new Person("张三",23));

             list.add(new Person("李四",24));      //加了泛型后add里面默认的是person类型,不加默认object类型               

             Iterator<Person> it =list.iterator();

             while(it.hasNext()) {

       
b2e5
               Person p = it.next();   //将集合中的每一个元素用Person记录,不用强转

                      System.out.println(p.getName() +"..." + p.getAge());

              }

          }

 

8.泛型的由来

* A:案例演示

         *泛型的由来:通过Object转型问题引入

         *早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

 

9.泛型类的概述及使用

* A:泛型类概述<T>

         *把泛型定义在类上

* B:定义格式

         *public class 类名<泛型类型1,…>

* C:注意事项 

         *泛型类型必须是引用类型

* D:案例演示

         *泛型类的使用

10.泛型方法的概述和使用

* A:泛型方法概述

         *把泛型定义在方法上

* B:定义格式 

         *public <泛型类型> 返回类型方法名(泛型类型变量名)

* C:案例演示

         *泛型方法的使用

 

11.泛型接口的概述和使用

* A:泛型接口概述               

         *把泛型定义在接口上

* B:定义格式 

         *public interface 接口名<泛型类型>

* C:案例演示

         *泛型接口的使用

 

12.泛型高级之通配符

* A:泛型通配符<?>

         *(可以替代)任意类型,如果没有明确,那么就是Object以及任意的Java类了

* B:? extends E

         *向下限定,E及其子类

* C:? super E

         *向上限定,E及其父类

 

13.增强for的概述和使用

* A:增强for概述

         *简化数组和Collection集合的遍历,底层依赖的是迭代器(Iterator)

* B:格式:   @@@fore alt+/会自动生成下面的格式!!!

*

                   for(元素数据类型 变量 : 数组或者Collection集合) {

                            使用变量即可,该变量就是元素

                   }

* C:案例演示

         *数组,集合存储元素用增强for遍历

         publicstatic void demo2() {

                   ArrayList<Person>list = new ArrayList<>();

                   list.add(newPerson("张三", 23));

                   list.add(newPerson("李四", 24));           

                   for(Person person : list) {

                       System.out.println(person.getName()+"...."+person.getAge());  @@也可以直接调用get方法,得到属性值!!!!!!!!

                   }        }

* D:好处

         *简化遍历

                   ArrayList<String>list = new ArrayList<>();

                   list.add("a");

                   list.add("b");                     

                   for(Strings : list) {

                         System.out.println(s);

                   }

14.三种迭代的能否删除

* 普通for循环,可以删除,但是索引要--

public static void main(String[] args) {

         ArrayList<String>list = new ArrayList<>();

         list.add("a");

         list.add("b");

         list.add("b");

 

         for(inti = 0; i < list.size(); i++) {

                   if("b".equals(list.get(i))){

                            list.remove(i--);        //通过索引删除元素,如果list.remove(i);的话,当相邻的两个元素相同时只能删除第一个,因为当你删除第一个的时候,指针指向的是第一个,但删除完之后,后面的元素会整体向前移动一个位置,这时候当前指针位置是第二个要删除的元素,但随后i++,指针后移,就正好错过了这个要删除的元素,所以这时需要将指针向后退一个位置,在i++后正好删除它

                   }

         }

* 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常

         Iterator<String>it = list.iterator();  //用它的话,它只有remove没有add

         //ListIterator<String>it = list.listIterator();这句也可以       

         while(it.hasNext()){

                   if("b".equals(it.next())){

                            //list.remove("b");     //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常

                            it.remove();

                   }

         }

* 增强for循环不能删除,只能遍历.

 

15.静态导入的概述和使用

* A:静态导入概述

         静态导入是导入类中静态方法

* B:格式:

         *import static 包名….类名.方法名;

* C:注意事项

         *方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。

           静态导入开发不用,但是需要能看懂

 

16.可变参数的概述和使用

* A:可变参数概述  @@可变参数其实是一个数组

         *定义方法的时候不知道该定义多少个参数

* B:格式

         *修饰符 返回值类型 方法名(数据类型…  变量名){}

* C:注意事项:

         *这里的变量其实是一个数组

         *如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

public static void print(int ... arr) {            //可变参数其实是一个数组

         for(int i = 0; i < arr.length; i++) {

                   System.out.println(arr[i]);

         }

}        @@@可变参数虽然表示一个数组,但你调用这个方法时,你传一个数组print(arr);,传值print(11,22,33,44,55);或是什么都不传print();都可以调用这个方法,只不过什么都不传,什么都不打印

 

17.Arrays工具类的asList()方法的使用

* A:案例演示

* 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法(除了添加和减少的方法)

         *Arrays工具类的asList()方法的使用

                   String[]arr = {"a","b","c"};

                   List<String>list = Arrays.asList(arr);                //将数组转换成集合

                   //list.add("d");          //不能添加

 

 

                   Integer[]arr = {11,22,33,44,55};      //将数组转换成集合,数组必须是引用数据类型

                   List<Integer>list = Arrays.asList(arr);

                   System.out.println(list);    @@[11,22,33,44,55]

         *Collection中toArray(T[] a)泛型版的集合转数组

                  //集合转数组,加泛型的

                   ArrayList<String>list = new ArrayList<>();

                   list.add("a");

                   list.add("b");;

                  

                   String[]arr = list.toArray(new String[10]);       //当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size;如果数组的长度大于了size,分配的数组长度就和你指定的长度一样

                   for(String string : arr) {

                            System.out.println(string);

                   }

18.集合嵌套之ArrayList嵌套ArrayList

* A:案例演示

         *集合嵌套之ArrayList嵌套ArrayList

public class Demo5_ArrayListArrayList {

          * 案例:

          * 我们学科,学科又分为若个班级

          * 整个学科一个大集合

          * 若干个班级分为每一个小集合

         publicstatic void main(String[] args) {

                   ArrayList<ArrayList<Person>>list = new ArrayList<>();

                  

                   ArrayList<Person>first = new ArrayList<>();           //创建第一个班级

                   first.add(newPerson("杨幂", 30));

                   first.add(newPerson("李冰冰", 33));

                   first.add(newPerson("范冰冰", 20));

                  

                   ArrayList<Person>second = new ArrayList<>();

                   second.add(newPerson("黄晓明", 31));

                   second.add(newPerson("赵薇", 33));

                   second.add(newPerson("陈坤", 32));

                  

                   //将班级添加到学科集合中

                   list.add(first);

                   list.add(second);

                   //遍历学科集合

                   for(ArrayList<Person>a : list) {

                            for(Personp : a) {

                                     System.out.println(p);

                                     @@System.out.println(p.getName()+"...."+p.getAge());!!!!!

                            }   }   }   }

注:了解部分翻看笔记源码!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: