容器
容器|集合:
存储多个引用数据类型的数据
特点:
1、容器长度可随数据个数进行增删
2、容器可以存储任意类型的数据
Collection 容器的上层接口
Collection子接口
Set 无序不可重复
HashSet(无序不可重复;无序--》存储的顺序和内部真实存放的顺序不同)
List 有序可重复
List容器的遍历:
1、for 原因:存在索引
2、for...each(增强for)
3、迭代器Collection接口的功能,Collection接口的实现类都能够使用
使用步骤:
1)、获取迭代器对象(相当于工具)
2)、判读是否存在下一个元素
3)、获取
公式:
Iterator 变量名=容器对象.iterator();
while(变量名.hasNext()){
System.out.println(变量名.next());
}
4、列表迭代器,只有List容器能使用
1)、获取列表迭代器listInterator();-->List接口的方法
2)、判断是否有下一个|上一个元素
3)、获取|添加数据
ArrayList:是List的实现类,具有List接口的特点(线程不安全)
底层结构:是由数组实现,通过数据拷贝实现的(可变数组,在内存中是一块连接的内存空间)
优点:做查询、遍历,效率高
缺点:做增删效率低
应用场景:做大量查询推荐使用
扩容问题:每次扩容原容量的1.5倍
Map 容器接口
存储的每个数据都是K-V组成的
K(键):无序,不可重复
V(值):无序,可重复
特点:
Key和Value之间存在映射关系,根据key获取value值
一个key只能对应一个value,想要对应多个,可以把value存放在容器中
存储数据时,key相同,value的值会被覆盖
遍历的方式:
1、keySet()获取所有的key,返回一个Set集合,然后根据key获取value值
2、values()获取所有的value值,返回一个Collection集合
3、entrySet()获取以K-V的数据,反回一个Set<Map.Entry<k的数据类型,v的数据类型>>的集合
eg:
package com.shsxt.demo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer,String> map=new HashMap();
//往map容器中添加数据
map.put(01, "中国");
map.put(02, "巴基斯坦");
map.put(03, "俄罗斯");
map.put(04, "日本");
map.put(05, "英国");
map.put(06, "美国");
System.out.println(map);
//遍历方式:
System.out.println("----keySet()方式-----");
Set<Integer> s=map.keySet();
for(Integer i:s){
System.out.println(map.get(i));
}
System.out.println("----Values方式-----");
Collection<String> coll=map.values();
Iterator m=coll.iterator();
while(m.hasNext()){//判读是否存在下一个元素
System.out.println(m.next());
}
System.out.println("---EntrySet()方式-----");
Set<Map.Entry<Integer, String>> entry=map.entrySet();
System.out.println(entry);
Iterator<Map.Entry<Integer, String>> n=entry.iterator();
while(n.hasNext()){//判读是否存在下一个元素
Map.Entry<Integer, String> y=n.next();
System.out.println(y);
}
}
}
HashMap:(线程不安全,效率高)
底层:hash表实现(数组+链表+红黑树)
如何解决HashMap线程不安全问题:
1、可以使用Hashtable
2、使用Collection提供的synchronizeMap方法,返回一个线程安全的Map
3、juc包(高级并发编程包)下ConcurrentHashMap是一个线程安全的HashMap 推荐使用,效率高
Hashtable:线程安全的哈希表,不能存储Null值
泛型<>:严格要求定义容器中所有数据的类型<元素的类型>
好处:帮助我们增强代码的可读性,扩展型、安全性;
Vector 向量
与ArrayList像,都是由数组实现内部存储结构
区别:
早期jdk版本提供,后续jdk版本推荐ArrayList代替Vector
Vector 线程安全,效率低,Arralist线程不安全,效率高
扩容:每次扩容原容量的2倍,没有ArrayList节省空间
LinkedList
底层:双向链表
优点:增删效率高
缺点:查询效率低
链表:
链表以结点作为存储单元,这些存储单元可以是不连续的
单向链表:存储的数值+后序结点的指针
双向链表:存储的数值+前序结点和后序结点的指针
节点:由两部分组成:存储的数值+前序结点和后序结点的指针
Properties容器类
Properties可保存在流中加载。属性列表中的每个键及其对应值都是一个字符串
TreeMap容器:
根据key的值进行默认升序排序
key值如果是自定义类型,需要手动对这个类型实现比较器,定义比较规则;
Hash表(HashMap或HashSet):去重,根据key,需要对自定义的引用数据类型的数据重写hashcode和equals方法
Tree树形结构(TreeMap,TreeSet):根据key去重排序,对引用数据类型的数据重写比较器(内部比较器,外部比较器)