JAVA---集合框架

数组和集合的对比

集合、数组都是对多个数据进行存储操作的结构,简称Java容器。

数组的特点

1.数组一旦初始化之后,数组的长度就不可变
2. 数组中提供的方法非常限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
3.获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
4.数组中的元素必须是有序的,可重复。但对于无序,不可重复的需求,不能满足。

集合的特点

解决了数组存储数据方面的弊端

Collection接口

在这里插入图片描述
java集合框架提供了一套性能优良,使用方便的接口和类,位于 java.util包下
Collection接口: 子接口List和子接口Set
Collection接口存储一组 不唯一 无序的对象

Collection接口的缺点

Collection 可重复造成空间的浪费 无序造成查询效率的降低

Collection提供的方法

1.public boolean add(E e) :把给定的对象添加到当前集合中
2.public void clear():清空集合中所有的元素。
3. public boolean remove(E e) : 把给定的对象在当前集合中删除。
4.public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
5. public boolean isEmpty() : 判断当前集合是否为空。
6.public int size() : 返回集合中元素的个数
7. public Object[] toArray() : 把集合中的元素,存储到数组中

Collections是一个集合框架的工具类,提供了一些集合操作的方法 而collection是一个根接口

List子接口
特点:

1.List接口中存储的元素不唯是可以重复的,按线性存储方式存储 集合中的每一个元素都带有一个索引值
2.但是List接口中的元素是有序的,即存入的顺序和取出的顺序一致。

List子接口 有序 可以重复

优点:

查询效率高 可按索引进行查找

缺点:

容易造成数据冗余

List接口的实现类ArrayList

在这里插入图片描述

ArrayList实现类的特点

1.ArrayList的存储结构是数组
2.ArrayList遍历和随机访问元素的效率是比较高的 查找快
3.但对数组的增加和删除效率慢

List接口提供的方法

 public class ArrayListTest {
    public static void main(String[] args) {
        //List接口的实现类:ArrayList
        //元素可以重复 但有序
        List arrayList=new ArrayList();
        //add():添加的个数 类型没有限制 因为没有泛型的限制
        //add方法 默认从下标0开始添加数据
        //add():添加的个数 类型没有限制
        //add方法 默认从下标0开始添加数据
        arrayList.add(1);//下标为0
        arrayList.add("abc");//下标为1
        //添加一个对象
        arrayList.add(new Student());
        //按下标向集合中添加元素
         //跟数组不同的是 数组会覆盖原数据 但是arrayList可以向后自动移动
           //原先下标为1的元素自动向后移动 形成连续的空间
            arrayList.add(1,"123");
         //get(索引值) 得到集合中对应索引的指定元素
        System.out.println(arrayList.get(1));//123
        //输出集合的大小
        System.out.println(arrayList.size());   
        //删除元素remove() 可以指定下标 删除整数一般用下标删除
        arrayList.remove(0);
        //下标为1的元素会自动往前做补充 保证空间的连续性
       System.out.println(arrayList.get(0));//123
        //remove()根据确定的值删除
        arrayList.remove("123");
        System.out.println(arrayList.get(0));//abc
        // arrayList.remove(new Student());是错误的 是两个不同的对象
        
        //正确做法
        Student student=new Student();
        arrayList.add(student);
        arrayList.remove(student);
       
       //集合的遍历
       //for循环 size()获取集合的大小
        for(int i=0;i<arrayList.size();i++){
            System.out.println(arrayList.get(i));
        }
        System.out.println("===============");
        // 增强for循环
        //没有泛型的限制 所以用Object 表示可以存储任意数据类型
        //for(数据类型 对象名:要遍历的集合名称)
        for (Object list:arrayList
             ) {
            System.out.println(list);
        }
    }
}

remove()方法 把给定的对象在当前集合中删除。

List的另一个实现类LinkedList

LinkedList的存储结构是链表 插入和删除元素的效率高
在这里插入图片描述
1.public void addFirst(E e) :将指定元素插入此列表的开头。
2.public void addLast(E e) :将指定元素添加到此列表的结尾。
3.public E getFirst() :返回此列表的第一个元素。
4.public E getLast() :返回此列表的最后一个元素。
5.public E removeFirst() :移除并返回此列表的第一个元素。
6.public E removeLast() :移除并返回此列表的最后一个元素。
7.public E pop() :从此列表所表示的堆栈处弹出一个元素。
8.public void push(E e) :将元素推入此列表所表示的堆栈。
9.public boolean isEmpty() :如果列表不包含元素,则返回true。
除可以使用List提供的方法外 由于存储结构是链表 所以有一些新的方法:

public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList linkedList=new LinkedList();
        linkedList.add("abcdef");
        //addFirst() 往链表头部添加数据(数据类型任意 没有泛型的限制)
        linkedList.addFirst("abc");
        //addLast() 往链表尾部添加数据
        linkedList.addLast("abcd");
        //在尾部再添加一个数据
        linkedList.add("abcdefgh");
        //遍历
        for (Object object:linkedList){
            System.out.println(object);//abc abcdef  abcd abcdefgh
        }
         //删除元素 remove
        //removeFirst() 删除链表头部数据
        linkedList.removeFirst();
        System.out.println("=================");
        for (Object object:linkedList){
            System.out.println(object);//abcdef  abcd abcdefgh
        }
        linkedList.removeLast();
        System.out.println("=================");
        for (Object object:linkedList){
            System.out.println(object);//abcdef  abcd
        }
    }
}
Set子接口

Set接口存储一组唯一的,无序的对象 (无序 数据不可重复)
HashSet是Set接口的常用实现类
Set接口中存放对象的引用(也就是地址)

HashSet实现类

public class HashSetTest {
    public static void main(String[] args) {
        Set set=new HashSet();
        String s1=new String("java");
        String s2=s1;//s1和s2指向同一个地址 所以值相同 只是对象名不同
        String s3=new String("JAVA");
        set.add(s1);
        set.add(s2);//添加不进去
        set.add(s3);
        //因为Set接口无序 但是元素不可重复 所以s2没有添加进去
        System.out.println(set.size());//2
    }
}
public class HashSetTest {
    public static void main(String[] args) {
        Set set=new HashSet();
        String s1=new String("java");
        String s2=s1;//s1和s2指向同一个地址 所以值相同 只是对象名不同
        String s3=new String("java");
        set.add(s1);
        set.add(s2);//添加不进去
        set.add(s3);//添加不进去
        //因为Set接口无序 但是元素不可重复 所以s2,s3没有添加进去
        System.out.println(set.size());//1
    }
}
public class HashSetTest {
    public static void main(String[] args) {
        Set set=new HashSet();
        String s1=new String("java");
        String s2=s1;//s1和s2指向同一个地址 所以值相同 只是对象名不同
        String s3=new String("JAVA");
        set.add(s1);
        set.add(s2);//添加不进去
        set.add(s3);
        //因为Set接口无序 但是元素不可重复 所以s2没有添加进去
        System.out.println(set.size());//2
        //使用equals()方法判断该数据是否已经存在在set集和中
        boolean b=s1.equals(s2);
        System.out.println(b);//true
        //添加一个布尔型的值
        set.add(true);
        //添加一个整数值
        set.add(1);
        //添加一个对象
        Student student=new Student();
        set.add(student);
      **//因为Set接口无序 所以不能按照下标添加数据**
    
    //size() 表示set集和的大小 千万记住重复的值不算进size()中
         System.out.println(set.size());//5

      //remove()删除元素 不能根据下标删除 只能根据具体的值删除
        set.remove(student);
        
        //set集合的遍历 迭代器遍历 iterator() 返回值类型是一个迭代器
        System.out.println("===========");
       Iterator iterator= set.iterator();
       //hasNext() 表示查找set集合中有没有下一个数据 返回值为true或者false
       while(iterator.hasNext()){
           //没有泛型的限制 所以用Object
           Object object=iterator.next();//获取到set集合中的单个数据
           System.out.println(object);//输出的结果是无序的
       }
       //从set集合当中获取单个数据是没有get()方法的 不能根据下标找值 因为set集和无序

//从set当中查找指定的值 JAVA
        Iterator i=set.iterator();
        while(i.hasNext()){
            Object object=i.next();
            if(object.equals("JAVA")){  //sb 这用equals()比较 想啥呢
                System.out.println(object);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李自桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值