7.30学习总结

7.30学习总结

集合

概述:

1、一种工具类,用于存储数量不等的对象,并实现常用的数据结构;还可以保存具有映射关系的关系数组。
2、JAVA集合只能存放引用类型的数据,不能存放基本数据类型。

主要类型:

Set:

无序的、不可重复的集合。支持数学中的集合操作,如:交、并。

import java.util.HashSet;
import java.util.Set;

public class T {
    public static void main(String[] args) {
        //重复的值只输出一个,里面的值不可以重复,根据存储的顺序输出
        //第一次可以执行成功,返回true
        System.out.println(set1.add("asd"));
        //第二次执行失败,返回false
        System.out.println(set1.add("asd"));
        //内存中有顺序,相同的值不能加进去
        set1.add("qwe");
        set1.add("qwrt");
        set1.add("zdcf");
        for(String str:set1){
            System.out.println(str);
        }
    }
}
运行结果:
true
false
asd
zdcf
qwrt
qwe

上述程序可以看出,set列表中的值不可重复,且输出的结果的顺序没有规律。

List:

有序的、可重复的集合。使用此接口能够精确的控制每个元素插入的位置,用户能够使用索引来访问List中的元素。如下面代码所示:

import java.util.ArrayList;
import java.util.List;

public class T1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        //重复的值可以输出,即集合里可以存储重复的值
        System.out.println(list.add("1"));
        list.add("2");
        System.out.println(list.add("1"));
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}
运行结果:
true
true
1
2
1
Map:

Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象,提供按键对象查找值对象。Map没有继承于Collection接口。

import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String >();
        map.put("1", "a");
        map.put("2", "b");
        map.put("3", "a");//key的值不一样,value的值可以一样
        map.put("1", "as");
        for(String i : map.keySet()){
            System.out.println(i+":"+map.get(i));
        }
    }
}
运行结果:
1:as
2:b
3:a

在上述代码中,可以看出,Map中存储的数据是有顺序的,且相同的“k”值,其前面的value值会被覆盖。

特点比较:

1、有序性:
set:无序集合,我们可以看到的是,输出的结果无序。
Map:有序集合,输出的结果按照key值得顺序排列。
List:有序集合,输出的结果与输入的顺序一致。

2、可重复性:
set:不可重复,若添加的值在列表中已经存在,那这个值是添加不进去的,add()函数会返回false。
Map:在同一个Map对象中,Key值不可相同,而不同Key值对应的value值可以相同;如果,key值相同,则前面的value值会被后添加的value值覆盖。在不同的Map对象中Key值是可以相同的。
List:在List列表中可以存储相同的数据。

3、是否有索引值:
List集合和Map集合有索引值,而Set集合没有索引值。
Map可提供Key值索引。

常用的集合:
ArrayList、LinkedList、HashMap

实例

1、身份证信息的存储

所用列表集合:
Map、List
Map集合用来存放每个身份证中存放的信息,需要创建多个Map对象,每个Map对象对应一个人;(不同的Map对象中的Key值可以相同。)
List列表集合用来存储Map对象,即存储多个人的身份证信息。

代码实现如下:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

//用Map实现身份证,一个人对应一个Map
public class Mapp {
    public static void main(String[] args) {
        Map<String,String> map1 = new HashMap<String,String>();
        //List中用的是HashMap,在添加时,参数的类型也必须是HashMap类型
        List<Map<String,String>> list = new LinkedList<Map<String,String>>();
        //可以将List的类型改为<object>
        map1.put("name", "刘胡兰");
        map1.put("sex", "女");
        map1.put("nation", "汉");
        map1.put("birth", "1995-03-12");
        map1.put("addr", "北京市海淀区");
        map1.put("idcard", "140821199503120098");
        list.add(map1);
        HashMap<String,String> map2 = new HashMap<String,String>();
        map2.put("name", "王二小");
        map2.put("sex", "男");
        map2.put("nation", "汉");
        map2.put("birth", "1990-09-12");
        map2.put("addr", "北京市海淀区");
        map2.put("idcard", "111425199009120067");
        list.add(map2);
        //map1和map2是两个map对象,两个map中的key值可以一样,同一个map对象中的key值不能相同
        for(int i=0;i<list.size();i++){
            System.out.println("第"+(i+1)+"个人的信息:");
            System.out.println(list.get(i).get("name"));
            System.out.println(list.get(i).get("sex"));
            System.out.println(list.get(i).get("nation"));
            System.out.println(list.get(i).get("birth"));
            System.out.println(list.get(i).get("addr"));
            System.out.println(list.get(i).get("idcard"));
        }
    }
}
运行结果:
第1个人的信息:
姓名:刘胡兰
性别:女
民族:汉
出生日期:1995-03-12
地址:北京市海淀区
身份证号:1408211995031200982个人的信息:
姓名:王二小
性别:男
民族:汉
出生日期:1990-09-12
地址:北京市海淀区
身份证号:111425199009120067

2、订单
显示用户的订单信息,包括用户名、订单号、地址(包括,姓名、详细地址、电话)、商品。
由于地址中包括姓名、详细地址、电话,把地址定义成List列表类型,存放数据;一个人可以一次性购买多种商品,因此也将商品定义为列表类型。
代码如下:
Person类:

import java.util.List;
import java.util.Map;

public class Person {
    private String name;
    private String order_id;
    private Map<String,String> addr;
    private List<String> book;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getOrder_id() {
        return order_id;
    }
    public void setOrder_id(String order_id) {
        this.order_id = order_id;
    }
    public Map<String, String> getAddr() {
        return addr;
    }
    public void setAddr(Map<String, String> addr) {
        this.addr = addr;
    }
    public List<String> getBook() {
        return book;
    }
    public void setBook(List<String> book) {
        this.book = book;
    }
}

PersonTest类:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class PersonTest {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("qwer");
        person.setOrder_id("1234567890");
        Map<String,String> addr = new HashMap<String,String>();
        addr.put("姓名:", "qwer");
        addr.put("电话:", "13567432345");
        addr.put("详细地址:", "北京市海淀区");
        person.setAddr(addr);
        List<String> books = new LinkedList<String>();
        books.add("books1");
        books.add("books2");
        books.add("books3");
        person.setBook(books);
        System.out.println("用户名:"+person.getName());
        System.out.println("订单id:"+person.getOrder_id());
        System.out.println("地址:"+person.getAddr());
        System.out.println("商品:"+person.getBook());
    }
}

运行结果:
用户名:qwer
订单id:1234567890
地址:{详细地址:=北京市海淀区, 电话:=13567432345, 姓名:=qwer}
商品:[books1, books2, books3]

遍历方式

Map集合的遍历方式:

四种:
第一种:for-each:

//遍历方式一,获取到keySet的集合,然后通过集合输出
for(String c : map.keySet()){//遍历
    System.out.print(map.get(c)+" ");
}

对方式一使用迭代器:

System.out.println();
Iterator<String> iteratorset = map.keySet().iterator();
while(iteratorset.hasNext()){
    System.out.println(iteratorset.next()+":"+map.get(iteratorset.next()));
}
-----------------------------------------------------------
while(iteratorset.hasNext()){
    String s = iteratorset.next();
    System.out.println(s+":"+map.get(s));
}

上面的代码中写了两种迭代器方法,但第一种是错的,便利结果只输出了列表中值得一般,原因是在一次输出语句中执行了两次iteratorset.next()方法。
第二种修改后,可以成功遍历。

在写这种遍历时,犯了错误,把第一种的输出语句写成了这样:
System.out.println(iteratorset.next()+”:”+map.get(iteratorset));
结果倒是可以成功遍历列表中的所有值,但是输出的结果全为null,原因是把iteratorset当作对象传进了map.get()方法中,但并没有对iteratorset对象赋值,所以遍历出的结果全为null。
如下面图片所示:
这里写图片描述

方式二:

//遍历方式二
for(Entry<String,String> entry : map.entrySet()){
    System.out.print(entry.getKey()+":"+entry.getValue()+" ");
}

方式三:

for(String str : map.values()){
    System.out.print(str+" ");
}

方式四:

//遍历方式四:迭代器,利用迭代器迭代set,与第二种原理一样
Iterator<Entry<String,String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
    Entry<String,String> entry = iterator.next();
    System.out.println(entry.getKey()+":"+entry.getValue());
}

HashSet列表的两种遍历方法:

//方式一
for(String str : set){
    System.out.println(str);
}
//方式二
Iterator<String> it = set.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

ArrayList的三种遍历方法:

import java.util.ArrayList;
import java.util.Iterator;

public class C {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<String>();
        arr.add("asdfgt");
        arr.add("zxcvbn");
        arr.add("qwdefgt");
        //方式一,for循环
        for(int i=0;i<arr.size();i++){
            System.out.print(arr.get(i)+" ");
        }
        //方式二,for-each循环
        System.out.println();//用于换行
        for(String str : arr){
            System.out.print(str+" ");
        }
        //方式三,迭代器
        System.out.println();//用于换行
        Iterator<String> it = arr.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();//用于换行
        System.out.println(arr);
        arr.remove("zxcvbn");//删除元素
        System.out.println(arr);    
    }
}

运行结果:
asdfgt zxcvbn qwdefgt 
asdfgt zxcvbn qwdefgt 
asdfgt zxcvbn qwdefgt 
[asdfgt, zxcvbn, qwdefgt]
[asdfgt, qwdefgt]


今天的学习知识将老师上课上运行的代码实现了,虽然列表的使用大致相同,但实现时还是会有细微的差别,如遍历时,所用到的方法都不尽相同。由于之前编写代码并没有过多的涉及到列表,对于今天学习的知识掌握的还不是很牢固,要想熟练掌握,还要再进行反复练习。



集合练习题

1、 创建一个List,在List 中增加N个工人,工人信息存储在Map中,基本信息如下:
姓名 年龄 工资
zhang3 18 3000
li4 25 3500
wang5 22 3200
……
2、利用for 循环遍历,打印List 中所有工人的信息
3、利用迭代遍历,对List 中所有的工人信息进行遍历。
4、把所有人的姓名存储在Set中,遍历输出所有姓名。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class O {
    public static void main(String[] args) {
        List<HashMap<String,String>> list = new LinkedList<HashMap<String,String>>();
        HashMap<String,String> map1 = new HashMap<String,String>();
        map1.put("姓名", "zhang3");
        map1.put("年龄", "18");
        map1.put("工资", "3000");
        list.add(map1);
        HashMap<String,String> map2 = new HashMap<String,String>();
        map2.put("姓名", "Li4");
        map2.put("年龄", "20");
        map2.put("工资", "2500");
        list.add(map2);
        HashMap<String,String> map3 = new HashMap<String,String>();
        map3.put("姓名", "Wang5");
        map3.put("年龄", "22");
        map3.put("工资", "3200");
        list.add(map3);
        HashMap<String,String> map4 = new HashMap<String,String>();
        map4.put("姓名", "liuliu");
        map4.put("年龄", "18");
        map4.put("工资", "8000");
        list.add(map4);
        HashMap<String,String> map5 = new HashMap<String,String>();
        map5.put("姓名", "zhouqi");
        map5.put("年龄", "25");
        map5.put("工资", "3500");
        list.add(map5);
        //for循环遍历
        for(int i=0;i<list.size();i++){
            System.out.println("第"+(i+1)+"个人的信息:");
            System.out.println("姓名:"+list.get(i).get("姓名"));
            System.out.println("年龄:"+list.get(i).get("年龄"));
            System.out.println("工资:"+list.get(i).get("工资")+"\n");
        }
        //迭代器遍历
        Iterator<HashMap<String,String>> it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        //所有姓名存放在Set中
        HashSet<String> set = new HashSet<String>();
        String[] a = new String[5];
        for(int i=0;i<list.size();i++){
            a[i] = list.get(i).get("姓名");
            set.add(a[i]);
        }
        System.out.println("输出的姓名如下:");
        for(String i : set){
            System.out.print(i+"  ");
        }
    }
}

运行结果:
第1个人的信息:
姓名:zhang3
年龄:18
工资:30002个人的信息:
姓名:Li4
年龄:20
工资:25003个人的信息:
姓名:Wang5
年龄:22
工资:32004个人的信息:
姓名:liuliu
年龄:18
工资:80005个人的信息:
姓名:zhouqi
年龄:25
工资:3500

{姓名=zhang3, 工资=3000, 年龄=18}
{姓名=Li4, 工资=2500, 年龄=20}
{姓名=Wang5, 工资=3200, 年龄=22}
{姓名=liuliu, 工资=8000, 年龄=18}
{姓名=zhouqi, 工资=3500, 年龄=25}
输出的姓名如下:
zhang3  zhouqi  Wang5  Li4  liuliu  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值