集合

2019-03-04  本文已影响0人  想吃热干面了

在Java中, 用数组保存数据时会有一些问题?比如,数组的长度无法改变,在定义时就设定好了,这时候我们就要用到集合:

集合是什么:Java集合类存放于 java.util 包中,是一个用来存放对象的容器。存放的引用数据类型的引用,即内存地址

注意:1、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
     2、集合存放的是多个对象的引用,对象本身还是放在堆内存中。
     3、集合可以存放不同类型,不限数量的数据类型。

在Java中,我们常用的集合有三种:

1.List<E>集合
2.Set<E>集合
3Map<K,V>集合
其中List和Set都继承了Collection接口,Map没有继承和实现其余接口或者类
collections类中封装了一些集合用到的方法

List<E>集合:是一个有序可重复的集合,根据存储的顺序指定索引(从0开始)

继承了collection<E>,Iterable<E>接口
实现类:ArrayList(速度快,线程不安全);vector(速度慢,线程安全)   
添加元素的方法:list.add()
获取元素的方法:list.get()
移除元素的方法:list.remove()
获取集合长度:list.size()
可以存放null;但无意义
Person p1 = new Person();
    p1.setId(100);
    p1.setName("jazz");
    p1.setAge(10);
Person p2 = new Person();
    p2.setId(200);
    p2.setName("jazz2");
    p2.setAge(20);
List<Person> list = new ArrayList<>();
    list.add(1);
    list.add("tom");
    list.add(3.14);
    list.add(p1);
    list.add(p2);
List<E>集合的遍历:有三种方法
1.简单的for循环
for(int i = 0;i<list.size();i++){
    Person person = list.get(i);
    System.out.println(person.getId()+"---"+person.getName());
 }
2.foreach循环
for (Person person : list) {
    System.out.println(person.getId()+"---"+person.getName());
}
 3.使用Iterable<E>接口的iterator()方法,迭代器(也是一种设计模式)
 Iterator<Person> it = list.iterator();
    while (it.hasNext()) {
    //需要獲取對象
    Person pp = it.next();
    System.out.println(pp.getId()+"---"+pp.getName());
}

Set<E>集合:一个不包含重复元素集合

继承了collection<E>,Iterable<E>接口
常用实现类:
HashSet:无序;不可重复。线程不安全,存取速度快,底层实现是一个HashMap(保存数据),实现Set接口
TreeSet:有序;不可重复,底层使用 红黑树算法,擅长于范围查询
添加操作同list集合,只能用迭代器方法来进行遍历,因为无序
public class SetDemo {
public static void main(String[] args) {
        Person p1 = new Person();
        p1.setId(100);
        p1.setName("jazz");
        p1.setAge(10);
        Person p2 = new Person();
        p2.setId(200);
        p2.setName("jazz2");
        p2.setAge(20);
        Person p3 = new Person();
        p3.setId(300);
        p3.setName("jazz3");
        p3.setAge(30);  
    //1.创建了集合Set
    Set<Person> set = new HashSet<>();
    //2.向Set集合中添加元素
    set.add(p1);
    set.add(p2);
    set.add(p3);
    //3.如何从Set集合中获取元素
    Iterator<Person> iterator = set.iterator();
    while(iterator.hasNext()) {
        Person p = iterator.next();
        System.out.println(p.getId()+"---"+p.getName());
    }
    Set<Integer> set = new TreeSet<>();//有序的集合
    set.add(23);
    set.add(13);
    set.add(1);
    set.add(2);
    set.add(7);
    set.add(5);
    Iterator<Integer> iterator = set.iterator();
    while(iterator.hasNext()) {
        Integer p = iterator.next();
        System.out.println(p);
    }
    
}
}

Map<K,V>集合:根据键-值对来保存数据,可以快速的根据键取出想要的值。将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射到一个值(键唯一)

在Map集合中,使用put("key","value")来保存数据
获取数据用get(key)方法
常用实现类HashMap、Hashtable、TreeMap

HashMap:允许空值做键,速度快,线程不安全
Hashtable:不允许空值做键,速度慢、线程安全

遍历:自己没有遍历的方法,提供了一个方法,将map集合转换为set集合,再进行迭代
public class MapDemo {
public static void main(String[] args) {
    Person p1 = new Person();
    p1.setId(100);
    p1.setName("jazz");
    p1.setAge(10);
    
    Person p2 = new Person();
    p2.setId(200);
    p2.setName("jazz2");
    p2.setAge(20);
    
    Person p3 = new Person();
    p3.setId(300);
    p3.setName("jazz3");
    p3.setAge(30);
    
    //1.创建Map集合
    Map<String, Person> maps = new HashMap<>();
    //2.向Map集合中添加对象
    maps.put("p1", p1);
    maps.put("p2", p2);
    maps.put("p3", p3);
    
    //3.从集合中获取到某一个对象
    Person person = maps.get("p2");
    System.out.println(person.getName());
    
    System.out.println("-------------------------------------------------------");
    //4.如何对Map进行遍历操作Entry<String, Person>相当于Map集合
    Set<Entry<String, Person>> set = maps.entrySet();
    Iterator<Entry<String, Person>> iterator = set.iterator();
    while(iterator.hasNext()) {
        //从迭代器中获取Map集合
        Entry<String, Person>  entry = iterator.next();
        String key = entry.getKey();
        Person person2 = entry.getValue();
        System.out.println(key+"-----"+person2.getName());
    }
    System.out.println("-------------------------------------------------------");
}
}

三种集合对比来说,list和map用的比较多,其中map能更快速的取到想要的指定对象。list和set有一个父接口,list可以存放重复数据,有序的集合;set不可以存放重复数据,无序的集合(没有索引)。map键值对来排序,也是无序的。

泛型<E>:泛型是一種未知的類型,與方法的傳參是一樣的 作用:可以約束集合中元素的類型
上一篇下一篇

猜你喜欢

热点阅读