项目实战:滚动刷新场景(从ArrayList到LinkedList)

如果有这样一个需求,有这样一个列表显示数据,现假设一共显示25项,初始状态为空。

首先从0-24添加数据,满了之后,覆盖最早数据,即继续从0-24追加数据。

习惯性思维ArrayList开始搞。

java.util

类 ArrayList<E>

java.lang.Object
  java.util.AbstractCollection<E>
      java.util.AbstractList<E>
          java.util.ArrayList<E>
所有已实现的接口:
Serializable,Cloneable,
Iterable<E>,Collection<E>,List<E>,
RandomAccess
直接已知子类:
AttributeList,RoleList,
RoleUnresolvedList

Duang的一下写好代码,不就是add嘛。

import java.util.ArrayList;
import java.util.List;

/*
 * 权兴权意-20160920
 */

public class ArrayListTest {

<span style="white-space:pre">	</span>private static List<Integer> list = new ArrayList<Integer>();
    <span style="white-space:pre">	</span>private static int count = 0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i = 0;i <= 50;i++){
			list.add(count,count);
			count++;
			if (count == 25)
				count = 0;
			for(int temp : list){
				System.out.print(temp + ",");
			}
			System.out.println("-----+" + count);
		}
	}

}

看一下效果,然而并没有这么简单,

阴影部分初始化数据木有问题,看阴影部分下方,从0-24添加数据也木有问题,不过,你有木有发现,List越来越长了,现在我们先看看看API,到底是什么鬼。

public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null 在内的所有元素。除了实现List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)

随着向 ArrayList 中不断添加元素,其容量也自动增长。

继续查看API,发现了这个:

add

public void add(int index,
                E element)
将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。

指定者:
接口 List<E> 中的add
覆盖:
AbstractList<E> 中的add
参数:
index - 指定元素所插入位置的索引
element - 要插入的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

set

public E set(int index,
             E element)
用指定的元素替代此列表中指定位置上的元素。

指定者:
接口 List<E> 中的set
覆盖:
AbstractList<E> 中的set
参数:
index - 要替代的元素的索引
element - 存储在指定位置上的元素
返回:
以前位于该指定位置上的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())

所以说要多读API,第一轮初始化数据用add,第二轮应该是set更新数据。

即先判断这个位置是否为空,为空add否则set。

duang~又写好了。

import java.util.ArrayList;
import java.util.List;

/*
 * 权兴权意-20160920
 */

public class ArrayListTest {

	private static List<Integer> list = new ArrayList<Integer>();
    <span style="white-space:pre">	</span>private static int count = 0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i = 0;i <= 50;i++){
 			if(list.get(i) == null){
				list.add(count,count);
			}else{
				list.set(count,count*10);
			}
			count++;
			if (count == 25)
				count = 0;
			for(int temp : list){
				System.out.print(temp + ",");
			}
			System.out.println("-----+" + count);
		}
	}

}

亲,你觉得这次又会有什么问题?

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

at java.util.ArrayList.RangeCheck(ArrayList.java:547)

at java.util.ArrayList.get(ArrayList.java:322)

at com.car.quan.List.ArrayListTest.main(ArrayListTest.java:19)

get(i)越界异常,为空时怎么能获取第0个元素呢?

get

public E get(int index)
返回此列表中指定位置上的元素。

指定者:
接口 List<E> 中的get
指定者:
AbstractList<E> 中的get
参数:
index - 要返回元素的索引
返回:
此列表中指定位置上的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())

难道还不能判空了吗?

看一下数字规律,Index: 0 = Size: 0,此时是第一轮初始化数据,get思路:list.size() == count。

import java.util.ArrayList;
import java.util.List;

/*
 * 权兴权意-20160920
 */

public class ArrayListTest {

	private static List<Integer> list = new ArrayList<Integer>();
    private static int count = 0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i = 0;i <= 50;i++){
 			if(list.size() == count){
				list.add(count,count);
			}else{
				list.set(count,count*10);
			}
			count++;
			if (count == 25)
				count = 0;
			for(int temp : list){
				System.out.print(temp + ",");
			}
			System.out.println("-----+" + count);
		}
	}

}

看一下效果吧:

由此实现滚动刷新的效果。

不过,滚动刷新,刷掉最早的数据,有木有一种先进先出的feel,队列,get。

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。

在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。

Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。

值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

java.util

类 LinkedList<E>

java.lang.Object
  java.util.AbstractCollection<E>
      java.util.AbstractList<E>
          java.util.AbstractSequentialList<E>
              java.util.LinkedList<E>
类型参数:
E - 在此 collection 中保持的元素的类型
所有已实现的接口:
Serializable,Cloneable,
Iterable<E>,Collection<E>,Deque<E>,
List<E>, Queue<E>  

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾getremoveinsert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

此类实现 Deque 接口,为 addpoll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

offer

public boolean offer(E e)
将指定元素添加到此列表的末尾(最后一个元素)。

指定者:
接口 Deque<E> 中的offer
指定者:
接口 Queue<E> 中的offer
参数:
e - 要添加的元素
返回:
true(根据 Queue.offer(E) 的规定)
从以下版本开始:
1.5 

poll

public E poll()
获取并移除此列表的头(第一个元素)

指定者:
接口 Deque<E> 中的poll
指定者:
接口 Queue<E> 中的poll
返回:
此列表的头,如果此列表为空,则返回 null
从以下版本开始:
1.5 

接下来就是水到渠成的事。

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/*
 * 权兴权意-20160920
 */

public class QueueTest {

	private static List<Integer> q = new LinkedList<Integer>();

	public static void main(String[] args) {
		for(int i = 1;i <= 50;i++){
			((LinkedList<Integer>) q).offer(i);
			if (q.size() == 26)
				((LinkedList<Integer>) q).poll();
			for(int temp : q){
				System.out.print(temp + ",");
			}
			System.out.println("------------------");
		}
	}

}

看结果:

小结:熟练API,熟练数据结构,Android项目开发之源还在JavaSE。

题外话:

队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞.在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可以定期地把中间结果存到阻塞队列中而其他工作者线线程把中间结果取出并在将来修改它们。队列会自动平衡负载。如果第一个线程集运行得比第二个慢,则第二个线程集在等待结果时就会阻塞。如果第一个线程集运行得快,那么它将等待第二个线程集赶上来。

时间: 2024-10-06 07:15:53

项目实战:滚动刷新场景(从ArrayList到LinkedList)的相关文章

ArrayList和LinkedList区别

ArrayList和LinkedList区别: 一句话概括:ArrayList 通过的是数组形式来存贮管理对象的,LinkedList是通过链表的方式. 共同点: LinkedeList和ArrayList都实现了List接口 ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references). 但是它们的工作原理却不一样. 它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList)

项目实战——企业级Zabbix监控实战(一)

项目实战--企业级Zabbix监控实战 实验一:Zabbix监控的搭建 1.实验准备 centos系统服务器3台. 一台作为监控服务器, 两台台作为被监控节点, 配置好yum源. 防火墙关闭. 各节点时钟服务同步. 各节点之间可以通过主机名互相通信. 1)所有机器关闭防火墙和selinux iptables -F && setenforing 2)根据架构图,实验基本设置如下: 2.Zabbix的安装 1)更新我们的yum仓库 我们去官网下载一个包zabbix-release-3.4-2.

Android项目实战(二十三):仿QQ设置App全局字体大小

原文:Android项目实战(二十三):仿QQ设置App全局字体大小 一.项目需求: 因为产品对象用于中老年人,所以产品设计添加了APP全局字体调整大小功能. 这里仿做QQ设置字体大小的功能. QQ实现的效果是,滚动下面的seekbar,当只有seekbar到达某一个刻度的时候,这时候上部分的效果展示部分会改变文字大小, 但是在拖动过程中字体不会改变.关闭此界面,就可以看到改变文字后app整体的实际文字大小效果了. ----------------------------------------

零基础Swift实战开发从入门到精通(4大项目实战、酷跑熊猫、百度音乐、足球游戏等)

第一部分:Swift基础语法 第1节:变量 第2节:常量 第3节:使用PlayRound编写Swift程序 第4节:类型检查与推断 第5节:类型别名 第6节:计算器 第二部分:字符和字符串 第1节:字符(Characters) 第2节:字符串-定义 第三部分:数据类型(DataType) 第1节:整型(int.Uint) 第2节:浮点数 第3节:Bool 第四部分:数据类型转换 第1节字符串转换数字类型 第2节数字类型转换字符串 第3节:数字类型之间转换 更多............ 项目实战一

Android项目实战(三十四):蓝牙4.0 BLE 多设备连接

原文:Android项目实战(三十四):蓝牙4.0 BLE 多设备连接 最近项目有个需求,手机设备连接多个蓝牙4.0 设备 并获取这些设备的数据. 查询了很多资料终于实现,现进行总结. -------------------------------------------------------------------------------------------------------------------------------------------------------------

Android项目实战(二十九):酒店预定日期选择

原文:Android项目实战(二十九):酒店预定日期选择 先看需求效果图:              几个需求点: 1.显示当月以及下个月的日历 (可自行拓展更多月份) 2.首次点击选择"开始日期",再次点击选择"结束日期" (1).如果"开始日期" "结束日期" 相同  (2).如果"开始日期" "结束日期" 不同,且"结束日期" 晚于 "开始日期&quo

黑马2018年最新kotlin项目实战视频 (手机影音、即时通讯、黑马外卖、坦克大战等)

├─1.kotlin简介和学习方法│ 01_kotlin课程简介_01.mp4│ 02_kotlin学习方法_01.mp4│ 03_kotlin选好教练车_01.mp4│ 03_kotlin选好教练车_02.mp4│ 04_kotlin你好世界_01.mp4│ 05_kotlin变量与输出_01.mp4│ 05_kotlin变量与输出_02.mp4│ ├─10.类,对象和接口(三)│ 38_kotlin面向对象-抽象类和接口_01.mp4│ 38_kotlin面向对象-抽象类和接口_02.mp4

移动端:项目实战

项目实战 一.flexible.js库 作用 flexible是淘宝推出的弹性布局方案,可以解决移动端设备适配问题 功能 添加<meta>标签,并动态改写 <meta> 标签 给 <html> 元素添加 data-dpr 属性,并且动态改写 data-dpr 的值 给 <html> 元素添加 font-size 属性,并且动态改写 font-size 的值 flexible.js下载:https://github.com/amfe/lib-flexible

【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前的习惯,我们还是新建几个文件夹 Commons:存放帮助类 Domians:数据模型 Services:接口和实现类 我们在Domains文件夹下添加一个类库 Domain 我们新建一个类 ApplicationDbContext 继承 DbContext 1 using Microsoft.Ent