折纸的不归路(16)

一.集合的后续–Map

如何确定排序

首先可以给一个正数或者给一个前-后,然后判定最后的顺序是否是我们需要的顺序,
如果不是,则进行调换
如果比较的是两个数字,前-后代表升序,后-前代表降序
如果比较的是两个字符串,我们可以调用字符串的自然排序的方法,compareTo方法
如果比较的是两个对象,且没有大小关系,可以通过返回正负数的方式来完成位置交换
奇数在前 偶数在后
第一个数是偶数,第二个数是奇数,所以返回一个正整数

Map保存的是键值对

Map有如下功能

增:put(k,v);
删:remove(k);
改:put(k,v);
查:get(k);
直接输出map对象得到的结果形式:
{key1=value1,key2=value2,…}

Map集合的遍历

map集合遍历的是key值还是value值?
value值,根据业务需求,有的时候也需要key-value的映射关系
1.map.values();获得所有的values(只知道values中的值,没有映射)
2.map.keySet();获得所有的keys,通过遍历keySet集合中的每个key值,得到对应的value值
3.map.entrySet();获得所有的key-value的集成对象entry,通过entry对象去获得key和value

Map功能的相关代码实现

package day14;
import java.util.*;

import com.briup.day06.Student;
public class MapTest {
	public static void main(String[] args) {
		Map map = new HashMap();
		//增
		map.put(1, "tom");
		map.put("2", new Student("tom",20,"男"));
		Student s1 = new Student("tim",21,"女");
		map.put(s1, 20.0);
		//删
		//根据key删除value,并且返回删除的value
//		System.out.println(map.remove("2"));
		//根据key和value删除,如果key和value不匹配,则删除失败
//		System.out.println(map.remove(s1, 20.0));
		//改
		map.put(1, "jerry");
		System.out.println(map);
		//查
		System.out.println(map.get(s1));
		//输出一下大小
		System.out.println(map.size());
		
		//遍历
		//1.
//		Collection c = map.values();
//		for(Object obj : c) {
//			System.out.println(obj);
//		}
		//2.
//		Set keys = map.keySet();
//		for(Object obj: keys) {
//			System.out.println("key="+obj);
//			System.out.println("value="+map.get(obj));
//			System.out.println("==========");
//		}
		//3.
		Set entrys = map.entrySet();
		for(Object obj : entrys) {
			if(obj instanceof Map.Entry) {
				Map.Entry me = (Map.Entry) obj;
				System.out.println(me.getKey());
				System.out.println(me.getValue());
				System.out.println("================");
			}
		}
		
	}
}

HashMap:无序的 验证key值的唯一性
HashTable:(古老的数据结构,加了线程安全,效率低)
SortedMap:
TreeMap:提供自然排序和客户化排序,对key值提供

二.泛型

在编译阶段进行类型检查
集合中使用泛型的语法
List<泛型>:当前List只能放该类型
Set<泛型>:
Map<泛型1,泛型2>:
例子:使用map保存一个复杂的数据结构
key值为学生或者人类
value为该学生或者人类的地址列表

Map<Persion,List<Address>>

利用泛型来完成Map

	
	package day14;
import java.util.*;

import day08.Addres;
import day08.Person;
/**
 * 使用泛型来完成map
 * @author Acer
 *
 */
public class MapTest2 {
	public static void main(String[] args) {
		Map<Integer,String> map1 = new HashMap<>();
		map1.put(1, "tom");
//		map1.put("2", "tom2");//泛型规定了数据类型
		map1.put(2, "tom2");
		System.out.println(map1.get(2));
		
		
		//key值和value值较为复杂的结构 day08
		Map<Person,List<Addres>> map2 = new TreeMap<Person,List<Addres>>(new Comparator<Person>() {

			@Override
			public int compare(Person o1, Person o2) {
				return o1.getName().compareTo(o2.getName());
			}
		});
		
		//准备map中的第一个元素
		Person p1 = new Person("tom",20,null);
		List<Addres> l1 = new LinkedList<>();
		Addres add1 = new Addres("中国","江苏","苏州");
		Addres add2 = new Addres("中国","山西","太原");
		l1.add(add1);
		l1.add(add2);
		map2.put(p1, l1);
		System.out.println("=========================");
		//准备第二个元素
		//先准备p2,再准备l2,再准备add3和add4
		//l2先添加add3和add4
		//map2添加p2和l2
		Person p2 = new Person("jerry",22,null);
		List<Addres> l2 = new LinkedList<>();
		Addres add3 = new Addres("中国","浙江","温州");
		Addres add4 = new Addres("中国","安徽","蚌埠");
		l2.add(add3);
		l2.add(add4);
		map2.put(p2, l2);
		
		//使用泛型来遍历,map2
		Set<Map.Entry<Person, List<Addres>>> entrys = map2.entrySet();
		for (Map.Entry<Person, List<Addres>> entry : entrys) {
			System.out.println(entry.getKey());
			System.out.println(entry.getValue());
		}
	}
}

泛型的高级应用

泛型类(拓展)

语法:class+类名<泛型>{}

泛型类的继承
如果子类要继承泛型父类,那么需要继承父类的所有泛型,
如果不需要继承泛型,则需要写明父类的泛型

泛型接口

语法 interface 接口名<泛型>{抽象方法}
实现类要实现该接口,如果不写明泛型,则实现的方法的参数和返回值都为Object,
所以要根据实际需求在实现接口是写明泛型

泛型方法

在泛型类中写泛型方法
	直接使用类中定义的泛型即可
在普通类中写泛型方法
	在方法的修饰符后面,返回值前面添加<泛型参数>,作用域为该方法

泛型通配符?

?通配无范围无边界的类型,使用?通配的集合不可以使用add方法添加元素,
只能加null元素,在编译阶段并不清楚需要什么类型

泛型的上下限

下限:泛型参数super Number//Number为泛型参数的下限
上限:泛型参数extends Number//Number为泛型参数的上限

手写一个map做手动的类型检查

(输入不能输入要求之外的类型,输出之后强转不报类型转换异常)–>MyMap

	package day14;
/**
 * 自己手动封装一个类型检查的Map类型
 * @author Acer
 *
 */
import java.util.*;
public class MyMap {
	private Map map = new HashMap();
	
	
	//只能够输入int类型的key和String类型的value
	public void put(int i, String s) {
		map.put(i, s);
	}
	//输出
	public String get(int i) {
		return (String)map.get(i);
	}
	
	//删除
	public String remove(int i) {
		return (String)map.remove(i);
	}
	
	public void show (List<Object> l) {
		System.out.println(l);
	}
	
	public static void main(String[] args) {
		MyMap mm = new MyMap();
		mm.put(1, "tom");
		mm.put(2, "jerry");
		System.out.println(mm.get(1));
		System.out.println(mm.get(1) instanceof String);
		List<String> list = new ArrayList<String>();
		List<Object> list1 = new ArrayList<Object>();
		System.out.println(list.getClass().getName());
		System.out.println(list1.getClass().getName());
//		mm.show(list);
	}
}

泛型的类型擦除

泛型的类型检查只是在编译阶段帮助控制输入的类型,
减少或者避免ClassCastException,编译器编译成功之后,
泛型会被擦除,也就是.class文件不存在泛型

反射原理:可以跳过编译阶段,直接修改Runtime的数据
可以直接跳过编译阶段,在泛型定义的list中add泛型之外的类型

泛型是jdk1.5之后提出的概念,jdk1.7之后提出的菱形语法(钻石语法)

泛型的相关测试

package day14;

import java.util.*;

import day08.Addres;

/**
 * 泛型测试
 * 
 * @author Acer
 *
 */
public class GenericTest {
	public static void main(String[] args) {
		Apple<String> a = new Apple<>("tom");
		System.out.println(a.getA() instanceof String);
		// 准备一个String类型的数组和String类型的集合
		Collection<String> coll = new ArrayList<String>();
		String[] array = new String[] { "tom", "jerry", "happy" };
		a.arrayToCollection(coll, array);
		System.out.println(coll.size());
		System.out.println(coll);// 输出结果
		// List<?> list = new ArrayList<>();//通配符?测试
		// list.add(null);
		// list.add(20.0);
		// list.add("String");
		
		Pear p = new Pear();
		Collection<Number> cn = new ArrayList<Number>() ;
		System.out.println(p.show(cn,2));
		
		
	}
}

//
class Apple<A> {// 形式参数类型取A是可以的,但是不符合规范
	private A a;

	// 提供构造器
	public Apple() {

	}

	public Apple(A a) {
		this.a = a;
	}

	// 提供get和set方法
	public A getA() {
		return a;
	}

	public void setA(A a) {
		this.a = a;
	}

	// 把一个A类型的数组变成集合
	public void arrayToCollection(Collection<A> coll, A[] array) {
		for (A temp : array) {
			coll.add(temp);
		}
	}

	// public Apple<A>(){
	//
	// }

}

interface AppleInterface<K, V> {
	void put(K k, V v);

	V get(K k);
}

class AppleB implements AppleInterface<String, Addres> {

	@Override
	public void put(String k, Addres v) {
		// TODO Auto-generated method stub

	}

	@Override
	public Addres get(String k) {
		// TODO Auto-generated method stub
		return null;
	}

}

interface PearInterface extends AppleInterface<Integer, String> {

}

interface BananaInterface extends AppleInterface<String, String> {

}

class Pear implements PearInterface {
//在普通类中声明一个泛型方法
	public <T> T show(Collection<? extends Number> t1,T t2) {
		System.out.println(t1);
		return t2;
	}
	@Override
	public void put(Integer k, String v) {
		// TODO Auto-generated method stub

	}

	@Override
	public String get(Integer k) {
		// TODO Auto-generated method stub
		return null;
	}

	
}

三.一点补充

Collections:集合中的工具类
	查找
	排序
	调换位置
	倒序输出
	随机打乱集合元素的顺序
Arrays:数组中的工具类

四.心得

今天早上辅导课及时的把TreeSet的相关内容做了相关的查漏补缺,把昨天的疑惑都解决了,今天上课的时候在treemap相关内容并没有再次绕进去,今天所学习的内容也都比较容易接受,在学Map的相关内容的时候明显比昨天第一次解除集合要好的多,一直懵逼的泛型今天也总算是正式学到了.明天继续加油!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值