目录
一.集合
1.概念
数组有什么缺点?
● 数组一旦定义,长度将不能再变化。
● 然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需
要一些能够动态增长长度的容器来保存我们的数据。
● 而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结
构。Java中对于各种数据结构的实现,就是我们用到的集合。
2.体系概述
![](https://i-blog.csdnimg.cn/blog_migrate/85a5e705c043844b7af76dca8bc2a400.png)
二.Collections接口
概念
Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义
了存储方式。
● Set 中的数据对象不可以重复。
● List 中的数据对象有顺序(添加顺序)且可以重复。
常用方法
/*
addAll(Collection<? super T> c, T... elements); 将指定的可变长度参数数据添加到指定的集合中
sort(list);
*/
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Collections.addAll(list,3,4,7,6,5);
Collections.sort(list);//默认是升序的
//自定义排序规则
/*Collections.sort(list, new Comparator<Integer>() { //创建了一个实现Comparator接口的匿名内部类对象 就是省去创建一个类,为了简化语法
@Override
public int compare(Integer o1, Integer o2) {
return o2.intValue() - o1.intValue();
}
});*/
System.out.println(Collections.binarySearch(list,8));
System.out.println(list);
// test(1,2,3,4,5);
}
/*
int...a 可变长度的参数, 本质是一个数组
一个参数列表中只能有一个可变长度参数
必须放在参数列表的最后
*/
public static void test(int b,int...a){
System.out.println(Arrays.toString(a));
}
/*
swap(List<?> l ist, int i, int j) 交换指定位置上的元素
copy(list1,list); 集合复制, 将源集合 复制到目标集合 要求目标集合size 大于等于 源集合的size
fill(list,v) 用指定的值 替换到集合中的所有元素
shuffle(list) 随机排序
reverse(list) 逆序
*/
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(5);
list1.add(6);
list1.add(7);
list1.add(8);
list1.add(9);
//Collections.swap(list,0,1);
//Collections.copy(list1,list);
//Collections.fill(list,8);
System.out.println(Collections.max(list));
System.out.println(Collections.min(list));
Collections.shuffle(list);
Collections.reverse(list);
System.out.println(list);
System.out.println(list1);
三.List接口
1.概念
List继承了Collection接口,有三个实现的类
- ArrayList
数组列表,数据采用数组方式存储。
-LinkedList
链表
-Vector
数组列表,添加同步锁,线程安全的
ArrayList实现了长度可变的数组,在内存中分配连续的空间。
遍历元素和随机访问元素的效率比较高
LinkedList采用链表存储方式。插入、删除元素时效率比较高
集合容器类中默认可以添加Object类型,
但是一般还是习惯一个集合对象中只保存同一种类型.
因为保存多个类型,后期处理时,涉及到类型转换问题
2.常用方法
(1)ArrayList的常用方法
add(E element)
add(int index, E element)
get(int index)
indexOf(Object o)
lastIndexOf(Object o)
remove(int index) 删除并返回指定位置元素
set(int index, E element)
(2)LinkedList的常用方法
add(int index,Object element)
addFirist(Object element)
addLast(Object element)
get(int index)
removeFirst()
removeLast()
remove(int index)
getFirst()
getLast()
(3)Vector
Vector<String> vector = new Vector();
vector.add("a");
vector.add("b");
vector.add("c");
vector.add("c");
vector.size();
System.out.println(vector);
(4)增强for循环
增强for循环遍历元素时,不允许修改集合元素(删除,添加)
例
for(String s:arrayList){
// arrayList.remove(s);
System.out.println(s);
//arrayList.add("1");
}
四.set接口
1.概念
Set接口继承了Collection接口。
Set中所存储的元素是不重复的,但是是无序的, Set中的元素是没有索引的
2.HashSet
HashSet类中的元素不能重复
/*
Set: 元素时不重复
HashSet: 元素是无序的.
*/
HashSet<String> set = new HashSet<>();
set.add("a");
set.add("a");
set.add("b");
set.add("c");
set.add("s");
set.add("x");
set.add("d");
// set.clear();
// set.contains("c");
// set.isEmpty();
// set.remove("s");
// set.size();
// set.iterator();
3.TreeSet
概念
不能存储重复元素的
可以根据值进行排序,底层使用了树结构,本身是有序的
向树形结构中添加元素时,如何判断元素大小以及元素是否重复
向TreeSet中添加的元素类型必须实现Comparable接口,重写compareTo(),
每次添加元素时,调用compareTo()进行元素大小判断(小于0放左子节点,等于0表示重复元素,覆盖元素,大于0放右子节点)
示例
TreeSet<Integer> treeSet = new TreeSet<Integer>();
treeSet.add(2);
treeSet.add(1);
treeSet.add(3);
treeSet.add(3);
treeSet.add(4);
System.out.println(treeSet);
五.Map接口
概念
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
HashMap
HashMap<String,String> map = new HashMap<>();
map.put("a","aa");
map.put("b","bb");
map.put("w","ww");
map.put("c","cc");
map.put("a","aaa"); //向map中添加一组键 值对
map.put(null,"aaaaaa");
TreeMap
底层使用树形结构存储键值 键可以排序 键元素类型必须实现Comparable接口,重写compareTo(),
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(2,"aa");
treeMap.put(1,"aa");
treeMap.put(3,"aa");
treeMap.put(3,"aa");
treeMap.put(4,"aa");
treeMap.containsKey(1);
treeMap.isEmpty();
treeMap.size();
treeMap.get(1);
System.out.println(treeMap);
Hashtable
Hashtable 底层实现也是用到key的哈希值 方法上都添加了synchronized锁 Hashtable中不能存储为null的键和为null的值
Hashtable<String, String> map = new Hashtable<>();
map.put("b","bb");
map.put("a","aa");
map.put("c","cc");
map.put("b","bbb");
System.out.println(map);
Map遍历
HashMap<String,String> map = new HashMap<>();
map.put("a","aa");
map.put("b","bb");
map.put("w","ww");
map.put("c","cc");
map.put("a","aaa"); //向map中添加一组键 值对
map.put(null,"aaaaaa");
//map遍历
//方式1:先拿到所有的键 遍历键 根据键找值
Set<String> keyset = map.keySet();
for(String key : keyset){
System.out.println(key+":"+map.get(key));
}
System.out.println();
//方式2:推荐遍历方式
Set<Map.Entry<String,String>> entries = map.entrySet();
for(Map.Entry entry : entries){
System.out.println(entry.getKey()+":"+entry.getValue());
}