【7.28笔记】集合框架

一、了解Java集合框架体系结构

为什么使用集合框架
存储一个班级的学员信息,如果在我们不知道的情况下可以假定数组为100,但是这样的话会占用不必要的内存,这种数量小的还好,但是如果变成存储每天的新闻信息呢,每天的新闻数量是不确定的。这是其一,如果需要复杂的存储对象,需要存储两个数组,让课程和课程代码一一对应应该怎么办?
所以如果不知道程序运行是会需要多少对象,或者需要更复杂的存储对象——可以使用Java集合框架
Java集合框架包含的内容
在这里插入图片描述Collection接口存储一组不唯一,无序的对象
List接口存储一组不唯一,有序(插入顺序)的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射

二、List接口的实现类

ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高

LinkedList采用双向链表存储方式,插入, 删除元素是效率比较高

新闻管理系统:可以存储各类新闻标题(包含ID,名称,创建者),可以获取新闻标题的总数,可以逐条打印每条新闻的标题的名称

public class NewsMgr {
    public static void main(String[] args) {
        //创建新闻标题对象
        NewsTitle title1=new NewsTitle(1,"故宫","Author");
        NewsTitle title2=new NewsTitle(2,"兵马俑","Author");
        NewsTitle title3=new NewsTitle(3,"西湖","Author");
        NewsTitle title4=new NewsTitle(4,"黄鹤楼","Author");
        NewsTitle title5=new NewsTitle(5,"东方明珠","Author");
        //创建集合对象,并且将新闻标题加入到集合中
        ArrayList list=new ArrayList();
        list.add(title1);//等同于数组中的list[0]=title1;
        list.add(title2);
        list.add(title3);
        list.add(title4);
        list.add(title5);
        //获取新闻标题总数
        //ArrayList的size方法等同于数组的length属性的作用
        System.out.println("新闻标题一共有"+list.size()+"条");
        //逐条打印新闻标题名称
        //方法一:遍历ArraysList元素的位置(下标)
        for (int i = 0; i < list.size(); i++) {
            NewsTitle  title=(NewsTitle)list.get(i);
            System.out.println(title.getTitle() );
        }
        //方法二:增强for
        System.out.println("**************************");
        for(Object obj:list){
            NewsTitle  title=(NewsTitle)obj;
            System.out.println(title.getTitle());
        }
        //方法三:Iterator迭代器
        System.out.println("**************************");
        Iterator itr=list.iterator();
        while (itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

自带的一些方法:
ArrayList:
在这里插入图片描述
LinkedList:
在这里插入图片描述

list.add(news1);
        list.addLast(news2);
        list.addFirst(news3);
        list.add(news4);
        list.remove();//等同于removeFirst()
        list.element();//等同于getFirst()
        list.offer(1);//等同于add(1)
        list.peek();//等同于getFirst()如果当前为空,返回空
        list.poll();//弹出首元素,相当于removeFirst()
        list.pop();//等同于removeFirst()
        list.push("abc");//等同于addFirst()

三、Set接口

Set接口存储一组唯一,无序的对象
HashSet是Set接口常用的实现类
Set中存放对象的引用

public class TestSet {
    public static void main(String[] args) {
        HashSet set=new HashSet();
        set.add(1);
        set.add("abc");
        set.add("Hello");
        set.add(1);
        set.add("abc");
        set.add(2);
        set.add(3);
        set.add(6);
        set.add("abcd");
        System.out.println(set.size());
        if (set.contains("abc")){
            set.remove("abc");
        }
        System.out.println("*********************");
        for (Object o : set) {
            System.out.println(o);
        }
    }
}

在这里插入图片描述
1、set中存放的是无序,唯一的数据
2、set不可以通过下标获取对应位置的元素的值,因为无序的特点
3、使用treeset底层的实现是treemap,利用红黑树来进行实现
4、设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode的方法,如果没有,比较的是地址
5、树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话,需要自定义比较器
比较器分类:
内部比较器
定义在元素的类中,通过实现comparable接口来进行实现
外部比较器
定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集合中
注意:外部比较器可以定义成一个工具类,此时所有需要比较的规则如果一致的话,可以复用,而
内部比较器只有在存储当前对象的时候才可以使用
如果两者同时存在,使用外部比较器
当使用比较器的时候,不会调用equals方法

newList.sort(new Comparator(){
	public int compare(Object o1,Object o1){
		if(o1 instanceof News && o2 instanceof News){
			News n1=(News)o1;
			News n2=(News)o2;
			return n1.getNewsId()-n2.getNewsId();
		}
		return 0;
	}
});

晚安。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

youzi-qiu7

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

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

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

打赏作者

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

抵扣说明:

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

余额充值