20天jvava(10)

corejava day05
- ArrayList类、HashMap类、迭代器
2011/07/28
==============================
1.线性表
1)什么是线性表?
线性表是一种元素之间有先后次序的集合,
元素的次序由序号(index)表示,在软件开发中使用广泛,如商品列表。
数组和线性表的区别:
a.数组的大小是固定的,而线性表的大小是不固定的
b.数组只能存放相同类型的元素,而线性表存储元素的类型可以不同
2)线性表的功能
a. 集合属性:int size()
boolean isEmpty()
b. 添加元素 void add(Object obj)
void add(int index,Object obj)
c. 删除元素 void remove(int index)
void clear()
d. 修改元素 void set(int index,Object obj)
e. 查询: Object get(int index)
boolean contains(Object obj)
int indexOf(Object obj)
int lastIndexOf(Object obj)
f. 转换为数组:Object[] toArray()
编写自定义线性表接口MyList和实现类MyArrayList,
实现类MyArrayList=线性数据Object[]+操作实现。

3) JDK中线性表接口:java.util.List
数组转换为线性表:List Arrays.asList(Object[] obj)
4) JDK中线性表的实现类:
a.ArrayList: 数组列表,数组实现的线性表,
非线程安全,Java 1.2以后提供,
数组容量采用50%的方式增长,性能较Vector快
b.Vector:向量,数组实现的线性表,线程安全,
数组容量采用成倍的方式增长。
c.LinkedList:链表,采用双向循环链表
实现的线性表。
使用数组实现的线性表,
在元素较多时不适合对元素进行插入和删除操作
,此时应该选择LinkedList
2.散列表
1)什么是散列表?
散列表通过键值对(key:value)存储元素的数据,
key不可以重复, Value可以重复, 无序存储。
实际应用:购物车
2)JDK中散列表的接口:java.util.Map
Map的方法:
属性: size(), isEmpty()
添加元素: put(key, value)
删除元素: remove(key), clear()
更新元素: put(key, value)
查询元素: get(key),
containsKey(key),
containsValue(value)
全部查询: keySet() - 返回key的集合
values() - 返回value的集合
entrySet() - 返回Set集合,集合的元素是key/value
3)JDK中散列表的实现类
a.HashMap类
构造方法:
HashMap() 默认, 初始容量 (16)
加载因子 (0.75)
加载因子是指元素个数和容量之间的一个比率(<1),
当这个比率接近加载因子时,散列表就要扩充容量
HashMap(int initialCapacity) 指定初始容量和默认加载因子 (0.75)
HashMap(int initialCapacity,
float loadFactor) 指定初始容量和加载因子
HashMap(Map map) 创建副本
b.Hashtable类
HashMap与 Hashtable的比较:
HashMap 新, 非线程安全, 性能好
Hashtable 旧 (1.2以前) ,
线程安全, 性能稍差

3.迭代器
1)什么是迭代器: 对集合进行遍历操作,如: 逐一播放歌曲, 发牌操作等.
2)java 接口 java.util.Iterator(迭代器) 用于遍历集合
Iterator接口的方法:
boolean hasNext();//检查是否有下一个元素
Object next(); //返回下一个元素
void remove(); //删除当前元素

a. Iterator 描述了一个顺序结构,
并且有一个游标 概念, 游标默认在第一个元素之前.
b. 调用方法 hasNext()
可以检查游标是否有下一个元素.
c. 使用next() 方法移动游标,
并且返回当前游标指向的元素.
这两个方法经常与while循环组成模式化 结构,
用来遍历集合内容. 是常见的标准结构.
d.凡是对集合的遍历都应采用Iterator接口实现,
编程中十分常见.
e. 集合在迭代期间不能调用
集合的更新方法 add remove set 等
f. 如果需要迭代时候删除集合内容,
可以调用迭代器的 删除方法 remove()来 删除当前元素.

作业
1 复习实现全部课堂案例代码
2 编写自定义线性表接口MyList和实现类MyArrayList
3.在课堂贪吃蛇代码的基础上,增加如下功能完成贪吃蛇游戏:
a. 在类Worm的构造方法中随机产生6个节点Node对象,6个节点连在一起形成蛇身
b. 提供移动蛇头的方法,蛇头碰到WormPanel面板的边界游戏结束。

贪吃蛇的初始显示如下:
--------------------------------
| |
| |
| # |
| # |
| ### |
| # |
| # |
| |
--------------------------------
向右移动一步,显示如下:
--------------------------------
| |
| |
| ## |
| # |
| ### |
| # |
| |
| |
--------------------------------
Java中获取视频时长通常需要借助第三方库来解析视频文件,因为Java标准库本身并不直接支持视频文件的处理。一个常用的库是Xuggler,它可以被用来获取视频的基本信息,包括时长。以下是使用Xuggler库来获取视频时长的一个基本示例: ```java import com.xuggle.mediatool.IMediaReader; import com.xuggle.mediatool.ToolFactory; import com.xuggle.mediatool.event.IVideoPictureEvent; import com.xuggle.xuggler.IStream; import com.xuggle.xuggler.IStreamCoder; import com.xuggle.xuggler.IVideoResampler; public class VideoDuration { public static void main(String[] args) { // 创建媒体读取器 IMediaReader mediaReader = ToolFactory.makeReader("video_file_path.mp4"); // 设置事件处理器 mediaReader.addListener(new MediaAdapter() { @Override public void onVideoPicture(IVideoPictureEvent event) { // 获取视频流 IStream stream = event.getStream(); // 获取流编解码器 IStreamCoder coder = stream.getStreamCoder(); if (coder.getCodecType() == IStreamCoder.Type.VIDEO) { long duration = stream.getContainer().getDuration(); System.out.println("视频时长: " + duration / 1000 + " 秒"); } } }); // 读取媒体文件 while (mediaReader.readPacket() == null) { // 循环读取直到结束 } } } ``` 在这个示例中,我们创建了一个`IMediaReader`对象来读取视频文件,并且设置了一个事件监听器来处理视频帧事件。当读取到视频帧时,我们检查了帧所属的流,并获取了流的时长信息。需要注意的是,这个示例使用了Xuggler的旧API,而Xuggler已经不再维护。现在推荐使用Xuggler的后续项目——JAVE(Java Audio Video Encoder)。 请确保在项目中添加了所需的依赖库才能运行上述代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值