泛型简述+Map分拣

1-instanceof 用法总结.

// An highlighted block
package test.work.generics;

public class Main {
	public static void main(String[] args) {
		/*instanceof是二元运算符
		用来判断左边对象是否是右边类的子类或实例,返回布尔值*/
		B b = new B();
		System.out.println(b instanceof A);
		A a = new A();
		System.out.println(a instanceof B);
		System.out.println(a instanceof A);
	}
}
class A{
	
}

class B extends A{
	
}
打印结果:true
false
true

2-泛型:常见的字母及分别对应含义?
T Type表示类型

K V 分辨表示键值对中的key value

E 代表Element

?表示不确定的类型

3-泛型的优点是安全和省心,请用代码说明。

// An highlighted block
package test.work.generics;

public class Main {
	public static void main(String[] args) {
		/**
		 * 省心:定义使用泛型,使用时具体的引用类型,提高代码复用率
		 * 类型转换自动、隐式
		 */
		A<String> a1 = new A();
		a1.name = "a1";
		A<Integer> a2 = new A();
		a2.name = 1;
		A a3 = new A();
		//自动类型转换
		a3.name = "a3";
		System.out.println(a3.name);
		/**安全:使用Object可以强制转换,编译不报错,运行会报错:
		java.lang.ClassCastException: 
			java.lang.Integer cannot be cast to java.lang.String
		*/
		B b = new B();
		b.age = 20;
		String age = (String)b.age;
		System.out.println(age);
	}
}
class A<T>{
	T name;
}
class B{
	Object age;
}

4-泛型接口注意事项是是么?
不能使用类型参数声明静态属性
在这里插入图片描述
5-泛型方法注意事项是什么?
1、泛型放在返回类型前面
2、泛型只能是引用类型,不能是基本类型

// An highlighted block
package test.work.generics;

/**
 * 	1、泛型放在返回类型前面
	2、泛型只能是引用类型,不能是基本类型
 */
public class TestGenerics {
	/*1、泛型放在返回类型前面*/
	public static <T> void test(){
		System.out.println();
	}
	public static <T> String test02(T t){
		return (String) t;
	}
	/*3、泛型只能是引用类型,不能是基本类型*/
	/*public W<int> test04(){//报错
		
	}*/
	public W<Integer> test05(){
		return new W<Integer>();
	}
}
class W<T>{
	
}

6-泛型:(1)子类指定具体类型,(2)子类为泛型类,(3)子类为泛型类/父类不指定类型,(4)子类与父类同时不指定类型,以上4点请分别用代码举例。

// An highlighted block
package test.work.generics;

public abstract class Father<T> {
	public abstract void test(T t);
}
/**
 * 子类指定具体类型
 */
class son1 extends Father<String>{
	@Override
	public void test(String t) {
		
	}
}
/**
 * 子类为泛型类
 */
class son2<T> extends Father<T>{
	@Override
	public void test(T t) {
		
	}
}
/**
 * 子类为泛型类/父类不指定类型
 * 泛型擦除
 */
class son3<T> extends Father{

	@Override
	public void test(Object t) {
		
	}
}
/**
 *子类与父类同时不指定类型 
 *同时擦除
 */
class son4 extends Father{

	@Override
	public void test(Object t) {
		
	}
}

7-泛型接口,方法是以父类而定还是以子类而定?
随父类而定

// An highlighted block
package test.work.generics;

public interface Father02<T> {
	void test(T t);
}
/**
 * 泛型接口,方法是以父类而定
 * 子类擦除还是确定了类型,通过重写方法的形参可以看出
 * 重写方法都是以父类而定
 * 
 */
class son01 implements Father02{

	@Override
	public void test(Object t) {
		// TODO Auto-generated method stub
		
	}
}
class son02<String> implements Father02{

	@Override
	public void test(Object t) {
		// TODO Auto-generated method stub
		
	}
}
/** 方法报错*/
/*class son03<String> implements Father02{

	@Override
	public void test(String t) {
		// TODO Auto-generated method stub
		
	}
}*/

8-形参使用多态、返回类型使用多态 请分别代码举例。

// An highlighted block
package test.work.generics;

public class Animal {
	
}
class Cat extends Animal{
	
}
class Test{
	public static void main(String[] args) {
		Animal cat = new Cat();
		/*形参使用多态*/
		test01(new Cat());
		/*返回类型使用多态*/
		Cat c = (Cat) test02();
		
	}
	public static void test01(Animal a){
		
	}
	public static Animal test02(){
		return new Cat();
		
	}
}

9-泛型有没有多态?

// An highlighted block
package test.work.generics;

/**
 * 泛型没有多态
 *
 * @param <T>
 */
public class Q<T> {
	public static void main(String[] args) {
		Q<Animal> q = new Q<Cat>();//报错
	}
	public static Q<Animal> test(){
		return new Q<Cat>;//报错
		
	}
}

10-泛型的?问号: 只能声明在类型|方法上,不能声明类或者使用时,请用代码证明这句话的正确性.

// An highlighted block
package test.work.generics;

public class Q<T> {
//public class Q<?> {//声明类,编译报错
	public static void main(String[] args) {
		Q<?> q = new Q<Integer>();//声明类型的时候可以使用
		test(new Q<String>());//使用时必须有具体的应用类型
//		test(new Q<?>)//使用时 ?编译报错
	}
	public static void test(Q<?> a){//方法中声明
		
	}
}

11-泛型嵌套:由外到内拆分.请用代码解释这句话.

// An highlighted block
package test.work.generics;

public class Student<T> {
	T age;
	public static void main(String[] args) {
		Student<TestStu<String>> s = new  Student<TestStu<String>>();
		TestStu<String> ts = s.age;//外层赋值
		String name = ts.name;//内层赋值
		System.out.println(name);//打印结果:A
	}
}
class TestStu<T>{
	static String name ="A";
	
}

12-泛型有没有数组?
在这里插入图片描述

13-用匿名内部类实现迭代器。

// An highlighted block
package test.work.map;

import java.util.Iterator;

public class MyArrayList{
	private Object[] obj;
	private int size;
	/**
	 * 匿名内部类
	 * @return
	 */
	public Iterator<Object> iterator(){
		return new Iterator<Object>(){
			private int curent =-1;
			@Override
			public boolean hasNext() {
				return curent+1<size;
			}

			@Override
			public String next() {
				curent++;
				return (String) obj[curent];
			}

			@Override
			public void remove() {
				// TODO Auto-generated method stub
				
			}
		};
	}
	public static void main(String[] args) {
		MyArrayList list = new MyArrayList();
		list.obj = new String[]{"A","B","C","D"};
		list.size = list.obj.length;
		Iterator it= list.iterator();
		while(it.hasNext()){
			System.out.println(it.next());//打印结果:A
B
C
D

		}
	}
}

14-用分拣思路统计字符串出现次数"this-is-my-first-dog-but-i-like-cat-and-cat-is-nice-and-dog-is-friendly-this-why-i-like-cat-more".

// An highlighted block
package test.work.map;

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

public class CountStr {
	public static void main(String[] args) {
		String str = "this-is-my-first-dog-but-i-like-cat-and-cat-is-nice-and-dog-is-friendly-this-why-i-like-cat-more";
		String[] arr = str.split("-");
		Map<String,Integer> map = new HashMap<String,Integer>();
		for(String s : arr){
			int count  =1;
			if(map.containsKey(s)){
				count = map.get(s);
				count++;
			}
			map.put(s, count);
		}
		for(Entry<String, Integer> entry : map.entrySet()){
			System.out.println(entry);
		}
	}
}

打印结果:
在这里插入图片描述
15-用面向对象思想+分拣思路统计班级总人数和平均分。
1、创建2个类,1个学生类,一个班级类,学生类关联班级类
学生类:

// An highlighted block
package test.work.map;

public class Student {
	/** 姓名*/
	private String name;
	/** 班级*/
	private ClassRoom classromm;
	/** 分数*/
	private double score;
	
	public Student(String name,ClassRoom classroom,double score){
		super();
		this.name = name;
		this.classromm = classroom;
		this.score = score;
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public ClassRoom getClassromm() {
		return classromm;
	}
	public void setClassromm(ClassRoom classromm) {
		this.classromm = classromm;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	
}

班级类:

// An highlighted block
package test.work.map;


public class ClassRoom {
	/** 班级编号*/
	private String no;
	/** 总人数*/
	private Integer total;
	/** 平均分*/
	private double avg;
	public ClassRoom(String no){
		super();
		this.no = no;
	}
	public ClassRoom(String no,Integer total,double avg){
		super();
		this.no = no;
		this.total = total;
		this.avg = avg;
	}
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	
	public double getAvg() {
		return avg;
	}
	public void setAvg(double avg) {
		this.avg = avg;
	}
	public Integer getTotal() {
		return total;
	}
	public void setTotal(Integer total) {
		this.total = total;
	}
	
}

实现方法:

// An highlighted block
package test.work.map;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
	public static void main(String[] args) {
		//添加学生
		List<Student> list = new ArrayList<Student>();
		addStudent(list);
		
		//统计分数
		Map<ClassRoom,List<Student>> map = statistics(list);
		//打印分数
		printScore(map);
	}
	/**
	 * 打印分数
	 * @param map
	 */
	public static void printScore(Map<ClassRoom,List<Student>> map){
		Iterator<Entry<ClassRoom,List<Student>>> entrys = map.entrySet().iterator();
		while(entrys.hasNext()){
			ClassRoom classroom = entrys.next().getKey();
			List<Student> stus = map.get(classroom);
			double total = 0D;//班级总分
			for(Student stu : stus){
				total +=stu.getScore();
			}
			double avg = total/stus.size();
			classroom.setAvg(avg);
			classroom.setTotal(stus.size());
			System.out.println("班级:"+classroom.getNo()+"总人数为:"+stus.size()+"平均分为:"+avg);
		}
	}
	
	/**
	 * 统计分数
	 * @return Map<String,List<Student>>
	 */
	public static Map<ClassRoom,List<Student>> statistics(List<Student> list){
		Map<ClassRoom,List<Student>> map = new HashMap<ClassRoom,List<Student>>();
		for(Student stu : list){
			ClassRoom cr = stu.getClassromm();
			List<Student> stus = null;
			if(map.containsKey(cr)){
				map.get(cr).add(stu);
			}else{
				stus = new ArrayList<Student>();
				stus.add(stu);
				map.put(cr, stus);
			}
		}
		return map;
	}
	/**
	 * 若干学生放入List
	 * @param list
	 */
	public static void addStudent(List<Student> list){
		ClassRoom class1 = new ClassRoom("001");
		ClassRoom class2 = new ClassRoom("002");
		ClassRoom class3 = new ClassRoom("003");
		list.add(new Student("a",class1,70));
		list.add(new Student("b",class1,85));
		list.add(new Student("a",class2,80));
		list.add(new Student("c",class2,90));
		list.add(new Student("d",class3,78));
		list.add(new Student("e",class3,92));
		
	}
}

打印结果:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值