Java高级特性学习(超详细)一(集合)

1.集合框架简介

1.1 为什么使用集合框架

缘由:由于数组在创建的时候会默认定义数组的长度,而数组的长度是不变的,所以导致数组的赋值及创建会有内存浪费的现象,于是集合作为可以更改长度的数组,可以解决内存浪费的现象

 

1.2 Java集合框架架构图

标准说法: 

  1. 集合有两个父接口Collection,Map
  2. Collection有两个子接口List和Set
  3. List有两个常见的实现类ArrayListLinkedList
  4. Set有两个常见的实现类HashSet和TreeSet
  5. Map有两个常见的实现类HashMap和TreeMap

备注:标红的是我们常见的也是我们本章学习重点,其余两个不是很常见

1.3 Java集合框架特点

(1)List                   特点:有序,可重复

(2)Set                   特点:无序,不可重复

(3)Collection         特点:无序,可重复

(4)Map                  特点:存放一对值【键值对】(key 键,value 值)

2.List接口

2.1 List接口的实现类:(ArrayList和LinkedList的区别)

        (1)ArrayList特点:查询效率高,增删改效率低【数组的形式去存储的】

        (2)LinkedList特点:查询效率低,增删改效率高【链表的形式去存储的】

2.2 ArrayList集合类

(1)实例化ArrayList对象

        //1、实例化集合对象
        ArrayList arrayList = new ArrayList();

(2)添加数据add()

        第一种:默认顺序添加数据

        //2、给集合添加数组
        arrayList.add(1);
        arrayList.add(true);
        arrayList.add("jojo");
        arrayList.add(23.4);

        第二种:通过角标添加数据 

        //第二种给集合添加数据
        arrayList.add(0,1);
        arrayList.add(1,true);
        arrayList.add(2,"jojo");

备注: 这里如果角标原来已经有元素会怎么样,会把这个角标占领,其余元素向后移

(3)删除数据remove()

第一种:通过角标删除数据(1代表角标)

            arrayList.remove(1);

第二种:通过值删除数据(“1”代表值不是角标)

            arrayList.remove("1");

备注:这里有的同学可能就有疑问,这里的集合不是可以存放任何元素吗,那么remove中的参数如何判断输入的整数是参数还是角标呢,比方说如果这里是12,而集合里没有角标12而有数字12,这里会不会把数字为12的元素删除呢?这里回答你不会,remove()对参数的识别是先角标后数据,而数字默认都是角标。

(4)查询数组

        第一种:传统for循环

        //3、查询数组中的集合信息【for循环】
        for (int i = 0 ; i < arrayList.size() ; i++){
            System.out.println(arrayList.get(i));
        }

         第二种:增强for循环

        //第二种获取集合中数据【foreach循环】
        for (Object o : arrayList){
            System.out.println(o);
        }

(5)拓展: 

        arrayList.size()是获取数组长度的方法

        arrayList.get(i)是获取数组每个元素值

 

2.3 ArrayList集合类(泛型)

        泛型:<>用指定集合存放数据类型,这里面放的必须是包装类型,比如基本类型int就不能放进去,会编译失败,得放int的包装类型Integer

(1) ArrayList存放String类型

        ArrayList<String>arrayList = new ArrayList<String>();
        arrayList.add("i'm ");
        arrayList.add("a ");
        arrayList.add("jojo");
        arrayList.add(2,"one");//通常不用这个添加方式

(2)ArrayList存放Integer类型

      //泛型中如果存放基本数据类型必须是包装类型,int的包装类型是Integer类型
       ArrayList<Integer>arrayList1 = new ArrayList<Integer>();

(3)ArrayList存放对象类型数据

public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
}
    public static void main(String[] args) {
        User user1 = new User(100,"jojo","jojo123");
        User user2 = new User(101,"小杰","xiaojie123");
        User user3 = new User(102,"奇呀","qiya123");
        User user4 = new User(103,"库洛洛","kuluoluo123");

        ArrayList<User> arrayList = new ArrayList<>();
        arrayList.add(user1);
        arrayList.add(user2);
        arrayList.add(user3);
        arrayList.add(user4);

        for (int i = 0 ; i < arrayList.size() ; i++){
            System.out.println("id:"+arrayList.get(i).getId()+"\t用户名:"+arrayList.get(i).getName()+"\t密码:"+arrayList.get(i).getPwd());
        }
    }

2.4 LinkedList集合类

(1) LinkedList存放Object类型数据

    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();

        linkedList.add("11");
        linkedList.add("jojo");
        linkedList.add("奇呀");

        for (int i = 0 ; i < linkedList.size() ; i++){
            System.out.println(linkedList.get(i));
        }
    }

 (2)LinkedList存放对象类型数据

        User user1 = new User(100,"jojo","jojo123");
        User user2 = new User(101,"小杰","xiaojie123");
        User user3 = new User(102,"奇呀","qiya123");
        User user4 = new User(103,"库洛洛","kuluoluo123");

        LinkedList<User> linkedList = new LinkedList<>();
        linkedList.add(user1);
        linkedList.add(user2);
        linkedList.add(user3);
        linkedList.add(user4);

(3)拓展

LinkedList的泛型和ArrayList的泛型含义一样,但多了一些它独有的方法

        //如果使用LinkedList中独有的方法addFirst(),linkedList.addLast(),removeFirst()等等
        //则不可以使用List<User> linkedList = new LinkedList();只能使用
        //LinkedList<User> linkedList = new LinkedList<>();
        linkedList.addFirst(user2);
        linkedList.addLast(user2);

 

3.Set接口

3.1 Set的添加数据以及遍历输出

    public static void main(String[] args) {
        Set set = new HashSet() ;
        set.add(1);
        set.add("hh");
        set.add(true);
        set.add(123);
        set.add("小杰");
        set.add("hh");

        //iterator迭代器
        Iterator its = set.iterator();
        while ((its.hasNext())){
            Object o = (Object) its.next();
            System.out.println();
        }
    }

核心要点1:iterator()获取迭代器对象

核心要点2:hasnext()判断是否有下一个值

核心要点3:next()获取下一个值

核心要点4:set集合是没有顺序的

核心要点5:sets集合不可存放重复的数据(去重)

3.2 Set  泛型  -String

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("小杰");
        set.add("库洛洛");
        set.add("西索");
        set.add("杰洛");

        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            Object o = (Object) iterator.next();
            System.out.println(o);
        }
    }

3.3 Set 泛型  -对象类型

    public static void main(String[] args) {
        User user1 = new User(100,"jojo","jojo123");
        User user2 = new User(101,"小杰","xiaojie123");
        User user3 = new User(102,"奇呀","qiya123");
        User user4 = new User(103,"库洛洛","kuluoluo123");

        Set<User> sets = new HashSet<>();
        sets.add(user1);
        sets.add(user2);
        sets.add(user3);
        sets.add(user4);

        Iterator<User> iterator = sets.iterator();
        while (iterator.hasNext()){
            User user = iterator.next();
            System.out.println("id:"+user.getId()+"\t用户名:"+user.getName()+"\t密码:"+user.getPwd());
        }
    }

4.Map接口

4.1 HashMap使用

(1)实例化HashMap

        //实例化HashMap对象
        Map map = new HashMap();

(2)给HashMap赋值

        //给HashMap对象添加值
        map.put("a", 1);
        map.put(true,231.1);
        map.put(99, "ok");

(3)遍历HashMap

        a)第一种

        Set set = map.keySet();//获取map集合中所有的key值
        System.out.println(set);

        //1、通过foreach-增强for循环获取所有key对应的value值
        for (Object o : set){
            System.out.printf(map.get(o)+"\t");//获取key对应的value值
        }

        b)第二种

        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            Object o = iterator.next();
            System.out.printf(o+"\t");
            System.out.println(map.get(o)+"\t");
        }

4.2 map  -泛型

public class Demo10 {
    public static void main(String[] args) {
        //实例化HashMap对象
        Map<String ,Object> map = new HashMap<>();

        //给HashMap对象添加值
        map.put("奇呀", 1);
        map.put("西索",231.1);
        map.put("小杰", true);

        Set<String> set = map.keySet();

        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String st = iterator.next();
            System.out.printf("key:"+st+"\t");
            System.out.println("value:"+map.get(st));
        }

    }
}

5. 综合训练

1.遍历List<Map<String,Object>>        (难度:中等)

public class Demo12 {
    public static void main(String[] args) {
        Map<String ,Object> map = new HashMap<>();
        map.put("奇呀", 1);
        map.put("西索",231.1);
        map.put("小杰", true);

        Map<String,Object> map0 = new HashMap<>();
        map0.put("团长", 234);
        map0.put("侠客",1.13);
        map0.put("武藏", false);

        List<Map<String ,Object>> list = new ArrayList<>();

        list.add(map);
        list.add(map0);
        for (Map<String ,Object> map1 : list){
            Set<String> set = map1.keySet();
            Iterator<String> iterator = set.iterator();
            while (iterator.hasNext()){
                String st = iterator.next();
                System.out.print("Key:"+st+"\t\t");
                System.out.println("Value:"+map1.get(st));
            }
            System.out.println("************************");
        }
    }

}

2.遍历List<List<String>>        (难度:简单)

public class Demo13 {
    public static void main(String[] args) {
        List<String>list = new ArrayList<>();
        list.add("jojo");
        list.add("小杰");
        List<String>list1 = new ArrayList<>();
        list1.add("jojo1");
        list1.add("奇呀");
        List<String>list2 = new ArrayList<>();
        list2.add("jojo2");
        list2.add("库洛洛");

        List<List<String>> lists = new ArrayList<>();
        lists.add(list);
        lists.add(list1);
        lists.add(list2);

        for (List<String> l1 : lists){
            for (String st : l1){
                System.out.println(st);
            }
            System.out.println("**************");
        }

    }
}

3.遍历Map<String,Map<String,Object>>        (难度:中等偏上)

public class Demo14 {
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        map.put("奇呀", 1);
        map.put("西索",231.1);
        map.put("小杰", true);
        Map<String,Object> map0 = new HashMap<>();
        map0.put("团长", 234);
        map0.put("侠客",1.13);
        map0.put("武藏", false);

        Map<String,Map<String,Object>> map1 = new HashMap<>();
        map1.put("ok",map);
        map1.put("jojo",map0);

        Set<String> set = map1.keySet();
        Iterator<String>iterator = set.iterator();
        while (iterator.hasNext()){
            String st = iterator.next();
            System.out.println("Key:"+st);
            System.out.println("Value:");

            Map<String,Object> mapOne = map1.get(st);
            Set<String> set1 = mapOne.keySet();
            Iterator<String>iterator1 = set1.iterator();
            while (iterator1.hasNext()){
                String st1 = iterator1.next();
                System.out.print("Key:"+st1+"\t");
                System.out.println("Value:"+mapOne.get(st1));
            }
            System.out.println("*********************");
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值