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
地址:北京市海淀区
身份证号:140821199503120098
第2个人的信息:
姓名:王二小
性别:男
民族:汉
出生日期: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
工资:3000
第2个人的信息:
姓名:Li4
年龄:20
工资:2500
第3个人的信息:
姓名:Wang5
年龄:22
工资:3200
第4个人的信息:
姓名:liuliu
年龄:18
工资:8000
第5个人的信息:
姓名:zhouqi
年龄:25
工资:3500
{姓名=zhang3, 工资=3000, 年龄=18}
{姓名=Li4, 工资=2500, 年龄=20}
{姓名=Wang5, 工资=3200, 年龄=22}
{姓名=liuliu, 工资=8000, 年龄=18}
{姓名=zhouqi, 工资=3500, 年龄=25}
输出的姓名如下:
zhang3 zhouqi Wang5 Li4 liuliu