为什么使用集合框架?----1.初识集合框架:List接口带你入门

一、问题

1.存储一个班学员信息,假定一个班容纳20名学员
在这里插入图片描述
以之前所学的一位数组思想我们可能这样创建数组,假设类名为Student:

Student[]  stus = new Student[20]; 

2.那如何存储每天的新闻信息呢?
猜想方法1:采用二维数组:第一维存放新闻标题,第二维存放新闻对象
猜想方法2:用String[]存放标题,String[]存放新闻内容(两数组长度一样),再让两个数组关联(怎么关联?,求解)
猜想方法3: 先创建新闻类News,再建立数组News[] a = new News[?];(?的不确定体现了了新闻数量随机,从而可能导致一个问题出现,即长度太短浪费空间,太多空间不足)
3.如何存储一个课程的代码与课程信息,能够通过代码方便地获得课程信息?
在这里插入图片描述
综上问题1可以由简单的创建数组的方式解决,而问题2和问题3的复杂数据存储问题就引发了一个办法:
如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象–可以使用 java集合框架
那么集合框架又是什么呢? 细看下文==>

二、Java集合框架包含的内容

Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中,即集合框架就是接口和类(注:util包属于java的工具包)

在这里插入图片描述【注:虚线框指的是接口,实线框指的是类,右下方的类时工具类提供以上接口和类的方法,空白箭头指的是继承关系,实线箭头无继承关系指的是派生意义,该图需要特意记忆
在这里插入图片描述
Collection接口存储一组不唯一、无序的对象
List接口存储一组不唯一、有序( 插入顺序)的对象
在这里插入图片描述
Set接口存储一组唯一、无序的对象
在这里插入图片描述
Map接口存储一组键值对象,提供key和value的映射
在这里插入图片描述

三、List接口的实现类

在这里插入图片描述
ArrayList 实现了 长度可变的数组在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
在这里插入图片描述
LinkedList 采用 链表 存储方式插入、删除元素时效率比较高

在这里插入图片描述

ArrayList集合类

问题: 新闻管理系统,需求如下:
1.可以存储各类新闻标题(包含ID、名称、创建者)
2.可以获取新闻标题的总数
3.可以逐条打印每条新闻标题的名称<遍历=>ArrayList>
分析:
在这里插入图片描述
在这里插入图片描述
确定存储方式
1.ArrayList类时List接口的一个具体实现类
2.ArrayList对象实现了可变大小的数组
3.随机访问和遍历元素时,他提供更好的性能
确定存储对象
1.创建类型:新闻标题
2.包含属性:ID、名称、创建者
具体实现

	package com.lch.Collection;

	//新闻标题类
	public class NewsTitle {
		//ID  新闻题目  作者
		private int id;  //ID
		private String title;  //新闻标题
		private String author;  //作者
		public NewsTitle(){
		
	}
	public NewsTitle(int id, String title,String author) {
		super();
		this.id = id;
		this.author = author;
		this.title = title;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	
}

下面展示一些 内联代码片

package com.lch.Collection;
	
	import java.util.ArrayList;
	
	//新闻管理系统
	public class ArrayListDemo {
		public static void main(String[] args) {
			//集合存储多条新闻标题
			NewsTitle title1 = new NewsTitle(1,"中国天晴了1","admin");
			NewsTitle title2 = new NewsTitle(2,"中国天晴了2","admin");
			NewsTitle title3 = new NewsTitle(3,"中国天晴了3","admin");
			NewsTitle title4 = new NewsTitle(4,"中国天晴了4","admin");
			NewsTitle title5 = new NewsTitle(5,"中国天晴了5","admin");
			
			ArrayList list = new ArrayList();
			list.add(title1);  //add()指的是将集合加到某个元素里
			list.add(title2);
			list.add(title3);
			list.add(title4);
			//list.add(1, title5);   //void add(int index,Object o)指的是插队数据
			System.out.println("输出结果:");
			System.out.println("新闻标题的总数:"+list.size());  //size指的是集合的长度
			
			//遍历list,取出每条新闻标题的题目
			for(int i=0;i<list.size();i++){
				NewsTitle title = (NewsTitle)list.get(i);  //get(Object)指的是取出相应位置的元素
				
				System.out.println(title.getTitle());
			}
			System.out.println("*******************************");
			for(Object obj : list){    //增强型的for  ,因为对象list里面现在向里边加的都是Object
				NewsTitle title = (NewsTitle)obj;
				System.out.println(title.getId()+"  "+title.getTitle()+"  "+title.getAuthor());
			}			
		}
	}


	输出结果:
	新闻标题的总数:4
	中国天晴了1
	中国天晴了2
	中国天晴了3
	中国天晴了4
	*******************************
	1  中国天晴了1  admin
	2  中国天晴了2  admin
	3  中国天晴了3  admin
	4  中国天晴了4  admin

ArrayList常用方法

在这里插入图片描述
【注:详细方法请查看jdk的帮助文档
除了以上所有红颜色方法为Collection接口常用通用方法外,还有clear()、isEmpty()、iterator、toArray(),且由于这些方法都在Collection接口中,故这些方法List和Set接口都有且都可以使用

使用void add(int index,Object o);来插入title5数据

list.add(1, title5);   //void add(int index,Object o)指的是插队数据

输出结果:
新闻标题的总数:5
中国天晴了1
中国天晴了5
中国天晴了2
中国天晴了3
中国天晴了4
*******************************
1  中国天晴了1  admin
5  中国天晴了5  admin
2  中国天晴了2  admin
3  中国天晴了3  admin
4  中国天晴了4  admin

其他方法展示

		System.out.println("*******************************");
	System.out.println(list.contains(title1));  //contains指的是是否包含
	list.remove(title1);   //remove指的是移除
	System.out.println(list.contains(title1));
	list.remove(2);  //remove(int index)指的是从列表中删除指定位置元素,起始索引位置从0开始
	System.out.println(list.contains(title3));
	System.out.println("*******************************");
	list.clear();  //清空集合数据
	System.out.println(list.size());
	System.out.println(list.isEmpty());  //list.isEmpty判断集合是不是空的,true为空
	System.out.println(list.iterator());  //返回集合迭代器,请参考Set章节
	System.out.println(list.toArray());  //把一个集合变成一个序列

输出结果:
*******************************
true
false
false
*******************************
0
true
java.util.ArrayList$Itr@7de26db8
[Ljava.lang.Object;@1175e2db

证明ArrayList插入效率不高,调试list.add()
在这里插入图片描述
图片黄色部分,是插入了一条信息title5在第0位置上,1-4位置都受到了影响


LinkedList集合类

LinkedList类是List接口的链接列表实现类。它支持实现所有List接口可选的列表的操作,并且允许元素值是任何数据,包括null。
LinkedList类采用链表存储方式存储数据,如图所示,优点在于插入、删除元素时效率比较高,但是LinkedList类的查找效率很低。
在这里插入图片描述
问题: 新闻管理系统,需求如下:
1.可以添加头条新闻标题
2.获取头条和最末条新闻标题
3.可以删除末条新闻标题
关于LinkedList插入、删除元素更高效的说法,一幅图是最容易说明问题的:
在这里插入图片描述
分析:
在这里插入图片描述
确定存储方式
1.LinkedList 类是List接口的一个具体实现类
2.LinkedList类用于创建链表数据结构
3.插入或者删除元素时,它提供更好的功能
具体实现

	package com.lch.Collection;

	import java.util.LinkedList;
	import java.util.List;
	
	public class LinkedListDemo {
		public static void main(String[] args){
			//集合存储多条新闻标题
			NewsTitle title1 = new NewsTitle(1,"中国天晴了1","admin");
			NewsTitle title2 = new NewsTitle(2,"中国天晴了2","admin");
			NewsTitle title3 = new NewsTitle(3,"中国天晴了3","admin");
			NewsTitle title4 = new NewsTitle(4,"中国天晴了4","admin");
			NewsTitle title5 = new NewsTitle(5,"中国天晴了5","admin");
			NewsTitle title6 = new NewsTitle(6,"中国天晴了6","admin");
			NewsTitle title7 = new NewsTitle(7,"中国天晴了7","admin");
			
	//		List list = new LinkedList();  //这样声明,无法使用LinkedList独有的方法
			LinkedList list = new LinkedList();
			list.add(title1);
			list.add(title2);
			list.add(title3);
			list.add(1,title4);
			list.addFirst(title5);//列表最头上      ,若是使用父类创建对象List list = new LinkedList();,则addFirst  addLast指定性方法报错,是由于这些方法为子类独有的方法
			list.addLast(title6);//当前列表列表最末尾,当前列表指的是前边的兄弟从上往下运行的顺序列表:51423
			list.add(title7);
	//		System.out.println(list.size());
		
		for(int i=0;i<list.size();i++){
			NewsTitle title = (NewsTitle)list.get(i);
			System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
		}
		System.out.println("********************");
		for(Object  obj  :  list){
			NewsTitle title = (NewsTitle)obj;
			System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
		}
		System.out.println("********************");
		list.removeFirst();  //清除最头上的数据
		for(Object  obj  :  list){
			NewsTitle title = (NewsTitle)obj;
			System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
		}
		System.out.println("********************");
		list.removeLast();  //清除列表最末尾的数据
		for(Object  obj  :  list){
			NewsTitle title = (NewsTitle)obj;
			System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
		} 
		System.out.println("********************");
			NewsTitle firstNews = (NewsTitle)list.getFirst();  //列表第一条信息,相当于		for(int j =0;j<1;j=0){
	//		NewsTitle title = (NewsTitle)list.get(j);
	//		System.out.println("头条新闻标题:"+title.getTitle());
	//		break;
	//	}
			System.out.println("头条新闻标题:"+firstNews.getTitle());
			NewsTitle lastNews = (NewsTitle)list.getLast();  //列表末条信息,在至此的表格相当于System.out.println("末条新闻标题"+title6.getTitle());
			System.out.println("末条新闻标题:"+lastNews.getTitle());
	
			
		}
	}

LinkedList常用方法

在这里插入图片描述
【注:详细请见帮助文档,并在此声明以上方法及ArrayList与LinkedList独有方法与以父类List声明的ArrayList与LinkedList的实操在上面代码中体现,请留意区别】

证:LinkedList为什么比ArrayList的插入删除更高效
代码为:

			LinkedList list = new LinkedList();
		list.add(title1);
		list.add(title2);
		list.add(title3);
		list.add(1,title4);  //title4插入数据

在这里插入图片描述
title4插入数据,在调试中只有next与first才会出现黄色提示,除黄色部分其他数据无反应,以此比较于ArrayList有点“牵一发动全身”的感觉,明显并有力证明了对于插入删除数据LinkedList更高效是有依据的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值