目录
前言
上篇文章我们学习了Java集合——Collection接口、增强for循环、迭代器和泛型的相关知识,简单了解了集合体系(如下图)
今天我们开始学习List接口、Set接口和Map接口相关的知识。
List接口
list接口类似于数学上的数列模型,也称序列。其特点是可汗重复元素,而且是有序的,用户可以控制向序列中某位置插入元素,并可按元素的顺序访问他们。
注意:元素顺序是从零开始,最后一个元素为:list.size()-1。
其中elem代表数据对象,pos代表操作位置,start_pos为起始查找位置。
方法 | 功能 |
---|---|
.add(elem) | 在尾部添加元素 |
.add(int pos, elem) | 在指定位置增加元素 |
.get(int pos) | 获取指定位置元素 |
.set(int pos ,elem) | 修改指定位置元素 |
.remove(int pos) | 删除指定位置元素 |
.indexOf(Object obj) | 从开始往后查找元素位置 |
.indexOf(Object obj , int start_pos) | 从某位置开始往后查找元素位置 |
.lastIndexOf(Object obj) | 从尾往后查找元素位置 |
.lastIndexOf(Object obj, int start_pos) | 从某位置开始由尾往前查找元素位置 |
ListIterator<E> listIterator() | 返回列表的ListIterator对象 |
ArrayList类和LinkedList类
ArrayList类内部使用数组存放元素,实现了可变大小的数组。
特点:访问元素效率高,但插入元素效率低。
LinkedList类内部使用双向链表存储元素。
特点:插入元素效率高,但访问元素效率低,区分列表的头位置和尾位置的概念,提供了在头尾增、删和访问元素的方法。
- 需要快速插入,删除元素,应该使用LinkedList类;
- 需要快速随机访问元素,应该使用ArrayList类。
列表的使用实例
import java.lang.reflect.Array;
import java.util.*;
public class first {
public static void main(String[] args) {
ArrayList<Integer> a=new ArrayList<>(); //创建ArrayList类集合对象
a.add(12); //添加元素
a.add(15);
a.add(23);
System.out.println(a);
System.out.println(a.indexOf(12)); //输出元素12的位置
Double x[]= {1.2,2.5,7.3};
List<Double> b=Arrays.asList(x); //数组转换为列表
System.out.println(b);
}
}
运行结果为:
[12, 15, 23]
0
[1.2, 2.5, 7.3]
注意:ArrayList加入的数据类型通常要与参数类型一致或者能进行转换赋值。
向量
向量(Vector)是List接口中的另一个子类,Vector和ArrayList非常相似。Vector是线程同步的,线程在更改向量的过程中对资源加锁,而ArrayList不存在此问题。Vector实现了可变大小的对象数组,在容量不够时会自动增加。
- size()方法可获取向量的大小;
- ’capacity()方法则用来获取向量的容量;
- insertElementAt( )在指定位置增加元素;
- elementAt()获取指定位置元素。
向量使用的实例
import java.util.*;
public class first {
public static void main(String[] args) {
Vector<Integer> v=new Vector<>(20,30); //创建向量集合并当向量为空时,向量容量为20
System.out.println("向量的大小为:"+v.size()); //输出向量集合的大小
System.out.println("向量的容量为:"+v.capacity());//输出向量集合的容量
for(int i=0;i<24;i++) //使用for循环向向量增加元素
v.add(i);
System.out.println("元素增加后:");
System.out.println("向量的大小为:"+v.size());
System.out.println("向量的容量为:"+v.capacity());
}
}
运行结果为:
向量的大小为:0
向量的容量为:20
元素增加后:
向量的大小为:24
向量的容量为:50
堆栈和队列
堆栈(stack)是后进先出的数据结构,新进栈的元素总在栈顶,而出栈时总是先去栈顶元素。
使用堆栈对象的push方法可将一个对象压进栈中,而用pop方法将弹出栈顶元素作为返回值,empty方法可判断是否为空。
队列(Queue)是先进先出的数据结构,可以高效地在一端(“队尾”)添加元素,而在另一端(“队头”)删除元素。
ArrayDeque作为队列使用时是用add和remove方法实现进队和出队操作。
ArrayDeque可以作为栈来使用,也可以作为队列使用。
堆栈和队列的使用实例
import java.util.*;
public class first {
public static void main(String[] args) {
ArrayDeque<String> stack=new ArrayDeque<>(); //创建栈集合
stack.push("虞姬"); //添加栈元素
stack.push("狄仁杰");
stack.push("诸葛亮");
System.out.print("出栈的顺序为:");
while(!stack.isEmpty()) //判断是否为空栈
System.out.print(stack.pop()+" "); //输出弹出的栈顶元素
System.out.println();
Queue<String> queue=new ArrayDeque<>(); //创建队列集合
queue.add("苹果"); //添加队列元素
queue.add("西瓜");
queue.add("香蕉");
System.out.print("出队的顺序为:");
while(!queue.isEmpty()) //判断是否为空队列
System.out.print(queue.remove()+" "); //输出出队元素顺序
}
}
运行结果为:
出栈的顺序为:诸葛亮 狄仁杰 虞姬
出队的顺序为:苹果 西瓜 香蕉
Set接口
set接口是数学上集合模型的抽象,特点是它不含重复元素,而且是无序的。HashSet是Set接口的典型实现类,它使用哈希表来实现底层存储。
- add(Object)方法不能插入已经在集合的元素;
- addAll(Collection c)将当前集合与收集c的集合进行合并运算;
- e1.equals(e2)按对象值比较。
set接口的使用实例
import java.util.*;
public class first {
public static void main(String[] args) {
Set<String> h=new HashSet<>(); //创建Set接口的集合对象
h.add("stack"); //添加h集合元素
h.add("Queue");
h.add("stack");
System.out.print(h); //输出集合元素
}
}
运行结果为:
[stack, Queue]
Map接口
Map是一个散列表,它存储的内容是键值对(key-value)映射。
- Set<K> keySet():键的集合;
- Collection<V>values():值的集合;
- Set<Map.Entry<K,V>>entrySet():键值对的映射关系的集合;
对Map接口数据集合的操作方法:
方法 | 描述 |
---|---|
.clear() | 清空整个数据集合 |
.get(K key) | 根据键得到对应值 |
.put(K key,V value) | 加入新的“键值对” |
.remove(Object key) | 删除Map中键所对应的映射关系 |
.equals(Object obj) | 判断Map对象与参数对象是否等价 |
.containsKey(Object key) | 判断Map中是否有与键匹配的项 |
.containsValues(Object value) | 判断Map中是否有与值匹配的项 |
Map接口的使用实例
import java.util.*;
public class first {
public static void main(String[] args) {
Map<Long,String> m=new HashMap<>(); //创建Map接口集合对象
m.put(201L, "狄仁杰"); //添加元素键值对
m.put(202L,"虞姬");
m.put(203L, "诸葛亮");
Set<Long> keys=m.keySet(); //通过Map对象的keySet()方法得到键的集合
for(Iterator<Long> i=keys.iterator();i.hasNext();)
System.out.print(i.next()+" "); //输出集合的所有元素
System.out.println();
System.out.println(m.get(202L)); //获取202L对应的值
System.out.println(m.values()); //输出集合对象的所有值
}
}
运行结果为:
201 202 203
虞姬
[狄仁杰, 虞姬, 诸葛亮]
最后
好了,关于Java集合——List接口、Set接口和Map接口的知识学到这里了,谢谢观看!!!
我们下篇文章再见!!!
成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。