写在前面
java学习笔记 六——容器
容器Collection
Collection父接口,下面有List和Set子接口。
- List 是有序、可重复的容器。
- List中每个元素都有索引标记,可根据索引访问元素
- 允许加入重复元素,即元需满足e1.equals(e2);的元素重复加入
- Set 无序,不可重复
- Set中元素没有索引,查找只能便利。
- 不允许加入重复的元素,当新元素和Set中某个元素通过equals方法对比为true,则不能够加入,null元素也只能最多存入一个
Collection接口中定义的方法(List和Set都有):

List中定义的一些方法
- void add(int index,Object element)在指定位置插入元素,并将之后的元素后移一位
-
Object set(int index,Object element)修改指定位置元素
-
Object get(int index)返回指定位置元素
-
Object remove(int index)删除指定位置元素,其后的元素前移一位
-
int indexOf(Object o)返回第一个匹配元素的索引,如果没有该元素则返回-1
System.out.println(list.indexOf("B")); // 从头到尾找到第一个"B" - int lastIndexOf(Object o)返回最后一个匹配元素的索引,如果没有该元素则返回-1
System.out.println(list.lastIndexOf("B")); //从尾到头找到第一个"B"
List接口常用的实现类:ArrayList,LinkedList,Vector
- ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。(用的较多)
-
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全
-
Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。
使用选择:(ArrayList用的最多)
- 需要线程安全的话,用Vector
- 不考虑线程安全,且查找较多时,使用ArrayList
- 不考虑线程安全,且增加和删除元素较多时用LinkedList
Map接口
Map存储的是键值对,key-value。通过键来标识,因此键不可以重复。
Map接口中的实现类有HashMap、TreeMap、HashTable、Properties等。
Map接口中的常用方法
- Object put(Object key,Object value) 存放键值对
- Object get(Object key) 通过键对象查找到值对象
- Object remove(Object key)删除键对象对应的键值对
- boolean containsKey(Object key)Map容器中是否包含键对象所对应的键值对
- boolean containsValue(Object value)Map容器中是否包含值对象对应的键值对
- int size()包含键值对的数量
- boolean isEmpty()Map是否为空
- void putAll(Map map2)将map2的所有键值对存放到map中
- void clear()清空本map对象所有键值对
package cn.xgblack.studyCollection; import java.util.HashMap; import java.util.Map; /** * 测试HashMap的使用 * @author xg * @time 2019年4月21日 */ public class TestMap { public static void main(String[] args) { Map<Integer,String> m1 = new HashMap<>(); m1.put(1, "one"); m1.put(2, "two"); m1.put(3, "three"); System.out.println(m1.get(1)); System.out.println(m1.size()); System.out.println(m1.isEmpty()); System.out.println(m1.containsKey(2)); System.out.println(m1.containsValue("four")); Map<Integer,String> m2 = new HashMap<>(); m2.put(4, "四"); m2.put(5, "五"); m1.putAll(m2); System.out.println(m1); //map中健不能重复,(是否重复根据equals方法判断)如果重复,则新的覆盖掉旧的 m1.put(3, "新的三"); System.out.println(m1); } }

HashMap: 线程不安全,效率高。允许key或value为null。
HashTable: 线程安全,效率低。不允许key或value为null。
TreeMap是红黑二叉树实现的
Collections工具类常用方法(并不是Collection接口)
- void sort(List) 对List容器内的元素排序,(升序)
- void shuffle(List) 对List容器内的元素进行随机排列
- void reverse(List) 对List容器内的元素进行逆序排列
- void fill(List, Object) 用一个特定的对象重写整个List容器
- int binarySearch(List, Object) 对于顺序的List容器,采用折半查找的方法查找特定对象
package cn.xgblack.studyCollection; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Collections辅助类的使用(非接口) * @author xg * @time 2019年4月21日 */ public class TestCollections { public static void main(String[] args) { List<String> list = new ArrayList<>(); for(int i = 0;i<10;i++) { list.add("xg" + i); } System.out.println(list); Collections.shuffle(list);//随机排列List中的元素 System.out.println(list); Collections.reverse(list);//逆序排列 System.out.println(list); Collections.sort(list);//按照递增的方式排序 自定义类的使用:Comparable接口 System.out.println(list); System.out.println(Collections.binarySearch(list, "xg1"));//二分法查找 } }

存储表格
使用Map和List
package cn.xgblack.studyCollection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * ORM思想:对象关系映射 * @author xg * @time 2019年4月21日 */ public class TestStoreData { public static void main(String[] args) { Map<String,Object> row1 = new HashMap<>(); row1.put("id", 1001); row1.put("name", "张三"); row1.put("薪水", 20000); row1.put("入职日期", "2018.05.04"); Map<String,Object> row2 = new HashMap<>(); row2.put("id", 1002); row2.put("name", "李四"); row2.put("薪水", 30000); row2.put("入职日期", "2019.06.04"); Map<String,Object> row3 = new HashMap<>(); row3.put("id", 1002); row3.put("name", "王五"); row3.put("薪水", 3000); row3.put("入职日期", "2019.01.04"); List<Map<String,Object>> table1 = new ArrayList<>(); table1.add(row1); table1.add(row2); table1.add(row3); for(Map<String,Object> row : table1) { Set<String> keyset = row.keySet(); for(String key:keyset) { System.out.print(key + ":" + row.get(key) + "\t"); } System.out.println(); } } }

使用javabean和Map或者javabean和List
package cn.xgblack.studyCollection; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * 每一行数据使用Javabean对象存储,多行使用Map或List * @author xg * @time 2019年4月21日 * @author xg * @time 2019年4月21日 */ public class TestStoreData2 { public static void main(String[] args) { User u1 = new User(1001, "张三", 5000, "2018.05.01"); User u2 = new User(1002, "李四", 6000, "2019.05.01"); User u3 = new User(1003, "王五", 8000, "2020.05.01"); List<User> list = new ArrayList<>(); list.add(u1); list.add(u2); list.add(u3); for(User u:list) { System.out.println(u); } Map<Integer,User> map = new HashMap<>(); map.put(1001, u1); map.put(1002, u2); map.put(1003, u3); Set<Integer> keyset = map.keySet();; for(Integer key:keyset) { System.out.println(key + "----" + map.get(key)); } } } class User{ private int id; private String name; private double salary; private String hiredate; //一个完整的javabean。要有get和set方法,以及无参的构造方法 public User() { } public User(int id, String name, double salary, String hiredate) { super(); this.id = id; this.name = name; this.salary = salary; this.hiredate = hiredate; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getHiredate() { return hiredate; } public void setHiredate(String hiredate) { this.hiredate = hiredate; } @Override public String toString() { return "id:" + id + ",name:" + name + ",salary:" + salary + ",hiredate:" + hiredate; } }

小结
容器的难度较之前提高了不少,有很多内容看完就忘记的差不多了,感觉现在回想一下,皮毛都没有学到。
退出登录?