20泛型

20泛型

导语:

到时补充

  1. 泛型类的使用
  2. 泛型方法的使用
  3. 泛型接口的使用
  4. 泛型通配符的使用
  5. 泛型的限定的使用
  6. 通配符在api中的体现和使用
  7. 泛型上限在api中的体现和使用
  8. 泛型下限在api中的体现和使用
  9. 泛型细节:保证两边泛型值一致
  10. 对字符串按照长度排序,比较器用匿名内部类完成。想要逆序,只要将o1和o2比,改成o2和o1比。
  11. 获取集合元素最大值,1,指定类型 2,Object类型,3,泛型限定。★★★★★
  12. Arrays:用于操作数组的工具类
  13. Collections: 集合框架中的用于操作集合对象 工具类
  14. ComparatorByLength
  15. Person
  16. Student
  17. Worker
  18. Test2
  19. Test3
  20. Test5

泛型类的使用

package cn.itcast.api.a.generic;
    
    import java.util.LinkedList;
    
    public class GenericDemo2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
    //        Tool t = new Tool();
    //        t.setObject(6);
    //        String s = (String)t.getObject();
    //        System.out.println(s);
    
            Tool<String> t = new Tool<String>();
    //        t.setObject(6);//只要类型错误,编译失败。避免了运行时的类型转换异常。
            String s = t.getObject();//省去了强转的麻烦。
            System.out.println(s);
    
    
    
            Queue<String> queue = new Queue<String>();
            queue.myAdd("abcd1");
            queue.myAdd("abcd2");
            queue.myAdd("abcd3");
            while(!queue.isNull()){
                String string = queue.myGet();
                System.out.println(string);
            }
        }
    
    }
    //jdk1.5有了新技术,泛型,改成如下这样。
    //类中操作的对象确定不?不确定,用Object,需要转型,运行容易出异常。不爽。
    //在定义时,就将不确定的对象的类型,定义成参数。由使用该类的调用者来传递对象类型。
    class Tool<Q>{//将泛型定义在类上,泛型类。
        private Q object;
    
        public Q getObject() {
            return object;
        }
    
        public void setObject(Q object) {
            this.object = object;
        }
    
    }
    
    class Queue<E>{
        //封装了一个链表数据结构。
        private LinkedList<E> link;
        /*
         * 队列初始化时,对链表对象初始化。
         */
        Queue(){
            link = new LinkedList<E>();
        }
    
        /**
         * 队列的添加元素功能。
         */
        public void myAdd(E obj){
            //内部使用的就是链表的方法。
            link.addFirst(obj);
        }
    
        /**
         * 队列的获取方法。
         */
        public E myGet(){
            return link.removeLast();
        }
    
        /**
         * 判断队列中元素是否空,没有元素就为true。
         */
        public boolean isNull(){
            return link.isEmpty();
        }
    }
    
    
    
    /*
    //定义一个工具对对象进行操作,比如设置和获取。可以对任意对象进行操作。对共性类型Object操作。
    //定义Object就哦了。但用的时候,因为提升为了Object,想要使用特有内容,需要向下转型。容易引发ClassCastException:
    class Tool{
    
        private Object object;
    
        public Object getObject() {
            return object;
        }
    
        public void setObject(Object object) {
            this.object = object;
        }
    
    
    }
    */ 

泛型方法的使用

package cn.itcast.api.a.generic;
    
    public class GenericDemo3 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
    
            Util<String> util = new Util<String>();
            util.show("hehe");
    //        util.print(5);
            Util<Integer> util2 = new Util<Integer>();
            Util.print(5);
            util2.show("hehe");
    
        }
    }
    
    class Util<W>{
        //当方法要操作的类型不确定和类上的泛型不一定一样。这时可以将泛型定义在方法上。
        public  <Q> void show(Q q){//泛型方法
            System.out.println("show:"+q);
        }
        public static<E> void print(E e){//记住:如果方法是静态,还需要使用泛型,那么泛型必须定义在方法上。
            System.out.println("print:"+e);
        }
        public void method(W w){
    
        }
    } 

泛型接口的使用

package cn.itcast.api.a.generic;
    
    public class GenericDemo4 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new InterImpl<String>().show("hehe");
        }
    
    }
    
    
    //泛型接口。
    interface Inter<E>{
        void show(E e);
    }
    /*
    class InterImpl implements Inter<String>{
        public void show(String e){}
    }
    */
    
    class InterImpl<T> implements Inter<T>{
    
        @Override
        public void show(T e) {
    
    
        }
    
    } 

泛型通配符的使用

package cn.itcast.api.a.generic;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    import cn.itcast.domain.Student;
    
    public class GenericDemo5 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            Set<Student> list = new HashSet<Student>();
    
            list.add(new Student("lisi1",21));
            list.add(new Student("lisi2",22));
            list.add(new Student("lisi3",23));
    
            printList(list);
    
            List<String> list2 = new ArrayList<String>();
    
            list2.add("lisi11");
            list2.add("lisi22");
            list2.add("lisi33");
    
            printList(list2);
    
    
        }
    
        /*
         *  打印集合中的元素。
         *  
         *  当使用泛型类或者接口时,传递的具体的类型不确定,可以通过通配符(?)表示。
         *  
         */
        private static void printList(Collection<?> list2) {
            for (Iterator<?> it = list2.iterator(); it.hasNext();) {
                System.out.println(it.next().toString());
            }
        }
    
    
    
    } 

泛型的限定的使用

package cn.itcast.api.a.generic;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    import cn.itcast.domain.Person;
    import cn.itcast.domain.Student;
    import cn.itcast.domain.Worker;
    
    public class GenericDemo6 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            Set<Student> list = new HashSet<Student>();
    
            list.add(new Student("lisi1",21));
            list.add(new Student("lisi2",22));
            list.add(new Student("lisi3",23));
    
            printList(list);
    
            List<Worker> list2 = new ArrayList<Worker>();
    
            list2.add(new Worker("lisi11",21));
            list2.add(new Worker("lisi22",22));
            list2.add(new Worker("lisi33",23));
    
            printList(list2);
    
    
        }
    
        /*
         *  打印集合中的元素。
         *  当使用泛型类或者接口时,传递的具体的类型不确定,可以通过通配符(?)表示。
         *  如果想要对被打印的集合中的元素类型进行限制,只在指定的一些类型,进行打印。
         *  使用泛型的限定。
         *  
         *  只需要打印学生和工人的集合。找到学生和工人的共性类型Person。
         *  ? extends Person : 接收Person类型或者Person的子类型。
         *  
         *  总结:
         *  ? super E:接收E类型或者E的父类型。下限。
         *  ? extends E:接收E类型或者E的子类型。上限。
         */
        private static void printList(Collection<? extends Person> list2) {
            for (Iterator<? extends Person> it = list2.iterator(); it.hasNext();) {
    
                Person p = it.next();
                System.out.println(p.getName());
            }
        }
    
    
    } 

通配符在api中的体现和使用

package cn.itcast.api.a.generic;
    
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class GenericDemo7 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            /*
             * 通配符? 在api中的体现。
             * 
             * Collection接口: boolean containsAll(Collection<?> c) 
             */
    
            Collection<String> c1 = new ArrayList<String>();
            c1.add("haha");
            c1.add("hehe");
    
            Collection<Integer> c2 = new ArrayList<Integer>();
            c2.add(4);
            c2.add(5);
    
            boolean b = c1.containsAll(c2);//了解 containAll源码内判断是否包含的依据。依据是equals方法。
                                            //public  boolean equals(Object obj) "abc".equals(5);
            System.out.println("b="+b);
        }
    }
    
    /*
     * class Collection<E>
     * {
     *         public boolean containsAll(Collection<?> c){
     *         }
     * }
     */ 

泛型上限在api中的体现和使用

package cn.itcast.api.a.generic;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.TreeSet;
    
    import cn.itcast.domain.Person;
    import cn.itcast.domain.Student;
    
    public class GenericDemo8 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            /*
             *  泛型的限定在api中的使用。上限的体现。
             *  TreeSet(Collection<? extends E> c) 
             *  
             *  
             */
            //创建一个Collection.
            Collection<Student> c = new ArrayList<Student>();
            c.add(new Student("wangcai1",26));
            c.add(new Student("wangcai2",29));
    
            //TreeSet集合在创建时,就将c中的存储到Treeset集合。
            TreeSet<Person> ts = new TreeSet<Person>(c);
    
            ts.add(new Person("lisi",20));
    
            for (Iterator<Person> it = ts.iterator(); it.hasNext();) {
                Person person =  it.next();
                System.out.println(person);
    
            }
    
    
        }
    
    }
    
    /*
     * class TreeSet<E>{
     *         TreeSet(Collection<? extends E> c){}
     */ 

泛型下限在api中的体现和使用

package cn.itcast.api.a.generic;
    
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.TreeSet;
    
    import cn.itcast.domain.Person;
    import cn.itcast.domain.Student;
    import cn.itcast.domain.Worker;
    
    public class GenericDemo9 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            /*
             *  泛型的限定在api中的使用。下限的体现。
             *  TreeSet(Comparator<? super E> comparator) 
             *  
             *  
             */
            //创建一个集合存储的是学生对象。想要按照姓名排序。
            TreeSet<Student> ts = new TreeSet<Student>(new ComparatorByName());
            ts.add(new Student("abc",26));
            ts.add(new Student("aaa",29));
            ts.add(new Student("lisi",20));
    
    
            for (Iterator<Student> it = ts.iterator(); it.hasNext();) {
                Student student =  it.next();
                System.out.println(student);
    
            }
    
            //让工人按照姓名排序。
            TreeSet<Worker> ts2 = new TreeSet<Worker>(new ComparatorByName());
            ts2.add(new Worker("abc",26));
            ts2.add(new Worker("aaa",29));
            ts2.add(new Worker("lisi",20));
    
    
            for (Iterator<Worker> it = ts2.iterator(); it.hasNext();) {
                Worker worker =  it.next();
                System.out.println(worker);
    
            }
        }
    }
    
    
    class ComparatorByName implements Comparator<Person>{
    
        @Override
        public int compare(Person o1, Person o2) {
            int temp = o1.getName().compareTo(o2.getName());
    
            return temp==0? o1.getAge() - o2.getAge() : temp;
        }
    
    }
    /*
     * 以下两个比较器,都是通过姓名排序,就是类型不同,一个是student,一个是worker
     * 既然使用的都是Person的内容,为什么不定义一个Person的比较器。
     */
    /*
    //定义一个比较器。
    class ComparatorByName implements Comparator<Student>{
    
        @Override
        public int compare(Student o1, Student o2) {
            int temp = o1.getName().compareTo(o2.getName());
    
            return temp==0? o1.getAge() - o2.getAge() : temp;
        }
    
    }
    //定义一个工人的姓名比较器。
    class ComparatorByWorkerName implements Comparator<Worker>{
    
        @Override
        public int compare(Worker o1, Worker o2) {
            int temp = o1.getName().compareTo(o2.getName());
    
            return temp==0? o1.getAge() - o2.getAge() : temp;
        }
    
    }
    */
    /*
     * class TreeSet<E>{
     *         TreeSet(Comparator<? super E>  c){}
     */ 

泛型细节:保证两边泛型值一致

package cn.itcast.api.a.generic;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class GenericDemo10 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
    //        ArrayList<Dog> al = new ArrayList<Animal>();//使用泛型,要保证左右类型一致。
    //        ArrayList<String> al = new ArrayList<Object>();
    
            List<Integer> list = new ArrayList<Integer>();
    //        show(list);
        }
        public static void show(List<String> list){
    
        }
    } 

对字符串按照长度排序,比较器用匿名内部类完成。想要逆序,只要将o1和o2比,改成o2和o1比。

package cn.itcast.api.a.generic;
    
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class GenericTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            //创建一个唯一性元素的集合要求排序。set -- treeset//按照长度排序,需要比较器。匿名内部类完成
            Set<String> set = new TreeSet<String>(new Comparator<String>(){
    
                @Override
                public int compare(String o1, String o2) {
    
                    int temp = o1.length() - o2.length();
                    return temp==0?o1.compareTo(o2):temp;
                }
            });
    
            //添加元素。
            set.add("abcde");
            set.add("java");
            set.add("hello");
    
            for (Iterator<String> it = set.iterator(); it.hasNext();) {
                String string =  it.next();
                System.out.println(string);
            }
        }
    } 

获取集合元素最大值,1,指定类型 2,Object类型,3,泛型限定。★★★★★

package cn.itcast.api.a.generic;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Comparator;
    import java.util.Iterator;
    
    import cn.itcast.domain.Student;
    
    public class GenericTest2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            /*
             * 案例:获取集合中元素的最大值。
             * 
             * 思路: 1,定义变量记录每次比较后较大的值,初始化元素中任意一个。 2,遍历容器
             * 3,在遍历中和变量中记录的元素进行比较。并将较大的值记录到变量中。 4,遍历结束,变量中记录的就是最大值。
             */
    
            Collection<Student> c1 = new ArrayList<Student>();
            c1.add(new Student("xiaoming1", 30));
            c1.add(new Student("xiaoming2", 36));
            c1.add(new Student("xiaoming3", 22));
    //        c1.add(new Dog());
    
            Student stu = getMax(c1);
            System.out.println(stu);
    
            Collection<String> c2 = new ArrayList<String>();
            c2.add("abcd");
            c2.add("java");
            c2.add("z");
            c2.add("nba");
            String s = getMax(c2);
            System.out.println("s="+s);
    
            Collection<Dog> c3 = new ArrayList<Dog>();
    //        getMax(c3);//已经做了限定,说明传递的集合中的元素类型必须是Comparable的子类。否则编译失败。
        }
    
    public static <T extends Comparable<? super T>> T getMax(Collection<? extends T> c,Comparator<? super T> comp){
    
            if(comp==null){
                return getMax(c);
            }
    
            Iterator<? extends T> it = c.iterator();
    
            T max = it.next();
    
            while(it.hasNext()){
    
                T temp = it.next();
    
                if(comp.compare(temp, max)>0){
                    max = temp;
                }
            }
    
            return max;
        }
    
        // 升级版。要操作的元素的类型确定不?不确定。使用泛型限定。getMax方法接收的集合中的元素无论时什么类型,必须具备自然排序,必须是Comparable的子类。
        public static <T extends Comparable<? super T>> T getMax(Collection<? extends T> c){
    
            Iterator<? extends T> it = c.iterator();
    
            T max = it.next();
    
            while(it.hasNext()){
    
                T temp = it.next();
    
                if(temp.compareTo(max)>0){
                    max = temp;
                }
            }
    
            return max;
        }
    
        /*
        //不加泛型时,无法明确集合中的元素时什么类型,为了便于操作用Object
        public static Object getMax(Collection c1) {
    
            // 1,定义变量,记录集合中任意一个元素,Collection集合取出元素的方式只有迭代器。
            Iterator it = c1.iterator();
            Object max = it.next();
    
            // 2,遍历容器。
            while (it.hasNext()) {
                Object o = it.next();
                Comparable temp = (Comparable)o;
    
                if (temp.compareTo(max) > 0) {
                    max = temp;
                }
            }
            return max;
        }
    */
        /*
         * //这个功能虽然实现,但是有局限性,因为这个功能只能对存储了Student对象的集合进行最大值的获取。 public static Student
         * getMax(Collection<Student> c1) {
         * 
         * //1,定义变量,记录集合中任意一个元素,Collection集合取出元素的方式只有迭代器。 Iterator<Student> it =
         * c1.iterator(); Student max = it.next();
         * 
         * //2,遍历容器。 while(it.hasNext()){ Student temp = it.next();
         * 
         * if(temp.compareTo(max) > 0){ max = temp; } } return max; }
         */
    
    }
    class Dog{} 

Arrays:用于操作数组的工具类

package cn.itcast.api.b.tools;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.List;
    
    public class ArraysDemo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            /*
             * Arrays:用于操作数组的工具类。
             * 类中定义的都是静态工具方法
             * 1,对数组排序。
             * 2,二分查找。
             * 3,数组复制。
             * 4,对两个数组进行元素的比较,判断两个数组是否相同。
             * 5,将数组转成字符串。
             */
    
            int[] arr = {34,21,67};
            System.out.println(Arrays.toString(arr));
    
            //将arr转成list集合。?如果数组中存储的是基本数据类型,那么转成集合,数组对象会作为集合中的元素存在。
            //数组中元素时引用数据类型时,转成,数组元素会作为集合元素存在。
             List<int[]> list1 = Arrays.asList(arr);
             System.out.println(list1);
    
    
    
    
            String[] strs = {"hah","hehe","xixi"};
            boolean b = contains(strs,"hehe");
            System.out.println(b);
            //将数组转成list集合。asList
            /*
             * 数组转成集合:就为了使用集合的方法操作数组中的元素。
             * 但是不要使用增删等改变长度的方法。add remove  发生UnsupportedOperationException
             */
            List<String> list = Arrays.asList(strs);
            System.out.println(list.contains("hehe"));
            System.out.println(list.get(2));
            System.out.println(list.indexOf("hehe"));
    //        list.add("java");//UnsupportedOperationException  数组长度的固定的,转成List集合长度也是固定的。
    
    
    
    
            //-------------------集合转成数组---------------------
            /*
             * 为什么集合转成数组呢?
             * 为了限制对元素的增删操作。
             */
            Collection<String> c = new ArrayList<String>();
            c.add("haha1");
            c.add("haha2");
            c.add("haha3");
            c.add("haha4");
            /*
             *  如果传递的数组的长度小于集合的长度,会创建一个同类型的数组长度为集合的长度。
             *  如果传递的数组的长度大于了集合的长度,就会使用这个数组,没有存储元素的位置为null。
             *  长度最好直接定义为和集合长度一致。
             */
            String[] str_arr = c.toArray(new String[c.size()]);
            System.out.println(Arrays.toString(str_arr));
    
        }
    
        public static boolean contains(String[] strs,String key) {
    
            for (int i = 0; i < strs.length; i++) {
                if(strs[i].equals(key)){
                    return true;
                }
            }
    
            return false;
        }
    
    } 

Collections: 集合框架中的用于操作集合对象 工具类

package cn.itcast.api.b.tools;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    import cn.itcast.api.c.comparator.ComparatorByLength;
    
    public class CollectionsDemo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            /*
             * Collections: 集合框架中的用于操作集合对象 工具类。
             * 都是静态的工具方法。
             * 1,获取Collection最值。
             *
             * 
             * 2,对List集合排序,也可以二分查找。
             * 3,对排序逆序。
             * 4,可以将非同步的集合转成同步的集合。
             * Xxx synchronizedXxx(Xxx)  List synchronizedList(List) 
             */
    
    
            System.out.println("---------获取最值---------------");
            Collection<String> c = new ArrayList<String>();
            c.add("haha");
            c.add("zz");
            c.add("xixii");
            c.add("abc");
            String max = Collections.max(c,new ComparatorByLength());
    
            System.out.println("max="+max);
            System.out.println("-----------排序-------------");
            List<String> list  = new ArrayList<String>();
            list.add("hahaha");
            list.add("abc");
            list.add("xiix");
            list.add("z");
            list.add("java");
            Collections.sort(list,Collections.reverseOrder());
            System.out.println(list);
    
    
            System.out.println("------------------------");
            System.out.println("------------------------");
    
    
    
        }
    
    } 

ComparatorByLength

package cn.itcast.api.c.comparator;
    
    import java.util.Comparator;
    
    public class ComparatorByLength implements Comparator<String> {
    
        @Override
        public int compare(String o1, String o2) {
            int temp = o1.length() - o2.length();
    
            return temp == 0 ? o1.compareTo(o2) : temp;
        }
    } 

Person

package cn.itcast.domain;
    
    public class Person implements Comparable<Person> {
    
        private String name;
        private int age;
    
    
        public Person() {
            super();
        }
    
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    
        @Override
        public int compareTo(Person o) {
            int temp = this.age - o.age;
            return temp==0? this.name.compareTo(o.name): temp;
        }
    
    
    } 

Student

package cn.itcast.domain;
    
    public class Student extends Person {
    
        public Student() {
            super();
        }
    
        public Student(String name, int age) {
            super(name, age);
        }
    
        @Override
        public String toString() {
            return "Student [name =" + getName() + ", age =" + getAge()
                    + "]";
        }
    
    
    } 

Worker

package cn.itcast.domain;
    
    public class Worker extends Person {
    
        public Worker() {
            super();
        }
    
        public Worker(String name, int age) {
            super(name, age);
        }
    
        @Override
        public String toString() {
            return "Worker [name =" + getName() + ", age =" + getAge()
                    + "]";
        }
    
    
    
    } 

Test2

package cn.itcast.test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class Test2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            //作业2:List集合中存储的重复字符串元素,按照长度进行排序。
    
            List<String> list = new ArrayList<String>();
            list.add("nba");
            list.add("abcde");
            list.add("nba");
            list.add("cctv");
            list.add("zz");
            list.add("cctv");
            list.add("itcast");
    
            Collections.sort(list,new Comparator<String>() {
    
                @Override
                public int compare(String o1, String o2) {
                    int temp = o1.length() - o2.length();
                    return temp==0?o1.compareTo(o2):temp;
                }
    
            });
    
            for(String str : list){
                System.out.println(str);
            }
    
        }
    
    } 

Test3

package cn.itcast.test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class Test3 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
    //        3,在一个已排序的List集合中插入一个字符串,继续保证这个集合原有排序,问如何获取这个位置。
            List<String> list = new ArrayList<String>();
            list.add("nba");
            list.add("abcde");
            list.add("nba");
            list.add("cctv");
            list.add("zz");
            list.add("cctv");
            list.add("itcast");
    
            Collections.sort(list);
            String key =  "haha";
            //找一个元素在集合中出现的位置。
            int index = Collections.binarySearch(list, key);
            System.out.println("index="+index);
    
            if(index<0){
                index = -(index+1);
            }
    
            System.out.println("index="+index);
            System.out.println(list);
            list.add(index, key);
    
    
            System.out.println(list);
        }
    
    }
    
    
    /*
    ,new Comparator<String>() {
    
                @Override
                public int compare(String o1, String o2) {
                    int temp = o1.length() - o2.length();
                    return temp==0?o1.compareTo(o2):temp;
                }
    
            }
    
    */ 

Test5

package cn.itcast.test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test5 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    //        5,一个ArrayList对象alist中存有若干个字符串元素,现欲遍历该ArrayList对象,
    //        删除其中所有值为"abc"的字符串元素,请问下面的实现正确么?如有问题,
    //        会出现什么问题?如何更正?
    
            //1,移除成功会导致集合长度改变, 必须要重新获取size。导致了IndexOutOfBoundsException。
            //解决方案:在for循环的条件上,调用size方法。
            //2,出现了有些abc没有被删除。那么是因为删除后,角标自增,原角标上的后替换过来的元素没有被判断。
            //解决方案:在删除后,要让角标自减,重新判断替换过来的元素。
    
            List<String> list = new ArrayList<String>();
            list.add("nba");
            list.add("abc");
            list.add("abc");
            list.add("abc");
            list.add("abc");
            list.add("cctv");
    
            System.out.println(list);
    //        int size = list.size();
            for(int i = 0; i < list.size(); i++) {
              if("abc".equals(list.get(i))) {
                list.remove(i);//会改变集合的长度。应该重新获取size。
                i--;
              }
            }
    
            System.out.println(list);
        }
    
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值