Java基础(集合)

1 集合概述

集合就是java为我们存放对象提供的容器,集合长度不固定,可以存放不同类型数据。
集合有两个根接口,分别是Collection接口和Map接口。Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。下图是集合体系图。


集合体系图

2 Collection 接口

  • Collecton接口常用的子接口有:List接口、Set接口
  • List接口常用的子类有:ArrayList类、LinkedList类
  • Set接口常用的子类有:HashSet类,LinkedHashSet类

list 接口

list存储数据有两种数据结构,数组结构和链表结构。
数组结构:通过索引找到数据真正存储地址,直接访问元素,访问速度非常快。查询快,增删慢。ArrayList集合就是使用数组结构的list集合查询速度快。
链表结构:不能直接查出元素地址,需要通过一个元素推导下一个元素地址,查询速度慢,增删快。LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

set 接口

set集合通过元素的equals方法,来判断是否为重复元素,它是个不包含重复元素的集合。HashSet、LinkedHashSet是常用的两个set集合。

HashSet

HashSet集合存储数据的结构(哈希表)。哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。

3 Map 接口

Map接口集合主要使用HashMap集合、LinkedHashMap集合。

  • HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
  • LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
  • 注意:Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数据类型可以相同,也可以不同。

HashMap Demo

练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。
注意,学生姓名相同并且年龄相同视为同一名学生。

  • 学生类
public class Student {
    private String name;
    private int age;

    //编写构造方法,文档中已省略
    //编写get,set方法,文档中已省略
    //编写toString方法,文档中已省略
}
  • 测试类
public class HashMapTest {
    public static void main(String[] args) {
        //1,创建hashmap集合对象。
        Map map = new HashMap();
        
        //2,添加元素。
        map.put(new Student("lisi",28), "上海");
        map.put(new Student("wangwu",22), "北京");
        map.put(new Student("zhaoliu",24), "成都");
        map.put(new Student("zhouqi",25), "广州");
        map.put(new Student("wangwu",22), "南京");
        
        //3,取出元素。键找值方式
        Set keySet = map.keySet();
        for(Student key : keySet){
            String value = map.get(key);
            System.out.println(key.toString()+"....."+value);
        }
        
        //取出元素。键值对方式
        Set> entrySet = map.entrySet();
        for (Map.Entry entry : entrySet) {
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key.toString()+"....."+value);
        }
    }
}

LinkedHashMap Demo

引入:知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?
在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

public class LinkedHashMapDmeo {
  public static void main(String[] args) {
      
      LinkedHashMap map = new LinkedHashMap();
      
      map.put("邓超", "孙俪");
      map.put("李晨", "范冰冰");
      map.put("cyy", "新垣结衣");
      
      Set> entrySet = map.entrySet();
      
      for (Entry entry : entrySet) {
        System.out.println(entry.getKey()+"  "+entry.getValue());
       }
  }
}
结果:
邓超  孙俪
李晨  范冰冰
cyy  新垣结衣

你可能感兴趣的:(Java基础(集合))