集合框架
数组、对象数组、集合框架的特点与区别
1.概念
数组:用于存放同一基本数据类型元素的组合。 值类型也叫基本数据类型
对象数组:用于存放同一对象类型元素的组合。
集合框架:动态的对象数组。
2.区别
数组不能动态扩张,定义时必须指定长度;集合则无需指定长度,可动态扩张。
二、为什么需要集合框架?
如果不知道程序运行时需要多少对象,或者需要更复杂的方式类存储对象,可以使用集合框架,collection集合框架用来存储和操作不同类型的对象数组。
三、集合框架的体系
1:collection接口
Collection 接口主要有三个子接口:
Set——表示不允许有重复元素的集合
List——表示允许有重复元素的集合
Queue——队列,JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。队列是一种特殊的线性表,先进后出。
按照一定的规则进行排序,
Stack——继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
堆栈:表示一个先进后出的数据结构,子弹夹
1.1List接口
1.1.1特点:(有序,可重复)
(1)和数组类似,可以动态增长;
(2)有序,对象可以重复;
(3)查找元素效率高,插入删除元素效率低(会引起其他元素位置改变)。
1.1.2遍历方式:
(1)下标
(2)foreach(>=JDK 1.5)
(3)迭代器Iterator
1.1.4:对应的实现类
Arraylist集合
声明
ArrayList<E> al=new ArrayList<E>();
<E> 泛型,泛型可以为任何类型的对象,但不包括基本类型。
作用:它的好处在于存储时可以自动检查存入类型的合法性,取出时(get)可以自动转型成对应的类型
方法
追加
boolean add(E e); //将指定的元素添加到此列表的尾部
void add(int index, E element); //将指定的元素插入此列表中的指定位置
boolean addAll(Collection); //将集合中的数据追加到另一个集合后面
boolean addAll(int index, Collection); //将Collection指定追加到位置之后
删除
void clear(); //移除集合中所有的元素
E remove(int index); //移除此列表中指定位置上的元素。
boolean remove(Object o); //移除此列表中首次出现的指定元素(如果存在)。
void removeRange(int fromIndex, int toIndex); //移除列表中索引在 fromIndex(包括)和 toIndex(不包括) 之间的所有元素。
修改(替换)
Object set(index, element); //将index位置的对象替换成element
获取
E get(int index); //返回集合中指定位置的对象
List subList(fromIndex, toIndex); //截取子集合
判断
boolean contains(Object o); //集合中是否包含该元素,需重写equals(比较整体)
boolean containsAll(Collection c); //比较的是集合中的值,是否包含子集合中的内容(比较内容)
boolean isEmpty(); //如果此列表中没有元素,则返回 true
int indexOf(Object o); //判断元素的索引位置,如果不包含元素,则返回-1
长度及调整大小
int size(); //返回集合的长度
void trimToSize(); //调整当前的容量为实际size的大小(提高性能)
LinkedList集合
方法
添加
void addFirst(E e); //将指定元素插入此列表的开头。
void addLast(E e); //将指定元素添加到列表的结尾。
读取
E getFrist(); //返回此列表的第一个元素。
E getLast(); //返回此列表的最后一个元素。
移除
E removeFrist(); //移除并返回此列表的第一个元素。
E removeLast(); //移除并返回此列表的最后一个元素。
Set接口
特点(无序、不可重复)
(1)无序,对象不可以重复
(2)查找元素效率低,插入删除元素效率高(不会引起元素位置改变)。
遍历方式
(1)foreach
(2)迭代器
HashSet集合
方法
(1) 增
boolean add(E e); //如果集合中未包含指定元素,则添加指定元素
(2) 删
void clear(); //从集合中移除所有元素
boolean remove(Object o); //如果指定元素存在于集合中,则将其移除
************************************************
注意:Set集合中的HashSet因为是无序的,所以不像ArrayList那样用remove(index)指定下标的位置删除。
************************************************
(3) 查
Set集合中没有get();方法,因为它无序无编号的(不知道拿出来的是什么)。
解决办法 =============> 迭代器Iterator
迭代器Iterator作用:遍历Set集合或取Set集合中的值。
Iterator方法:
boolean hasNext(); //如果仍有元素可以迭代,则返回 true。
E next(); //返回迭代的下一个元素。
操作步骤:
第一: 声明迭代器(放到一个传送带上)
Iterator<String> 迭代名 = 集合名.iterator<String>();
例:Set ar = new HashSet();
ar.add("java01");
ar.add("java02");
ar.add("java03");
Iterator<String> it = ar.iterator<String>();
第二: 循环取出
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
注意
(1) 它不允许出现重复元素;
(2)不保证和政集合中元素的顺序
(3)允许包含值为null的元素,但最多只能有一个null元素。
面试题
如何证明Set集合中重复的数据是没有存进去还是替换了原来的?(面试)
解题思路:
只要证明存没存进去,就可以证明该题。
(没存进去,那就不存在替换;存进去了,那就是替换了原来的。)
那如何证明有没有存进去?
首先要先搞清java怎么判断2个对象是否相等
1. 先比较2个对象的身份证hashcode;
2. 再比较2个对象的equals是否相等。(是里和外比,还是外和里比?)
hashcode只是决定是否需要用equals来比较,真正决定对象是否相等的方法仍然是equals。
1.3 Queue接口
Map接口
特点
(1)无序、以键值对的形式添加元素,键不能重复,值可以重复
遍历方式
(1)先取出保存所有键的Set,再遍历Set即可(2种)。
(2)先取出保存所有Entry的Set,再遍历此Set即可。
描述
Map并不是一个真正意义上的集合,但是这个接口提供了三种“集合视角”,使得可以像操作集合一样操作。
HashMap
特点
根据键的HashCode值存储数据,查询快,最多允许一个键为NULL,多个值为NULL。
线程不同步
方法
存储(以“键-值”的方式进行存储)
V put(K key, V value) //将指定的值与此映射中的指定键关联
例:mp.put("CN","中华人民共和国");
mp.put("RU","俄罗斯联邦");
mp.put("US","美利坚合众国");
读取
V get(Object key) //返回指定键所映射的值,如没有值则返回null
例:mp.get("CN"); //键值,而不是下标
删除
V remove(Object key) //如果存在一个键的映射关系,则移除
例:mp.remove("RU");
集合大小
int size() //返回此映射中的键-值映射关系数
包含
boolean containsKey(Object key);
boolean containsValue(Object value);
例:mp.containsKey("CN"); //是否包含CN键
其他方法
mp.keySet(); //输出所有键的集合(注意不包括值)
mp.values(); //输出键所对应的值,比如“中华人民共和国”
mp.entrySet(); //返回此映射所包含的映射关系的 Set 视图
如何快速遍历Map集合
遍历保存的Entry的set
Map<String, String> map=new HashMap<>();
map.put("zs", "张三");
map.put("ls", "李四");
map.put("ww", "五五");
map.put("zs", "张山");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+"\t"+entry.getValue());
}