1.集合框架
1.数组长度固定不变,不能很好地适应元素数量动态变化的情况。
2.可通过数组名.length获取数组的长度,却无法直接获取数组中真实存储的个数。
3.在进行频繁插入、删除操作时同样效率低下。
Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们都位于Java.util包中。
集合框架是为表示和操作集合而规定的一种统一的标准体系结构。
集合框架都包含三大块内容:
1.对外的接口
2.接口的实现
3.对集合运算的算法
1.接口:
List:ArrayList LinkedList
Map:Hashtable HashMap
扩容原理:int newCapacity = oldCapacity + (oldCapacity >> 1);
Java集合框架中的两大类接口:Collection和Map。
Collection又有两个子接口:List和Set。
Java集合框架共有三大类接口:List、Set和Map。
它们的共同点:都是集合接口,都可以用来存储很多对象。
它们的区别如下:
1.Colection接口存储一组不唯一(允许重复)、无序的对象。
2.Set接口继承Collection接口,存储一组唯一(不允许重复)、无序的对象。
3.List接口继承Collection接口,存储一组不唯一(允许重复)、有序(以元素插入的次序来放置元素,不会重新排列)的对象。
4.Map接口存储一组成对的键-值对象,提供key到value的映射。Map中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。
5.Iterator接口是负责定义访问和遍历元素的接口。
2.List接口
实现List接口的常用类有ArrayList和LinkedList。它们都可以容纳所有类型的对象,包括null,允许重复,并且都保证元素的存储顺序。
1.ArrayList集合类
List接口中定义的各种常用方法:
boolean add(Object o) 在列表末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o) 在指定的索引位置添加元素,原索引位置及其后面的元素依次后移
注意:新添加元素的索引位置必须介于0和列表中元素个数之间
int size() 返回列表中的元素个数
Object get(int index) 返回指定索引位置处的元素
注意:取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o) 判断列表中是否存在指定元素
boolean remove(Object o) 从列表中删除元素
Object remove(int index) 从列表中删除指定位置元素,起始索引位置从0开始
2.LinkedList集合类
LinkedList的一些特殊方法:
void addFirst(Object O) 在列表的首部添加元素
void addLast(Object O) 在列表的末尾添加元素
Object getFirst() 返回列表中的第一个元素
Object getLast() 返回列表中的第一个元素
Object removeFirst() 删除并返回列表中的第一个元素
Object removeLast() 删除并返回列表中的第一个元素
3.Map接口
1.HashMap集合类
Map的常用方法
Object put(Object key,Object value) 以"键-值对"的方式进行存储
Object get(Object key) 根据键返回相关联的值,若不存在指定的键,则返回 null
Object remove(Object key) 删除指定的键映射的"键-值对"
int size() 返回元素个数
Set keySet() 返回键的集合
Collection values() 返回值的集合
boolean containsKey(Object key) 若存在指定的键映射的"键-值对",则返回true
boolean isEmpty() 若不存在键-值映射关系,则返回true
void clear() 从此映射中移除所有映射关系
5种遍历方法
public static void main(String[] args) { HashMap<String,String> map=new HashMap<String,String>(); map.put("a","aaa"); map.put("b","bbb"); map.put("c","ccc"); //1 Set<String> keySet = map.keySet(); for (String key : keySet) { System.out.println(key); } System.out.println(); //2 Collection<String> collection = map.values(); for (String value : collection) { System.out.println(value); } System.out.println(); //3 Set<Entry<String, String>> entrySet = map.entrySet(); for (Entry<String, String> entry : entrySet) { System.out.println(entry.getKey()); System.out.println(entry.getValue()); } System.out.println(); //4 Set<String> keySet2 = map.keySet(); Iterator<String> interator=keySet2.iterator(); while(interator.hasNext()){ String key2=interator.next(); System.out.println(key2); System.out.println(map.get(key2)); } System.out.println(); //5 Iterator<Entry<String, String>> iterator = map.entrySet().iterator(); while(iterator.hasNext()){ Entry<String, String> entry = iterator.next(); System.out.println(entry.getKey()); System.out.println(entry.getValue()); } }
3.Iterator迭代器
public static void main(String[] args) { Dog dog1 = new Dog("兰兰",100,90,"拉不拉"); Dog dog2 = new Dog("楠楠",100,90,"雪纳瑞"); Dog dog3 = new Dog("娜娜",100,90,"拉不拉"); Dog dog4 = new Dog("妮妮",100,90,"拉不拉"); Dog dog5 = new Dog("静静",100,90,"拉不拉"); Map dogMap = new HashMap(); dogMap.put(dog1.getName(),dog1); dogMap.put(dog2.getName(),dog2); dogMap.put(dog3.getName(),dog3); dogMap.put(dog4.getName(),dog4); dogMap.put(dog5.getName(),dog5); Set key = dogMap.keySet(); //获得Iterator对象 Iterator it = key.iterator(); while(it.hasNext()){ String key = (String)it.next(); System.out.println(key); Dog dog = (Dog)dogMap.get(key); dog.print(); } }
2.for增强
for(Object key : keys){ Dog dog = (Dog)dogMap.get(key); }
4. 数组和集合的主要区别
1.数组需要声明长度,而集合不用。
2.数组声明了它容纳的元素的类型,而集合不声明。
3.数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方 只读方式来使用集合。该方法将返回一个集合的只读版本。