S2:java集合框架

Posted 大阿毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S2:java集合框架相关的知识,希望对你有一定的参考价值。

  Java集合就是一个容器。面向对象语言对事物的体现都是以对象的形式存在,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。如果往集合里存放基本数据类型,在存取过程中会有个自动装箱和拆箱。

    因为容器中数据结构不同,容器有很多种。不断地将共性功能向上抽取,形成了集合体系,称之为集合框架。

 

    集合框架的顶层就称之为Collection接口。所有的集合类都位于java.util包下,查阅API可以得到如下体系结构。在使用一个体系时,原则:参阅顶层内容。建立底层对象。

 

    集合和数组的区别:

  1:数组是固定长度的;集合可变长度的。

  2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。

  3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

 

2. LIST 接口

 
实现 List 接口的常用类有 ArrayList 和 LinkedList。它们都可以容纳所有类型的对象,包括 null,允许重复,并且都保证元素的存储顺序。
 
 

ArrayList 集合类

 
ArrayList 对数组进行了封装,实现了长度可变的数组,和数组采用相同存储方式,在内存中分配连续的空间,它的优点在于遍历元素和随即访问元素的效率比较高。
 
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 的异同。
在 ArrayList 类出现之前,JDK 中存在一个和它同样分配连续存储空间,实现了长度可变数组的集合类 Vector。两者实现原理相同,功能相同,在很多情况下可以互用。
 
两者的主要区别如下
  • Vector 是线程安全的,ArrayList 重速度轻安全,是线程非安全的,所以当运行到多线程序环境中时候,需要程序员自己管理线程的同步问题。

  • 当长度需要增长时,Vector 默认增长为原来的一倍,而 ArrayList 只增长 50%,有利于节约内存空间。
 
开发过程中,最好使用新版本的 ArrayList。
 

LinkedList 集合类

 
LinkedList 采用链表存储方式,优点在于插入、删除元素时效率比较高,它提供了额外的 addFirst()、addLast()、removeFirst()和 removeLast()等方法,可以在
 
LinkedList 的首部或尾部进行插入或者删除操作。这些方法使得LinkedList 可被用作堆栈(stack)或者对列(queue)。
 
下面我们总结一下 LinkedList 的各种常用方法。LinkedList 除了之前列出的各种方法之外,还包括一些特殊的方法,见下表 。

返回类型

方法

说明

void

addFirst(Object o)

在列表的首部添加元素

void

addLast(Object o)

在列表的末尾添加元素

Object

getFirst()

返回列表中的第一个元素

Object

getLast()

返回列表中的最后一个元素

Object

removeFirst()

删除并返回列表中的第一个元素

Object

removeLast()

删除并返回列表中的最后一个元素

 

3. MAP 接口

 
Java 集合框架中提供了 Map 接口,专门来处理键值映射数据的存储。Map 中可以存储多个元素,每个元素都由两个对象组成,一个键对象和一个值对象,可以根
据实现对应值的映射。
 
 
Map 接口存储一组成对的键一值对象,提供 key(键)到 value(值)的映射。Map 中的 key不要求有序,不允许重复。value 同样不要求有序,但允许重复。最常见的
 
Map 实现类是 HashMap,它的存储方式是哈希表,优点是查询指定元素效率高。
 
Map 接口中定义的各种常用方法(也是HashMap的各种常用方法),见下表。

返回类型

方法

说明

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 都允许)。
 
开发过程中,最好使用新版本的 HashMap。
 遍历方式:
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

 
所有集合接口和类都没有提供相应的遍历方法,而是把遍历交给迭代器 Iterator 完成。Iterator 为集合而生,专门实现集合的遍历。它隐藏了各种集合实现类的内部细
 
节,提供了遍历集合的统一编程接口。

Collection 接口的 iterate()方法返回一个 Iterator,然后通过 Iterator 接口的两个方法即可方便实现遍历。
 
  • boolean hasNext():判断是否存在另一个可访问的元素。
  • Object next(),返回要访问的下一个元素。
 

5 泛型集合

 
前面已经提到 Collection 的 add(Object obj)方法的参数是 Obect 类型,不管把什么对象放入 Collection 及其子接口或实现类中,认为只是 Object 类型,在通过get(int
 
index)方法取出集合中元素时必须进行强制类型转换,不仅繁琐而且容易出现 ClassCastException 异常。Map 中使用 put(Object key,Object value)和get(Object key)
 
存取对象时,使用 Iterator 的 next()方法获取元素时存在同样问题。

JDK1.5 中通过引入泛型(Generic)有效解决了这个问题。在 JDK1.5 中已经改写了集合框架中的所有接口和类,增加了泛型的支持。

使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行类型强制转换,并且如果把非指定类型对象放入集合,会出现编译错误。
 
对比:
数组和集合的主要区别包括以下几个方面。
  • 数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基本数据类型)。
  • 数组长度固定,集合长度可以动态改变。
  • 定义数组时必须指定数组元素类型,集合默认其中所有元素都是 Object。
  • 无法直接获取数组实际存储的元素个数,length 用来获取数组的长度,但可以通过size()直接获取集合实际存储的元素个数。
  • 集合有多种实现方式和不同的适用场合,而不像数组仅采用分配连续空间方式。
  • 集合以接口和类的形式存在,具有封装、继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
JDK 中有一个 Arrays 类,专门用来操作数组,它提供了一系列静态方法实现对数组搜索、排序、比较和填充等操作。JDK 中有一个 Collection 类,专门用来操作集
 
合,它提供一系列静态方法实现对各种集合的搜索、赋值、排序和线程安全化等操作。
 

总结

①集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高了软件的开发效率,而且不同的集合可适用于不同场合。

②集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

③通常说 Java 的集合框架共有三大类接口:List,Set 和 Map,区别如下。
  •  Collection 接口存储一组不唯一、无序的对象。
  •  Set 接口继承 Collection 接口,存储一组唯一、无序的对象。
  •  List 接口继承 Collection 接口,存储一组不唯一、有序的对象。
  •  Map 接口存储一组成对的键一值对象,提供 Key 到 value 的映射。key 不要求有序、 不允许重复。value 同样不要求有序,但允许重复。

④ArrayList 和数组采用相同的存储方式,它的优点在于遍历元素和随机访问元素的效率比较高。LinkedList 采用链表存储方式,优点在于插入、删除元素时效率比较高。

⑤HashMap 是最常见的 Map 实现类,它的存储方式是哈希表,优点是查询指定元素效率高。

⑥Iterator为集合而生,专门实现集合的遍历,它隐藏了各种集合实现类的内部细节 ,提供了遍历集合的统一编程接口。

⑦使用泛型结合在创建集合对象时指定集合中元素的类型,在从集合中取出元素时无需进行类型强制转换,避免了 ClassCastException 异常。

 

以上是关于S2:java集合框架的主要内容,如果未能解决你的问题,请参考以下文章

代码片段 - Golang 实现集合操作

laravel特殊功能代码片段集合

text 来自Codyhouse框架的Browserlist片段源代码

金蝶handler中 collection 代码片段理解

Alfred常见使用

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段