文章目录
一、集合与数组的区别
- 数组长度固定,集合的长度可以变化
- 数组可以存放基本类型数据以及对象的引用,集合不能存放基本类型数据,只能存放对象的引用
- 数组不能对元素进行操作,集合可以
二、集合详解
集合的类型分为四种
- Set:集合中对象不排序,没有重复对象
- List:按照索引位置排序,可有重复对象
- Queue:先进先出规则排序,队尾加元素队头删除元素。双向队列允许在队头队尾添加删除元素
- Map:每个元素包含一个对象和对应的Key值,Key值不可重复,对象可重复。能实现对Key排序
注意:这四种集合类都是接口,所有实现类都实现了这四种接口而非继承这四种接口。
1、Collection
Queue,List和Set都继承了Collection接口
方法 | 描述 |
---|---|
boolean add(Object o) | 加入对象 |
void clear() | 清空集合中对象 |
boolean contains(Object o) | 判断是否持有 |
boolean isEmpty() | 判断是否是空集合 |
Iterator iterator() | 迭代器,包含hasNext()判断集合中元素是否遍历完毕;next()返回下一个元素;remove()删除next()返回的元素 ; |
boolean remove(Object o) | 删除指定对象引用 |
int size() | 返回集合中元素个数 |
Object[] to Array() <T>T[] toArray(T[] a) | 集合中元素打包成数组返回 |
遍历输出集合中元素示例:
while (it.hasNext()){ //it是迭代器
Object element=it.next();
System.out.println(element);
}
遍历集合中元素也可以用for each语句
for(Object i:c){//c是Collection实例
System.out.println(i);
}
2、Set
没有重复对像地存放对象的引用
如果set中加入了已有的引用,视为不加入
(1)Hashset
加快存储和查找的集合
每个对象的引用都有一个哈希码,通过哈希码存放,对象的hashCode()方法返回对象的哈希码
为了保证其正常工作,同一对象的哈希码相等,即:
if(a.equals(b)){
a.hashCode()==b.hashCode() //为true
}
(2)TreeSet
能对集合中对象排序
Set<Integer>set=new TreeSet<Integer>();
set.add(3);
set.add(2);
set.add(1);
for(int i:set){
System.out.println(i);
}
//输出为123
java.util.Comparator<T>中的int compare(T x ,T y)
提供TreeSet的具体排序方式,指定排序方法即override这一方式,如对String逆序排序
import java.util.*;
class newcomparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) { //重写compare方法
if(o1.compareTo(o2)>0)return -1;
else if(o1.compareTo(o2)<0)return 1;
else return 0;
}
}
public class Test{
public static void main(String args[]) {
Set<String> set =new TreeSet<String>(new newcomparator()); //创建TreeSet,并且排序方式是定义的newcomparator()
set.add("b");
set.add("c");
set.add("a");
for(String i:set) {
System.out.println(i);
}
//输出为cba
}
}
3、List
线性方式存储元素,允许重复,主要实现类包括两种:
- ArrayList:快速检索元素,插入删除元素较慢
- LinkedList:快速插入删除元素,检索元素较慢
(1)get(int index)
返回index指定的索引位置的对象
(2)Collections.sort()
sort()
方法用于对List中对象进行排序
- sort(List list):对list中对象自然排序
- sort(List list,Comparator comparator):指定排序方式
(3)把数组包装成List
Arrays.asList(Object[] o)
方法能把一个java数组包装为一个List对象
所有对List的操作都会被作用到数组,因为数组固定长度,所以这里的List对象也是固定长度的,add()
和remove()
方法都会报错
Arrays.toString(Object[] o)
把数组格式化为字符串
import java.util.Arrays;
import java.util.List;
public class Test{
public static void main(String args[]) {
String[] list= {"a","b","c"};
List<String> x=Arrays.asList(list);
x.set(0, "b");
for(String i:list) {
System.out.println(i);
}
//输出bbc
System.out.println(Arrays.toString(list));
//输出[b,b,c]
}
}
4、Queue
末尾添加元素,头部删除元素
Queue<T> queue=new LinkedList<T>();
(1)加入元素
在末尾插入元素
boolean add(E element)
:操作成功返回true,队列已满抛出异常boolean offer(E element)
:操作成功返回true,队列已满返回false
(2)删除元素
删除队头元素
queue.remove()
:队列为空抛出异常queue.poll()
:队列为空返回null
(3)获取元素
获取队头元素
queue.element()
:队列为空返回异常queue.peek()
:队列为空返回null
5、双向队列
Deque<T> queue=new ArrayDeque<T>();
(1)添加元素
void addFirst(E element)
void addLast(E element)
boolean offerFirst(E element)
boolean offerLast(E element)
(2)删除元素
queue.removeFirst();
queue.removeLast();
queue.pollFirst();
queue.pollLast();
(3)获取元素
queue.getFirst();
queue.getLast();
queue.peakFirst();
queue.peakLast();
6、Map
对象和值有映射
实现方法有:
- HashMap:存取性能好
- TreeMap:能排序
key值不能重复,如果重复,后加入的key的对象引用会覆盖掉前面的
(1)加入元素
put方法
map.put(Object key,Object value);
(2)检索对象
get方法
map.get(Object key);
(3)遍历映射
Set<Map.Entry<String,String>> set=map.entrySet();//set是一个以映射为对象的集合
for(Map.Entry entry:set)
System.out.println(entry.getKey()+":"+entry.getValue());
getKey()
是返回键方法
getValue()
是返回值方法
map.keySet()
方法返回键集合
所以也可以通过遍历这个集合,通过map.get(Key)
来遍历映射
(4)TreeMap
按key排序