一、集合存储结构
Java集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map。
Collection是单列集合类的根接口,其有两个重要子接口 List 和Set。
(1)List接口的主要类有 ArrayList 和 LinkedList。
(2)Set接口的主要类有 HashSet和TreeSet。
(3)Map接口的主要实现类有HashMap 和 TreeMap
注意:
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。
LinkedList采用链表存储方式。插入、删除元素时效率比较高。
各接口的特点:
(1)List 接口存储一组不唯一,有序(插入顺序)的对象
(2)Set 接口存储一组唯一,无序的对象
(3)Map接口存储一组键值对象,提供key到value的映射
二、List
List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。
LinkedList采用链表存储方式。插入、删除元素时效率比较高。
1、 ArrayList
使用ArrayList存储元素:
//创建四个狗狗对象 ...
List dogs = new ArrayList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置
System.out.println("共计有" + dogs.size() + "条狗狗。");
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);
… …
}
使用ArrayList移除、判断元素:
import java.util.ArrayList;
import java.util.List;
/**
* 测试ArryList的remove()、contains()方法
*/
public class Test2 {
public static void main(String[] args) {
// 1、创建多个狗狗对象
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
// 2、创建ArrayList集合对象并把多个狗狗对象放入其中
List dogs = new ArrayList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog);
// 3、输出删除前集合中狗狗的数量
System.out.println("删除之前共计有" + dogs.size() + "条狗狗。");
// 4、删除集合中第一个狗狗和feifeiDog狗狗
dogs.remove(0);
dogs.remove(feifeiDog);
// 5、显示删除后集合中各条狗狗信息
System.out.println("\n删除之后还有" + dogs.size() + "条狗狗。");
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);
System.out.println(dog.getName() + "\t" + dog.getStrain());
}
//6、判断集合中是否包含指定狗狗信息
if(dogs.contains(meimeiDog))
System.out.println("\n集合中包含美美的信息");
else
System.out.println("\n集合中不包含美美的信息");
}
}
List接口常用方法:
2、LinkedList
使用LinkedList存储元素:
// 创建多个狗狗对象...
LinkedList dogs = new LinkedList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.addLast(meimeiDog);
dogs.addFirst(feifeiDog);
Dog dogFirst= (Dog)dogs.getFirst();//获取集合第一条信息
System.out.println("第一条狗狗昵称是"+dogFirst.getName() );
Dog dogLast= (Dog)dogs.getLast();//获取集合最后一条信息
System.out.println("最后一条狗狗昵称是"+dogLast.getName());
dogs.removeFirst();//删除集合第一条信息
dogs.removeLast(); //删除集合最后一条信息
LinkedList的特殊方法:
三、Map
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作,最常用的实现类是HashMap。
使用HashMap存储数据:
Map countries = new HashMap();
countries.put("CN", "中华人民共和国");
countries.put("RU", "俄罗斯联邦");
countries.put("FR", "法兰西共和国");
countries.put("US", "美利坚合众国");
String country = (String) countries.get("CN");//获取指定元素的值
//… …
System.out.println("Map中共有"+countries.size() +"组数据");//获取元素个数
countries.remove("FR");//删除指定元素
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
System.out.println( countries.keySet() ) ;//显示键集
System.out.println( countries.values() );//显示值集
System.out.println( countries );//显示键值对集
Map接口常用方法:
Hashtable和HashMap的异同:
实现原理、功能相同,可以互用。
主要区别:
Hashtable继承Dictionary类,HashMap实现Map接口
Hashtable线程安全,HashMap线程非安全
Hashtable不允许null值,HashMap允许null值
注意:开发过程中,最好使用ArrayList和HashMap。
四、简单示例
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Strings {
public static void main(String[] args) {
List<Integer> list1=new ArrayList<Integer>();
list1.add(15);
list1.add(676);
list1.add(9000000);
System.out.println(list1);
List<Map<String, Integer>> list=new ArrayList<Map<String,Integer>>();
Map<String, Integer> map=new HashMap<String,Integer>();
map.put("张三",100);
map.put("小二",90);
Map<String, Integer> map2=new HashMap<String,Integer>();
map2.put("王五",98);
map2.put("赵柳",80);
//Map<String, String> map3=new HashMap<String,String>();
list.add(map);
list.add(map2);
//list.add(map3);
System.out.println(list);
}
}
运行结果: