1.集合框架简介
1.1 为什么使用集合框架
缘由:由于数组在创建的时候会默认定义数组的长度,而数组的长度是不变的,所以导致数组的赋值及创建会有内存浪费的现象,于是集合作为可以更改长度的数组,可以解决内存浪费的现象
1.2 Java集合框架架构图
标准说法:
- 集合有两个父接口Collection,Map
- Collection有两个子接口List和Set
- List有两个常见的实现类ArrayList和LinkedList
- Set有两个常见的实现类HashSet和TreeSet
- Map有两个常见的实现类HashMap和TreeMap
备注:标红的是我们常见的也是我们本章学习重点,其余两个不是很常见
1.3 Java集合框架特点
(1)List 特点:有序,可重复
(2)Set 特点:无序,不可重复
(3)Collection 特点:无序,可重复
(4)Map 特点:存放一对值【键值对】(key 键,value 值)
2.List接口
2.1 List接口的实现类:(ArrayList和LinkedList的区别)
(1)ArrayList特点:查询效率高,增删改效率低【数组的形式去存储的】
(2)LinkedList特点:查询效率低,增删改效率高【链表的形式去存储的】
2.2 ArrayList集合类
(1)实例化ArrayList对象
//1、实例化集合对象
ArrayList arrayList = new ArrayList();
(2)添加数据add()
第一种:默认顺序添加数据
//2、给集合添加数组
arrayList.add(1);
arrayList.add(true);
arrayList.add("jojo");
arrayList.add(23.4);
第二种:通过角标添加数据
//第二种给集合添加数据
arrayList.add(0,1);
arrayList.add(1,true);
arrayList.add(2,"jojo");
备注: 这里如果角标原来已经有元素会怎么样,会把这个角标占领,其余元素向后移
(3)删除数据remove()
第一种:通过角标删除数据(1代表角标)
arrayList.remove(1);
第二种:通过值删除数据(“1”代表值不是角标)
arrayList.remove("1");
备注:这里有的同学可能就有疑问,这里的集合不是可以存放任何元素吗,那么remove中的参数如何判断输入的整数是参数还是角标呢,比方说如果这里是12,而集合里没有角标12而有数字12,这里会不会把数字为12的元素删除呢?这里回答你不会,remove()对参数的识别是先角标后数据,而数字默认都是角标。
(4)查询数组
第一种:传统for循环
//3、查询数组中的集合信息【for循环】
for (int i = 0 ; i < arrayList.size() ; i++){
System.out.println(arrayList.get(i));
}
第二种:增强for循环
//第二种获取集合中数据【foreach循环】
for (Object o : arrayList){
System.out.println(o);
}
(5)拓展:
arrayList.size()是获取数组长度的方法
arrayList.get(i)是获取数组每个元素值
2.3 ArrayList集合类(泛型)
泛型:<>用指定集合存放数据类型,这里面放的必须是包装类型,比如基本类型int就不能放进去,会编译失败,得放int的包装类型Integer
(1) ArrayList存放String类型
ArrayList<String>arrayList = new ArrayList<String>();
arrayList.add("i'm ");
arrayList.add("a ");
arrayList.add("jojo");
arrayList.add(2,"one");//通常不用这个添加方式
(2)ArrayList存放Integer类型
//泛型中如果存放基本数据类型必须是包装类型,int的包装类型是Integer类型
ArrayList<Integer>arrayList1 = new ArrayList<Integer>();
(3)ArrayList存放对象类型数据
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
}
public static void main(String[] args) {
User user1 = new User(100,"jojo","jojo123");
User user2 = new User(101,"小杰","xiaojie123");
User user3 = new User(102,"奇呀","qiya123");
User user4 = new User(103,"库洛洛","kuluoluo123");
ArrayList<User> arrayList = new ArrayList<>();
arrayList.add(user1);
arrayList.add(user2);
arrayList.add(user3);
arrayList.add(user4);
for (int i = 0 ; i < arrayList.size() ; i++){
System.out.println("id:"+arrayList.get(i).getId()+"\t用户名:"+arrayList.get(i).getName()+"\t密码:"+arrayList.get(i).getPwd());
}
}
2.4 LinkedList集合类
(1) LinkedList存放Object类型数据
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add("11");
linkedList.add("jojo");
linkedList.add("奇呀");
for (int i = 0 ; i < linkedList.size() ; i++){
System.out.println(linkedList.get(i));
}
}
(2)LinkedList存放对象类型数据
User user1 = new User(100,"jojo","jojo123");
User user2 = new User(101,"小杰","xiaojie123");
User user3 = new User(102,"奇呀","qiya123");
User user4 = new User(103,"库洛洛","kuluoluo123");
LinkedList<User> linkedList = new LinkedList<>();
linkedList.add(user1);
linkedList.add(user2);
linkedList.add(user3);
linkedList.add(user4);
(3)拓展
LinkedList的泛型和ArrayList的泛型含义一样,但多了一些它独有的方法
//如果使用LinkedList中独有的方法addFirst(),linkedList.addLast(),removeFirst()等等
//则不可以使用List<User> linkedList = new LinkedList();只能使用
//LinkedList<User> linkedList = new LinkedList<>();
linkedList.addFirst(user2);
linkedList.addLast(user2);
3.Set接口
3.1 Set的添加数据以及遍历输出
public static void main(String[] args) {
Set set = new HashSet() ;
set.add(1);
set.add("hh");
set.add(true);
set.add(123);
set.add("小杰");
set.add("hh");
//iterator迭代器
Iterator its = set.iterator();
while ((its.hasNext())){
Object o = (Object) its.next();
System.out.println();
}
}
核心要点1:iterator()获取迭代器对象
核心要点2:hasnext()判断是否有下一个值
核心要点3:next()获取下一个值
核心要点4:set集合是没有顺序的
核心要点5:sets集合不可存放重复的数据(去重)
3.2 Set 泛型 -String
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("小杰");
set.add("库洛洛");
set.add("西索");
set.add("杰洛");
Iterator iterator = set.iterator();
while (iterator.hasNext()){
Object o = (Object) iterator.next();
System.out.println(o);
}
}
3.3 Set 泛型 -对象类型
public static void main(String[] args) {
User user1 = new User(100,"jojo","jojo123");
User user2 = new User(101,"小杰","xiaojie123");
User user3 = new User(102,"奇呀","qiya123");
User user4 = new User(103,"库洛洛","kuluoluo123");
Set<User> sets = new HashSet<>();
sets.add(user1);
sets.add(user2);
sets.add(user3);
sets.add(user4);
Iterator<User> iterator = sets.iterator();
while (iterator.hasNext()){
User user = iterator.next();
System.out.println("id:"+user.getId()+"\t用户名:"+user.getName()+"\t密码:"+user.getPwd());
}
}
4.Map接口
4.1 HashMap使用
(1)实例化HashMap
//实例化HashMap对象
Map map = new HashMap();
(2)给HashMap赋值
//给HashMap对象添加值
map.put("a", 1);
map.put(true,231.1);
map.put(99, "ok");
(3)遍历HashMap
a)第一种
Set set = map.keySet();//获取map集合中所有的key值
System.out.println(set);
//1、通过foreach-增强for循环获取所有key对应的value值
for (Object o : set){
System.out.printf(map.get(o)+"\t");//获取key对应的value值
}
b)第二种
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
Object o = iterator.next();
System.out.printf(o+"\t");
System.out.println(map.get(o)+"\t");
}
4.2 map -泛型
public class Demo10 {
public static void main(String[] args) {
//实例化HashMap对象
Map<String ,Object> map = new HashMap<>();
//给HashMap对象添加值
map.put("奇呀", 1);
map.put("西索",231.1);
map.put("小杰", true);
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String st = iterator.next();
System.out.printf("key:"+st+"\t");
System.out.println("value:"+map.get(st));
}
}
}
5. 综合训练
1.遍历List<Map<String,Object>> (难度:中等)
public class Demo12 {
public static void main(String[] args) {
Map<String ,Object> map = new HashMap<>();
map.put("奇呀", 1);
map.put("西索",231.1);
map.put("小杰", true);
Map<String,Object> map0 = new HashMap<>();
map0.put("团长", 234);
map0.put("侠客",1.13);
map0.put("武藏", false);
List<Map<String ,Object>> list = new ArrayList<>();
list.add(map);
list.add(map0);
for (Map<String ,Object> map1 : list){
Set<String> set = map1.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String st = iterator.next();
System.out.print("Key:"+st+"\t\t");
System.out.println("Value:"+map1.get(st));
}
System.out.println("************************");
}
}
}
2.遍历List<List<String>> (难度:简单)
public class Demo13 {
public static void main(String[] args) {
List<String>list = new ArrayList<>();
list.add("jojo");
list.add("小杰");
List<String>list1 = new ArrayList<>();
list1.add("jojo1");
list1.add("奇呀");
List<String>list2 = new ArrayList<>();
list2.add("jojo2");
list2.add("库洛洛");
List<List<String>> lists = new ArrayList<>();
lists.add(list);
lists.add(list1);
lists.add(list2);
for (List<String> l1 : lists){
for (String st : l1){
System.out.println(st);
}
System.out.println("**************");
}
}
}
3.遍历Map<String,Map<String,Object>> (难度:中等偏上)
public class Demo14 {
public static void main(String[] args) {
Map<String,Object> map = new HashMap<>();
map.put("奇呀", 1);
map.put("西索",231.1);
map.put("小杰", true);
Map<String,Object> map0 = new HashMap<>();
map0.put("团长", 234);
map0.put("侠客",1.13);
map0.put("武藏", false);
Map<String,Map<String,Object>> map1 = new HashMap<>();
map1.put("ok",map);
map1.put("jojo",map0);
Set<String> set = map1.keySet();
Iterator<String>iterator = set.iterator();
while (iterator.hasNext()){
String st = iterator.next();
System.out.println("Key:"+st);
System.out.println("Value:");
Map<String,Object> mapOne = map1.get(st);
Set<String> set1 = mapOne.keySet();
Iterator<String>iterator1 = set1.iterator();
while (iterator1.hasNext()){
String st1 = iterator1.next();
System.out.print("Key:"+st1+"\t");
System.out.println("Value:"+mapOne.get(st1));
}
System.out.println("*********************");
}
}
}