Java之集合

1、集合概述

  • Java中的集合就像是一个容器,专门来存储Java对象,这些对象可以是任意的数据类型,长度可变,集合按照其储存结构可以分为俩大类,即单列集合Collection和双列集合Map

  • Collection:单列集合的根接口,用来存储一系列符合某种规则的元素。Collection有俩个重要的子接口,分别是Set和List。其中Set接口的特点是无序并且不可重复,List接口的特点是有序可重复。List的主要实现类有ArrayList和LinkedList;Set接口的主要实现类是HashSet和TreeSet
  • Map:双列集合的根接口,用于存储KV键值对,在Map存储的元素中,每个元素都有一个K,并且K是唯一的,可以通过指定的K来找到对应的V。Map的主要实现类是HashMap和TreeMap

  • 用一张图来描述集合的核心继承体系
    在这里插入图片描述

2、 Collection接口

  • Collection是所有单例集合的根接口,因此Collection中定义了一些通用方法,这些方法可用于操作所有的单列集合

在这里插入图片描述

3、 List接口

3.1List接口简介

  • List是单列集合的一个重要分支,在List集合中允许出现重复的元素,可以通过索引来访问指定的元素,List集合还有一个特点就是,有序的,即存入顺序和去出顺序一致,List作为Collection的子接口,不仅继承了他的全部方法,还有一些自己独有的方法

在这里插入图片描述

3.2ArrayList集合

  • ArrayList是List接口的一个实现类,在ArrayList类封装了一个长度可变的数组对象,当存入的元素超过数组的长度时,ArrayList会自动生成一个更大的数组来存储元素,因此,可以将ArrayList看作是一个长度可变的数组对象,正因为ArrayList的底层是数组,所以他的增删效率低,但是查找的效率高

  • ArrayList存取元素
public class ArrayListTest {
    public static void main(String[] args) {
        //创建ArrayList集合
        List list = new ArrayList();
        //添加元素
        list.add("a");
        list.add("b");
        list.add(3);
        System.out.println("ArrayList集合的长度是:"+list.size());
        System.out.println("ArrayList集合的第二个元素是:"+list.get(1));
    }
}

3.3LinkedList集合

  • ArrayList的增删效率较低,为了克服这种局限性,可以使用List的另一个实现类LinkedList,他的底层是一个双向链表,链表中的每一个元素都有引用指向它的前一个和后一个元素,当要对元素进行修改时,只需要更改元素之间的引用关系就好了,大大提高了增删的效率

  • LinkedList的常用方法
    在这里插入图片描述
    在这里插入图片描述

  • 对LinkedList的增删操作
import java.util.LinkedList;

public class LinkedListTest {
    public static void main(String[] args) {
        //创建一个LinkedList集合
        LinkedList list = new LinkedList();
        //增加元素
        list.add(1);
        list.add("2");
        //输出集合中的元素
        System.out.println(list);
        //向集合尾部添加元素
        list.offer("offer");
        //向头部添加元素
        list.push("push");
        //输出元素
        System.out.println(list);
        //获取第一个元素
        Object obj = list.peek();
        //输出元素
        System.out.println(obj);
        //删除第一个元素
        list.removeFirst();
        list.pollLast();
        //删除最后一个元素
    }
}

4、Collection集合遍历

  • 在开发中增删改查并不能满足,还需要学习集合的遍历

4.1Iterator遍历集合

  • Iterator和Collection、Map不同,后俩者主要是用来存储元素,而前者主要是用来遍历元素的,因此他被称为迭代器

import java.util.ArrayList;
import java.util.Iterator;

public class IteratorTest {
    public static void main(String[] args) {
        //1、创建集合并且添加元素
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add("3");
        arrayList.add("4");

        //获取Iterator对象
        Iterator it = arrayList.iterator();
        //判断是否有下一个元素的存在
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

4.2foreach遍历集合

import java.util.ArrayList;

public class foreachTest {
    public static void main(String[] args) {
        //1、创建集合并且添加元素
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add("3");
        arrayList.add("4");
        //遍历
        for (Object obj : arrayList){
            System.out.println(obj);
        }
    }
}

5、Set接口

5.1Set接口简介

  • Set继承自Collection接口,他并没有功能上的扩充,只是比Collection更加的严格。Set接口中的元素无序并且不可重复

5.2HashSet集合


  • HashSet是Set接口的一个实现类,他存储的元素是不可重复的,并且也是无序的
public class HashSetTest {
    public static void main(String[] args) {
        //创建HashSet并且添加元素
        HashSet hashSet = new HashSet();
        hashSet.add("JACK");
        hashSet.add("king");
        hashSet.add("Rose");
        //遍历集合
        Iterator iterator = hashSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
  • 输出结果
king
Rose
JACK

  • 向HashSet存入自定义的Student类,并且规定id和姓名一样即为相同元素
import java.util.HashSet;
import java.util.Objects;

public class HashSetTest02 {
    public static void main(String[] args) {
        Students stu1 = new Students("1","KING");
        Students stu2 = new Students("1","ROSE");
        Students stu3 = new Students("2","ROSE");
        Students stu4 = new Students("2","ROSE");
        HashSet hashSet = new HashSet();
        hashSet.add(stu1);
        hashSet.add(stu2);
        hashSet.add(stu3);
        hashSet.add(stu4);
        System.out.println(hashSet);
    }
}
class Students{
    String id;
    String name;
    public Students(String id,String name){
        this.name = name;
        this.id = id;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Students{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
    //重写equals方法,规定id和姓名全一样才为重复数据
    public boolean equals(Object obj){
        if (this==obj){
            return true;
        }
        if (!(obj instanceof Students)){
            return false;
        }
        Students students =(Students)obj;
        boolean b = (this.id.equals(students.id)&&this.name.equals(students.name));
        return b;
    }
    //重写HashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
  • 结果是
[Students{id='1', name='KING'}, Students{id='1', name='ROSE'}, Students{id='2', name='ROSE'}]

5.3TreeSet集合


  • TreeSet他的内部是用二叉树来存储数据的,这样的结构不仅保证了没有重复的数据,而且还有一定的顺序。二叉树就是每个节点最多有俩个节点的有序树,并且他的左子树上的元素小于他的根节点,右子树上的元素大于他的根节点
    在这里插入图片描述

  • 用于TreeSet存储元素的特殊性,它有一些特殊的方法
    在这里插入图片描述

import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        //创建TreeSet集合
        TreeSet treeSet = new TreeSet();
        //添加元素
        treeSet.add(3);
        treeSet.add(7);
        treeSet.add(9);
        treeSet.add(11);
        System.out.println("创建的TreeSet集合为:"+treeSet);
        //获取首尾元素
        System.out.println("TreeSet的首元素是:"+treeSet.first());
        System.out.println("TreeSet的尾元素是:"+treeSet.last());
        //比较并且获取元素
        System.out.println("获取集合中小于或等于8的最大的一个元素:"+treeSet.floor(8));
        System.out.println("获取集合中大于10的最小的一个元素:"+treeSet.higher(10));
        //元素的删除
        //删除第一个元素
        treeSet.pollFirst();
    }
}

6、Map接口

6.1Map接口简介


  • Map接口是一种双列集合,他的每个元素都包含一个KV键值对,K和V之间存在一种对应关系。Map中的映射关系是一一对应的。可以通过key来找到V
  • Map集合中常用方法
    在这里插入图片描述
    在这里插入图片描述

6.2HashMap

  • HashMap是Map接口的一个实现类,该集合的键值对允许为空,但键不可以重复,并且集合中的元素是无序的。HashMap的底层是哈希表组成的
public class HashMapTest {
    public static void main(String[] args) {
        //创建HashMap
        HashMap map = new HashMap();
        //添加元素
        map.put("1","Jack");
        map.put("2","King");
        map.put("3","Rose");
        map.put("1","Lucy");
        map.put("2","Tom");
        System.out.println(map);
        //查看键对象是否存在
        System.out.println(map.containsKey("1"));
        //获取指定key的值
        System.out.println(map.get("2"));
        //获取集合中的键对象和值对象
        System.out.println(map.keySet());
        System.out.println(map.values());
        //替换对象
        map.replace("3","Mike");
        //删除指定k的值
        map.remove("2");
    }
}

6.3Map集合遍历

  • 使用Iterator迭代器遍历Map集合,需要先将Map集合转换成Iterator对象,任何进行遍历,由于Map集合是由键值对组成的,所以有俩中将Map转换成Iterotor的方法,即keySet()方法和entrySet()方法

  • keySet方法是先获得所有的键,任何获取值
public class IteratorKeySetTest {
    public static void main(String[] args) {
        //创建HashMap
        HashMap map = new HashMap();
        //添加元素
        map.put("1","Jack");
        map.put("2","King");
        map.put("3","Rose");
        map.put("4","Lucy");
        map.put("5","Tom");
        //获取键的集合
        Set set = map.keySet();
        //迭代器
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            Object key = iterator.next();
            Object value =map.get(key);
            System.out.println(key+":"+value);
        }
    }
}
  • 使用entrySet方法来迭代
public class IteratorEntryTest {
   public static void main(String[] args) {
       //创建HashMap
       HashMap map = new HashMap();
       //添加元素
       map.put("1","Jack");
       map.put("2","King");
       map.put("3","Rose");
       map.put("4","Lucy");
       map.put("5","Tom");
       Set entrySet = map.entrySet();
       Iterator iterator = entrySet.iterator();
       while (iterator.hasNext()){
           Map.Entry entry = (Map.Entry)(iterator.next());
           Object key = entry.getKey();
           Object value = entry.getValue();
           System.out.println(key+":"+value);
       }
   }
}

6.4TreeMap


  • TreeSet也是用来存储简直映射关系的,并且不允许出现重复的值,并且按一定的规程排序
public class TreeMapTest {
    public static void main(String[] args) {
        Map map = new TreeMap();
        map.put("1","Jack");
        map.put("2","King");
        map.put("3","Rose");
        map.put("4","Lucy");
        map.put("5","Tom");
        System.out.println(map);
    }
}
  • 运行结果
{1=Jack, 2=King, 3=Rose, 4=Lucy, 5=Tom}

6.5Properties集合

  • Properties是键值对都是Strinf类型的集合,一般用于存储属性,因此也称为属性集合
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class PropertiesTest {
    public static void main(String[] args) throws IOException {
        //通过Properties进行属性文件的读取操作
        Properties properties = new Properties();
        //加载文件
        properties.load(new FileInputStream("test.properties"));
        //遍历
        Set entrySet = properties.entrySet();
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) (iterator.next());
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println(key + "=" + value);
        }
        //写入操作
        FileOutputStream fileOutputStream = new FileOutputStream("test.properties");
        properties.setProperty("password", "123");
        properties.store(fileOutputStream,"新增密码");
    }
}

7、泛型

  • 泛型就是设置在一个集合里只存储一种类型的数据
//具体格式
ArrayList<参数类型>list = new ArrayList<参数类型>();
import java.util.ArrayList;

public class 泛型 {
    public static void main(String[] args) {
        //创建ArrayList类型的集合,并且设置只可以存储String类型\
        ArrayList<String>list = new ArrayList<>();
        list.add("String");
        list.add("Collection");
        for (String s:list){
            System.out.println(s);
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值