Java基础[集合泛型]

 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
 * 思路:创建新集合方式

public static void main(String[] args) {
    ArrayList list = new ArrayList();
    list.add("a");
    list.add("a");
    list.add("b");
    list.add("b");
    list.add("b");
    list.add("c");
    list.add("c");
    list.add("c");
    list.add("c");
    
    System.out.println(list);
    ArrayList newList = getSingle(list);
    System.out.println(newList);
}

/*
 * 去除重复
 * 1,返回ArrayList
 * 2,参数列表ArrayList
 */
public static ArrayList getSingle(ArrayList list) {
    ArrayList newList = new ArrayList();            //创建一个新集合
    Iterator it = list.iterator();                    //获取迭代器
    while(it.hasNext()) {                            //判断老集合中是否有元素
        String temp = (String)it.next();            //将每一个元素临时记录住
        if(!newList.contains(temp)) {                //如果新集合中不包含该元素
            newList.add(temp);                        //将该元素添加到新集合中
        }
    }
    return newList;                                    //将新集合返回
}


* A:去除ArrayList中重复自定义对象元素
    * 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
    * 重写equals()方法的,需要做向下转型

* B:LinkedList类特有功能
    * public void addFirst(E e)及addLast(E e)
    * public E getFirst()及getLast()
    * public E removeFirst()及public E removeLast()
    * public E get(int index);

 

集合框架(栈和队列数据结构)
* 栈
    * 先进后出 
* 队列
    * 先进先出

* 需求:请用LinkedList模拟栈数据结构的集合,并测试
* 创建一个类将Linked中的方法封装
 

    public class Stack {
        private LinkedList list = new LinkedList();        //创建LinkedList对象
        
        public void in(Object obj) {
            list.addLast(obj);                            //封装addLast()方法
        }
        
        public Object out() {
            return list.removeLast();                    //封装removeLast()方法
        }
        
        public boolean isEmpty() {
            return list.isEmpty();                        //封装isEmpty()方法
        }
    }

* B:泛型好处
    * 提高安全性(将运行期的错误转换到编译期) 
    * 省去强转的麻烦
* C:泛型基本使用
    * <>中放的必须是引用数据类型 
* D:泛型使用注意事项
    * 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)  
 

    public class Demo3_Generic {

        /**
         * A:案例演示
         * 泛型的由来:通过Object转型问题引入
         * 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
         */
        public static void main(String[] args) {
            //demo1();
            Tool<String> t = new Tool<>();
            //t.show("abc");
            t.show(true);
        }

        public static void demo1() {
            Tool<Student> t = new Tool<>();                    //创建工具类对象
            t.setObj(new Student("张三",23));
            
            //Worker w = (Worker) t.getObj();            //向下转型
            //System.out.println(w);
        }
    }



    public class Demo1_Generic {
        public static void main(String[] args) {
            //demo1();
            //int[] arr = new byte[5];                            //数组要保证前后的数据类型一致
            //ArrayList<Object> list = new ArrayList<Person>();    //集合的泛型要保证前后的数据类型一致
            //ArrayList<Object> list = new ArrayList<>();        //1.7版本的新特性,菱形泛型
            ArrayList<Object> list = new ArrayList<>();            //泛型最好不要定义成Object,没有意义
            list.add("aaa");
            list.add(true);
        }

        public static void demo1() {
            ArrayList<Person> list = new ArrayList<Person>();
        //    list.add(110);
        //    list.add(true);
            list.add(new Person("张三", 23));
            list.add(new Person("李四", 24));
            
            Iterator<Person> it = list.iterator();
            while(it.hasNext()) {
                //System.out.println(it.next());
                
                //System.out.println(it.next().getName() + "..." + it.next().getAge());//next方法只能调用一次,如果调用多次会将指针向后移动多次
                Person p = it.next();            
                System.out.println(p.getName() + "..." + p.getAge());
            }
        }

    }

 

三种迭代,能否删除元素:

public class Demo1_Foreach {
    /**
     * * A:增强for概述
            * 简化数组和Collection集合的遍历
        * B:格式:
        * 
                for(元素数据类型 变量 : 数组或者Collection集合) {
                    使用变量即可,该变量就是元素
                }
        * C:案例演示
            * 数组,集合存储元素用增强for遍历
        * D:好处
            * 简化遍历
        增强for循环底层依赖的是迭代器(Iterator)
     */
    public static void main(String[] args) {
        //demo1();
        //demo2();
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");
        
        //1,普通for循环删除,索引要--
        /*for(int i = 0; i < list.size(); i++) {
            if("b".equals(list.get(i))) {
                list.remove(i--);                            //通过索引删除元素
            }
        }*/
        
        //2,迭代器删除
        /*Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            if("b".equals(it.next())) {
                //list.remove("b");                            //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
                it.remove();
            }
        }*/
        
        /*for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
            if("b".equals(it2.next())) {
                //list.remove("b");                            //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
                it2.remove();
            }
        }*/
        //3,增强for循环,增强for循环不能删除,只能遍历
        for (String string : list) {
            if("b".equals(string)) {
                list.remove("b");  //删除无效
            }
        }
        System.out.println(list);
    }

    public static void demo2() {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三", 23));
        list.add(new Person("李四", 24));
        list.add(new Person("王五", 25));
        list.add(new Person("赵六", 26));
        
        for (Person person : list) {
            System.out.println(person);
        }
    }

    public static void demo1() {
        int[] arr = {11,22,33,44,55};
        for (int i : arr) {
            System.out.println(i);
        }
        
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        for (String string : list) {
            System.out.println(string);
        }
    }

}


泛型定义的几个方式:

public class Demo4_Generic {

    /**
     * * A:泛型接口概述
            * 把泛型定义在接口上
        * B:定义格式    
            * public interface 接口名<泛型类型>
        * C:案例演示
            * 泛型接口的使用
     */
    public static void main(String[] args) {

    }
}


interface Inter<T> {
    public void show(T t);
}

/*class Demo implements Inter<String> {        //推荐用这种

    @Override
    public void show(String t) {
        System.out.println(t);
    }
    
}*/

class Demo<T> implements Inter<T> {            //没有必要在实现接口的时候给自己类加泛型

    @Override
    public void show(T t) {
        System.out.println(t);
    }
}



public class Demo5_Generic {

    /**
     * * A:泛型通配符<?>
            * 任意类型,如果没有明确,那么就是Object以及任意的Java类了
        * B:? extends E
            * 向下限定,E及其子类
        * C:? super E
            * 向上限定,E及其父类
     */
    public static void main(String[] args) {
        //List<?> list = new ArrayList<Integer>();            //当右边的泛型是不确定时,左边可以指定为?
        ArrayList<Person> list1 = new ArrayList<>();
        list1.add(new Person("张三", 23));
        list1.add(new Person("李四", 24));
        list1.add(new Person("王五", 25));
        
        ArrayList<Student> list2 = new ArrayList<>();
        list2.add(new Student("赵六", 26));
        list2.add(new Student("周七", 27));
        
        list1.addAll(list2);
        System.out.println(list1);
        
    }

}

可变参数:

    /**
     * * A:可变参数概述
            * 定义方法的时候不知道该定义多少个参数
        * B:格式
            * 修饰符 返回值类型 方法名(数据类型…  变量名){}
        * C:注意事项:
            * 这里的变量其实是一个数组
            * 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
     */
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55};
        //print(arr);
        print(11,22,33,44,55);
        System.out.println("---------------");
        //print();
    }
    
    /*public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }*/
    
    
    public static void print(int ... arr) {            //可变参数其实是一个数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }


集合转数组,加泛型的:

    public static void main(String[] args) {
        //demo1();
        //demo2();
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        String[] arr = list.toArray(new String[10]);        //当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size
                                                            //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
        for (String string : arr) {
            System.out.println(string);
        }
    }


数组转换成集合(不能增加或减少元素,其它功能可用; 想要删除和增加可以新建一个集合把来处理数组,自定义增加和删除功能):

    public static void demo2() {
        //int[] arr = {11,22,33,44,55};            
        //List<int[]> list = Arrays.asList(arr);            基本数据类型的数组转换成集合,会将整个数组当作一个对象转换
        //System.out.println(list);
        Integer[] arr = {11,22,33,44,55};                    //将数组转换成集合,数组必须是引用数据类型
        List<Integer> list = Arrays.asList(arr);
        System.out.println(list);
    }

    public static void demo1() {
        String[] arr = {"a","b","c"};
        List<String> list = Arrays.asList(arr);                //将数组转换成集合
        //list.add("d");                                    //不能添加
        System.out.println(list);
    }


    //删除数组中其中一个元素
    public static void testB() {
        String [] str = {"Java", "C++", "Php", "C#", "Python"};
        for (String elementA:str ) {
            System.out.print(elementA + " ");
        }
        //删除php
        List<String> list = new ArrayList<String>();        //新建一个集合
        for (int i=0; i<str.length; i++) {
            list.add(str[i]);
        }
        list.remove(2); //list.remove("Php") 
        System.out.println();
        String[] newStr =  list.toArray(new String[1]); //返回一个包含所有对象的指定类型的数组 
        for (String elementB:newStr ) {
            System.out.print(elementB + " ");
        }    
        System.out.println();
    }
 
    //在数组中增加一个元素
    public static void testC() {
        String [] str = {"Java", "C++", "Php", "C#", "Python"};
        for (String elementA:str ) {
            System.out.print(elementA + " ");
        }
        //增加ruby
        List<String> list = new ArrayList<String>();
        for (int i=0; i<str.length; i++) {
            list.add(str[i]);
        }
        list.add(2, "ruby"); //list.add("ruby") 
        System.out.println();
        String[] newStr =  list.toArray(new String[1]); //返回一个包含所有对象的指定类型的数组 
        for (String elementB:newStr ) {
            System.out.print(elementB + " ");
        }    
        System.out.println();
    }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值