1.0 List接口
特点:有序,带索引,可重复
API:
- add(E e)集合末尾添加元素,返回booelan
- add(int index,Object obj),指定位置添加对象
- remove(int index),删除指定位置的元素
- remove(Object obj),删除第一次出现的指定元素
- set(int index.Object obj)在集合指定位置设置元素
1.0.1 迭代器并发修改异常
场景:在迭代集合的同时,向集合中新添加了元素,而迭代器却不知道,所以就报错了,也就是说在迭代集合的时候集合是不能修改元素的。
解决办法:
- 迭代器迭代元素,迭代器修改元素(listIterator)
- 集合遍历元素,集合修改元素(普通for而不是增强for,增强for本身就是一种迭代器的替代)
Collection<String> list = new ArrayList<String>();
list.add("404");
list.add("502");
list.add("200");
//迭代器迭代元素,迭代器修改元素
ListIterator it = list.listIterator();
while(it.hasNext()){
String str = it.next();
if("200".equals(str)){
it.add("300");
}
System.out.println(str);
}
// 集合遍历元素,集合修改元素
for(int i;i<list.size();i++{
String str =(String)list.get(i);
if(str.equals("200"){
list.add("300");
}
}
1.0.2List集合存储数据的结构
List下集合存储数据的结构种类:堆栈、队列、数组、链表
- 堆栈数据结构特点:先进后出
- 队列数据结构特点:先进先出
- 数组结构特点:查找快,增删慢
- 链表结构特点:查找慢,增删快(链表结构就是通过多个节点之间的牵手,每个节点由两部分组成:数据域+指针域)
ArrayList由于在开发过程中更多的的是对数据的查找,所以ArrayList用的是数组结构。
LinkedList:实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,LinkedList集合数据存储的结构是链表结构
集合框架结构图.png
2.0 Set接口
特点:不重复,无序
2.0.1 HashSet集合是实现Set接口,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
什么是哈希表呢?
哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。
当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。
总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。
HashSet集合存储JavApi提供的对象时不需要重写hasCode和equals方法,因为已经重写过啦,而对于自定义的类型就需要重写hashCode和equals方法
2.0.2 LinkedHashSet:HashSet是无序的集合结构,在HashSet下面还有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构,可以实现有序的输出集合元素。
3.0 Map接口
3.0.1 Map接口常用API
- put(K key,V value),存键值对
- remove(Object key),移除键值对
- get(Object key)获取键对应的值
3.0.2 Map集合通过键遍历值
- 获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键
- 遍历键的Set集合,得到每一个键
- 根据键,获取键所对应的值
Map<String,String> map = new HashMap<String,String>();
map.put("中国","北京");
map.put("英国”,"伦敦");
//获取map中的key
Set<String> setKey = map.keySet();
//遍历存放所有key的Set集合
Iterator<String> it = setKey.iterator();
while(it.hasNext()){
String key = it.next();
String value = map.get(key);
}
上面是通过建获取值的方式遍历map集合,下面还有一种方式是通过获取集合中每个键值对对象的方式来获取集合中的键值对对象的键与值。Map类提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。
Map.Entry的API:
- getKey(),放回此键值对对象的键值
- getValue(),返回此键值对对象的值
- entrySet(),返回Map结合中所有键值对对象,并以Set<Map.Entry<K,V>>集合形式返回
Map<String,String> map = HashMap<String,String>();
map.put("中国","北京");
map.put("英国”,"伦敦");
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<String,String> entry = it.next();
String key = entry.getKey()
String value = entry.getValue();
}
注意事项:
-
Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
-
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。
-
如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合来存放。
-
在第二种方式获取Map集合 键值对的时候使用的是Map.Entry,Map类下面的静态方法Entry,在源码中我们经常需要使用Map.Entry,而如果使用静态导入import java.util.Map.Entry,则在使用的过程中就可以直接用Entry替代Map.Entry,节省代码量。
-
在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以简化参数的表示形式。
JDK1.5之前多参的定义
public void getSum(int n1,int n2,int n3){}
上述操作等价于
public void getSum(int[] arr){}
JDK1.5之后
public void getSum(int...num){}//其中num相当于数组
如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。
public void getSum(String str,int...num){}
上一篇:Java常用API
下一篇:Java FileStream 笔记
网友评论