S2:java集合框架
Java集合就是一个容器。面向对象语言对事物的体现都是以对象的形式存在,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。如果往集合里存放基本数据类型,在存取过程中会有个自动装箱和拆箱。
因为容器中数据结构不同,容器有很多种。不断地将共性功能向上抽取,形成了集合体系,称之为集合框架。
集合框架的顶层就称之为Collection接口。所有的集合类都位于java.util包下,查阅API可以得到如下体系结构。在使用一个体系时,原则:参阅顶层内容。建立底层对象。
集合和数组的区别:
1:数组是固定长度的;集合可变长度的。
2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
2. LIST 接口
ArrayList 集合类
返回类型 |
方法 |
说明 |
boolean |
add(Object o) |
在列表的末尾顺序添加元素,起始索引位置从 0 开始 |
void |
add(int index,Object o) |
在指定的索引位置元素注意:索引位置必须介于 0和列表中元素个数之间 |
int |
size() |
返回列表中的元素个数 |
Object |
get(int index) |
返回指定索引位置处的元素注意:取出的元素是 Object类型,使用前需要进行强制类型转换 |
boolean |
contains(Object o |
判断列表中是否存在指定元素 |
boolean |
remove(Object o) |
从列表中删除元素 |
Object |
remove(int index) |
从列表中删除指定位置元素,起始索引位置从 0 开始 |
对比:
- Vector 是线程安全的,ArrayList 重速度轻安全,是线程非安全的,所以当运行到多线程序环境中时候,需要程序员自己管理线程的同步问题。
- 当长度需要增长时,Vector 默认增长为原来的一倍,而 ArrayList 只增长 50%,有利于节约内存空间。
LinkedList 集合类
返回类型 |
方法 |
说明 |
void |
addFirst(Object o) |
在列表的首部添加元素 |
void |
addLast(Object o) |
在列表的末尾添加元素 |
Object |
getFirst() |
返回列表中的第一个元素 |
Object |
getLast() |
返回列表中的最后一个元素 |
Object |
removeFirst() |
删除并返回列表中的第一个元素 |
Object |
removeLast() |
删除并返回列表中的最后一个元素 |
3. MAP 接口
返回类型 |
方法 |
说明 |
Object |
put(Object key,Object value) |
以“键-值对”的方式进行存储注意:键必须是唯一的,值可以重复。如果试图添加重复的键,那么最后加入的键-值对将替换原先的键-值对。 |
Object |
get(Object key) |
根据健返回相关联的值,如果不存在指定的键,返回 null。 |
Object |
remove(Object key) |
删除由指定的键映射的“键-值对” |
int |
size() |
返回元素个数 |
Set |
keySet() |
返回键的集合 |
Collection |
values() |
返回值的集合 |
boolean |
containsKey(Object key) |
如果存在由指定的键映射的“键-值对”,返回true |
Hashtable 和 HashMap 的异同。
HashMap 类出现之前,JDK 中存在一个和它同样采用哈希表存储方式,同样实现键值映射的集合类 Hashtable。两者实现原理相同,功能相同,很多情况下可以互用。
- Hashtable 继承自 Dictionary 类,而 HashMap 实现了 Map 接口。
- Hashtable 是线程安全的,HashMap 重速度轻安全,是线程非安全的,所以当运行到多线程环境中时,需要程序员自己管理线程的同步问题。
- Hashtable不允许null值(key和value都不允许),HashMap允许null值(key和 value 都允许)。
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MAP {
public static void main(String[] args) {
//遍历方式1:
Map<String,String>c=new HashMap<String,String>();
c.put("CN", "中国");
c.put("RU", "俄罗斯");
c.put("FR", "法兰西");
Set<String> set=c.keySet();
for (String key : set) {
System.out.println(key);
System.out.println(c.get(key));
}
//遍历方式2:
System.out.println("=====================================");
Collection<String> c1=c.values();
for (String values : c1) {
System.out.println(values); }
//遍历方式3:
System.out.println("=======================================");
Set<Entry<String, String>> c2=c.entrySet();
for (Entry<String, String> entry : c2) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
//遍历方式4:
System.out.println("=============================");
Set<String>keyset=c.keySet();
Iterator<String> iterator=keyset.iterator();
while(iterator.hasNext()){
String key=iterator.next();
System.out.println(key);
System.out.println(c.get(key));
}
//遍历方式5:
System.out.println("===============================");
Iterator<Entry<String, String>> c3=c.entrySet().iterator();
while (c3.hasNext()) {
Entry<String, String> en=c3.next();
System.out.println(en.getKey());
System.out.println(en.getValue()); } }
}
4. 迭代器 I TERATOR
- boolean hasNext():判断是否存在另一个可访问的元素。
- Object next(),返回要访问的下一个元素。
5 泛型集合
数组和集合的主要区别包括以下几个方面。
- 数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基本数据类型)。
- 数组长度固定,集合长度可以动态改变。
- 定义数组时必须指定数组元素类型,集合默认其中所有元素都是 Object。
- 无法直接获取数组实际存储的元素个数,length 用来获取数组的长度,但可以通过size()直接获取集合实际存储的元素个数。
- 集合有多种实现方式和不同的适用场合,而不像数组仅采用分配连续空间方式。
- 集合以接口和类的形式存在,具有封装、继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
总结
①集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高了软件的开发效率,而且不同的集合可适用于不同场合。
- Collection 接口存储一组不唯一、无序的对象。
- Set 接口继承 Collection 接口,存储一组唯一、无序的对象。
- List 接口继承 Collection 接口,存储一组不唯一、有序的对象。
- Map 接口存储一组成对的键一值对象,提供 Key 到 value 的映射。key 不要求有序、 不允许重复。value 同样不要求有序,但允许重复。
④ArrayList 和数组采用相同的存储方式,它的优点在于遍历元素和随机访问元素的效率比较高。LinkedList 采用链表存储方式,优点在于插入、删除元素时效率比较高。
最新文章
- RabbitMQ学习系列(四): 几种Exchange 模式
- Spring boot mybatis项目启动后一直刷日志的bug修复……
- Debug 常见问题总结(持续更新)
- LESS初探
- GCD应用及其他方法
- dragsort拖动插件的使用
- C++ _access和_waccess的使用方法
- SQL Server中的分页
- Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)
- CentOS6.5切换 语言(附带6.5官方下载地址)
- Lambda高手之路第二部分
- state-of-the-art implementations related to visual recognition and search
- idea cpu 卡慢 占用100%
- 51nod 1443 路径和树(最短路树)
- day07-(JDBC)
- 9.9Dajngo MTV
- css布局一屏幕的自适应高度
- Django 配置mysql
- T_SQL 语句想已有数据表添加约束
- android隐藏EditText光标