集合概念介绍
同数组一样,集合是用来存储数据的,就好比容器,数组的长度是固定不可变的,是在创建时就要定义好的,而集合与数组相比最显著的一个特点就是它的长度是可变的,在存储数据时根据实际存储的容量自动扩展容量,而且集合操作简便,但根据对数据操作的不同需求,Java提供了不同特点的集合。
集合体系介绍
(1)单列集合
父接口:collection
子接口1:List 子接口2:Set
实现类:ArrayList Vector LinkedList HashSet LinkedHashSet
各自特点介绍:
ArrayLis:底层数据结构是数组,查询快,增删慢,线程不安全,效率高
Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低(基本不用)
LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高
HashSet:底层数据结构是哈希表,元素是无序(存储和取出的顺序不一致),元素唯一
LinkedHashSet:底层数据结构是哈希表+链表,在HashSet特点的基础上,它的元素是有序的
(2)双列集合
父接口:Map
实现类:HashMap LinkedHashMap
特点:Map将数据以键值对的形式存储,将键映射到值,键是唯一的,不能重复,每个键只能映射到一个值,一个值可以被多个键映射,键与值的对应关系是一对一或者是多对一。
(3)与集合紧密相关的数据结构
面试题:常见的数据结构及其特点
- 栈:先进后出
- 队列:先进先出
- 数组:查询快,增删慢–ArrayList
- 链表:增删快,查询慢–LinkedList
- 树:对元素排序–TreeSet
- 哈希表:增删查询都快–HashSet,哈希表是由链表和数组构成,在JDK8后加入了红黑树,当链表长度超过8时会自动转换成树结构进行存储
Collection集合
1.Collection常用方法
- boolean add()添加
- void clear() 清空集合
- boolean remove(Object obj)删除集合中第一次出现的元素
- boolean contain(Object obj)判断集合中是否存在元素
- boolean isEmpty()判断是否为空
- int size() 获取集合中元素个数
- Object [ ] toArray() 将集合转为数组
2. 遍历集合的两种方式
(1)增强for
(2)Iterator迭代器
各种方法使用具体代码:
package Test1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionTest {
public static void main(String[] args) {
List<String> strList=new ArrayList<String>();
// Boolean add()添加
strList.add("hello");
strList.add("world");
strList.add("I");
strList.add("like");
strList.add("Java");
strList.add("world");
// fun1(strList);
fun2(strList);
System.out.println("-------------------------------------");
// Boolean contain(Object obj)判断集合中是否存在元素
boolean b1=strList.contains("Java");
System.out.println(b1);
System.out.println("-------------------------------------");
// Boolean remove(Object obj)删除集合中第一次出现的元素
boolean b2=strList.remove("world");
System.out.println(b2);
System.out.println("-------------------------------------");
// int size() 获取集合中元素个数
int length=strList.size();
System.out.println(length);
System.out.println("-------------------------------------");
// Object [ ] toArray() 将集合转为数组
Object[] objects=strList.toArray();
for(int i=0;i<objects.length;i++){
System.out.println(objects[i]);
}
System.out.println("-------------------------------------");
// Boolean isEmpty()判断是否为空
boolean b3=strList.isEmpty();
System.out.println(b3);
System.out.println("-------------------------------------");
// Void clear() 清空集合
strList.clear();
System.out.println(strList.isEmpty());
}
//增强for
private static void fun1(List<String> strList) {
for(String s:strList){
System.out.println(s);
}
}
//Iterator迭代器接口
private static void fun2(List<String> strList) {
Iterator<String> iterator=strList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
对于list集合,应为它是有序的所以可以根据索引,用list特有的方法get(int index)来获取元素,也能够达到遍历的效果
迭代器使用常见错误:
//导致数据输出有误
Iterator<String> iterator=strList.iterator();
while(iterator.hasNext()){
String s=iterator.next();//已经获取数据
System.out.println(iterator.next());//再次获取
}
Map集合
Map集合中的数据结构都是针对”键”的
1.常用方法
- v put( K key,V value ) : 添加元素,正常添加返回null ,如果添加的是重复的键,”新值”会替换”旧值”返回的就是”旧值”
- v remove(Object key) : 根据键删除对应的键值对, 返回被删除元素的值
v get(Object key) : 根据指定的键获取对应的值
- 遍历方式
(1) Set keySet() 获取map集合中所有的键存储到set集合中,再用get方法获取对应的值
(2) Set
- 遍历方式
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("孙悟空","吴承恩");
map.put("红楼梦","曹雪芹");
map.put("水浒传","施耐庵");
map.put("三国演义","罗贯中");
fun1(map);
System.out.println("=============================================");
fun2(map);
}
private static void fun1(Map<String, String> map) {
Set<String> keys=map.keySet();
for(String s:keys){
System.out.println("键: "+s+"\t\t值: "+map.get(s));
}
}
private static void fun2(Map<String, String> map) {
Set<Map.Entry<String,String>> entrySet=map.entrySet();
for(Map.Entry<String,String> e:entrySet){
String key=e.getKey();
String value=e.getValue();
System.out.println("键: "+key+"\t\t值: "+value);
}
}
}
方式2中Map里有一个内部接口Entry提供了两个方法getKey()和getValue()用于获取键值对对象的键和值
运行结果:
遍历结果与存储时的顺序不一致,说明HashMap是无序的,而LinkedHashMap在数据结构中加入了链表,保证了元素有序