Java学习笔记-基础语法Ⅷ-泛型、Map
泛型
泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数,即将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类、方法和接口中,分别为泛型类、泛型方法、泛型接口
// 泛型类
public class GenericDemo <T>{
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
GenericDemo<String> gd1 = new GenericDemo<>();
gd1.setT("林青霞");
System.out.println(gd1.getT());
System.out.println("--------");
GenericDemo<Integer> gd2 = new GenericDemo<>();
gd2.setT(18);
System.out.println(gd2.getT());
}
}
在这里,测试类中创建泛型类对象时,最好指定数据类型
泛型方法:
public class GenericFunc {
public <T>void show(T t){
System.out.println(t);
}
}
public class Test {
public static void main(String[] args) {
GenericFunc gf = new GenericFunc();
gf.show("Hello");
}
}
泛型接口:
public interface Generic <T>{
void show(T t);
}
public class GenericImpl<T> implements Generic<T>{
@Override
public void show(T t) {
System.out.println(t);
}
}
public class Demo {
public static void main(String[] args) {
Generic<String> gc1 = new GenericImpl<>();
gc1.show("Hello");
Generic<Integer> gc2 = new GenericImpl<>();
gc2.show(100);
}
}
类型通配符
为了表示各种泛型List的父类,可以使用类型通配符
- 类型通配符:<?>
- List<?>表示元素类型未知的List,它的元素可以匹配任何的类型
- 这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中
import java.util.ArrayList;
import java.util.List;
public class MyGeneric {
public static void main(String[] args) {
List<?> list1 = new ArrayList<String>();
// 不能添加
// list1.add(12);
List<String> list2 = new ArrayList<>();
// 不能添加
list2.add("Hello");
System.out.println(list2);
}
}
public static <T> void test(List<T> c, T t){
// 可以添加
c.add(t);
}
那么类型通配符到底有什么用呢
import java.util.List;
public class MyGeneric {
public void test3(List<?> c){
for (int i = 0; i < c.size(); i++) {
System.out.println(c.get(i));
}
}
}
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
MyGeneric mg = new MyGeneric();
List<String> ls1 = new ArrayList<>();
ls1.add("Hello");
ls1.add("World");
mg.test3(ls1);
System.out.println("-------");
List<Integer> ls2 = new ArrayList<>();
ls2.add(66);
ls2.add(666);
mg.test3(ls2);
}
}
想了下,在不知道类型参数情况下,可以用类型通配符,且还可以使用类型通配符上限,以及类型通配符下限
可变参数:
- python中用*,而java中用...
- 可变的参数和python一样都是数组
- 如果一个方法有多个参数,包含可变参数,可变参数要放在最后
Map集合
Map集合概述:
- Interface Map<K,V> k是键的类型,V是值的类型
- 将键映射到值的对象,不能包含重复的键,每个键可以映射到最多一个值
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
System.out.println(map.put("abc","123"));
// null
System.out.println(map);
}
}
Map的获取:
- 根据键获取:get方法,返回V
- 获得全部键:keySet方法,返回Set集合,因为键是不重复的
- 获得全部值:values方法,返回Collection,值是可重复的
- 获取键值对:entrySet方法
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("1","机器学习");
map.put("2","深度学期");
map.put("3","自然语言处理");
map.put("4","计算机视觉");
// 通过具体键获得值
String s = map.get("1");
System.out.println(s);
// 获得全部键,返回的是Set
Set<String> strings = map.keySet();
System.out.println(strings);
// 获得全部值,返回的是Collection
Collection<String> values = map.values();
System.out.println(values);
// 通过entrySet方法
Set<Map.Entry<String, String>> entries = map.entrySet();
for(Map.Entry<String, String> me:entries){
System.out.println(me.getKey()+" "+me.getValue());
}
}
}
机器学习
[1, 2, 3, 4]
[机器学习, 深度学期, 自然语言处理, 计算机视觉]
1 机器学习
2 深度学期
3 自然语言处理
4 计算机视觉
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String[] strings = line.split("");
Map<String,Integer> map = new HashMap<>();
for(int i = 0;i<strings.length;i++){
String string = strings[i];
if(map.containsKey(string)){
Integer integer = map.get(string);
integer += 1;
map.put(string,integer);
}else{
map.put(string,1);
}
}
// 遍历
Set<String> strings1 = map.keySet();
for(String s:strings1){
Integer integer = map.get(s);
System.out.print(s+"("+integer+")");
}
}
}
之前学了个集合的工具类Arrays,现在学习另一个工具类Collections
有了这个工具类之后,连ArrayList也可以进行排序了(之前学习的是TreeSet)
// 学生类
public class Student {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 测试类
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Demo {
public static void main(String[] args) {
Student s1 = new Student(18,"张三");
Student s2 = new Student(19,"李四");
Student s3 = new Student(18,"王五");
ArrayList<Student> arr = new ArrayList<>();
arr.add(s1);
arr.add(s2);
arr.add(s3);
Collections.sort(arr, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num1 = o1.getAge()-o2.getAge();
int num2 = num1 == 0?o1.getName().compareTo(o2.getName()):num1;
return num2;
}
});
for(Student s:arr){
System.out.println(s.getAge()+" "+s.getName());
}
}
}
// 实现1
import java.util.ArrayList;
import java.util.Collections;
public class PokerDemo {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<>();
String [] color = {"","","",""};
String [] point = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
for(int i = 0;i< color.length;i++){
for(int j = 0;j< point.length;j++){
String s = color[i] + point[j];
arr.add(s);
}
}
Collections.shuffle(arr);
ArrayList<String> p1 = new ArrayList<>();
ArrayList<String> p2 = new ArrayList<>();
ArrayList<String> p3 = new ArrayList<>();
ArrayList<String> p4 = new ArrayList<>();
for(int i = 0;i<arr.size();i++){
if(i> arr.size()-3){
p4.add(arr.get(i));
}else if(i%3==0){
p1.add(arr.get(i));
}else if(i%3==1){
p2.add(arr.get(i));
}else if(i%3==2){
p3.add(arr.get(i));
}
}
System.out.println(p1);
}
}
// 实现2
import java.util.*;
public class Poker {
public static void main(String[] args) {
// 用HashMap存储一副扑克牌
HashMap<Integer,String> poker = new HashMap<>();
String [] color = {"","","",""};
String [] point = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
int index = 0;
ArrayList<Integer> arrIndex = new ArrayList<>();
for(int i = 0;i<color.length;i++){
for(int j =0;j< point.length;j++){
String s = color[i] + point[j];
poker.put(index,s);
arrIndex.add(index);
index++;
}
}
poker.put(index,"小王");
arrIndex.add(index);
index++;
poker.put(index,"大王");
arrIndex.add(index);
// 用ArrayList存储索引,等会打乱索引
// 打乱排序
Collections.shuffle(arrIndex);
// System.out.println(arrIndex);
// 为了让拿到的牌排好序,使用TreeSet集合
TreeSet<Integer> player1 = new TreeSet<>();
TreeSet<Integer> player2 = new TreeSet<>();
TreeSet<Integer> player3 = new TreeSet<>();
TreeSet<Integer> referee = new TreeSet<>();
// 给玩家发牌
for(int i = 0;i<arrIndex.size();i++){
Integer num = arrIndex.get(i);
if(i>=arrIndex.size()-3){
referee.add(num);
}else if(i%3 == 0){
player1.add(num);
}else if(i%3 == 1){
player2.add(num);
}else if(i%3 == 2){
player3.add(num);
}
}
// 看牌,封装成函数
showPoker("Player1",player1,poker);
showPoker("Player2",player2,poker);
showPoker("Player3",player3,poker);
showPoker("Referee",referee,poker);
}
// 传入进来玩家、扑克牌、Map
public static void showPoker(String name,TreeSet<Integer>ts,HashMap<Integer,String>map){
System.out.println(name+"的牌是:");
System.out.print("\t");
for(Integer i:ts){
String s = map.get(i);
System.out.print(s+", ");
}
System.out.println();
}
}
Java学习笔记-基础语法Ⅷ-泛型、Map的更多相关文章
- Java学习笔记-基础语法Ⅳ
多态:同一个对象,在不同时刻表现出来的不同形态 例如: 猫 cat = new 猫(); 动物 animal = new 猫(); 这里的猫在不同时刻表现出来不同的形态,这就是多态 多态的前提和体现: ...
- Java学习笔记-基础语法
Java基础包含关键字,标识符,注释,常量和变量,运算符 关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 Java的关键字 用于定义数据类型的关键 ...
- Java学习笔记-基础语法Ⅹ-进程线程
学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...
- Java学习笔记-基础语法Ⅶ-集合
集合 集合类特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 这里需要回顾一下,因为数组和字符串一旦创建,就不可改变,需要区分一下 import java.util.ArrayLi ...
- Java学习笔记-基础语法Ⅴ
学习一些Java常用的API Math:包含执行基本数字运算的方法 如果没有构造方法,一般类的成员都是静态的,通过类名可以直接调用 Java中有两种random函数,Math.Random()函数能够 ...
- Java学习笔记-基础语法Ⅱ
成员变量:类中方法外的变量 局部变量:方法中的变量 注意,成员变量有默认初始值,而局部变量需要赋初始值 Java中虽然没有明确规定类必须首字母大写,但为了规范最好大写(因为自己刚刚写的时候就没看清写错 ...
- JAVA 学习笔记 - 基础语法 2
---恢复内容开始--- 1.数组的申明和应用 数据类型 数组名称[] = null; //在堆栈中申明变量名称 数组名称 = new 数据类型[10]; // ...
- JAVA 学习笔记 - 基础语法1
1. 类的定义 public class 与 class的区别 一个java文件只有一个public class, 而且类名必须与文件名一致. 一个java文件可以有多个class定义,javac ...
- Java学习笔记-基础语法ⅩⅠ-UDP、TCP
网络编程 三要素:IP地址.端口.协议 IP地址:使用ipconfig查看,如果装了VM的话,会有VMnet1.VMnet8和WLAN,net1不能从虚拟机到主机,net8不能从主机到虚拟机,net0 ...
随机推荐
- Dubbo 推荐用什么协议?
dubbo://(推荐) rmi:// hessian:// http:// webservice:// thrift:// memcached:// redis:// rest://
- rbac-基于角色的权限控制系统(8种常用场景再现)
首先要抛出的问题是在代码世界里什么是权限? url就代表权限 如何实现权限控制? 下面详细介绍控制流程 1.1简单权限控制--表结构 简单权限控制,三个model,五张表 权限表permission ...
- 学习RabbitMQ(一)
消息中间件 一.简介 消息中间件就是在消息的传输过程中保存消息的容器.消息中间件再将消息从它的源中继到它的目标时充当中间人的作用.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用, ...
- 机器学习优化算法之EM算法
EM算法简介 EM算法其实是一类算法的总称.EM算法分为E-Step和M-Step两步.EM算法的应用范围很广,基本机器学习需要迭代优化参数的模型在优化时都可以使用EM算法. EM算法的思想和过程 E ...
- H5复制粘贴双端适配的解决方案(终极版)
前言 最终适配所有机型的方案基于clipboardjs官网https://clipboardjs.com/ 这个库由几个不同的CDN提供商托管.选择你最喜欢的:) jsDelivr <scrip ...
- 设计一个基于svg的涂鸦组件(一)
基于svg写了一个涂鸦组件,说项目之前先附上几张效果图: 项目地址:SVGraffiti 由于篇幅问题,本文先总体介绍一下项目的大概情况,重点介绍一下组件间的通信方式. 一.项目说明 该项目是基于we ...
- java中请给出一个return this的例子。
[新手可忽略不影响继续学习]下面例子中setYear中的return this;返回了一个指向对象的指针,this.setMonth(8).setDay(20);是合法的,如果像原来的例子一样什么都不 ...
- Windows和ubuntu下更改pip国内镜像
windows下更改pip国内镜像 # 在C:\Users\admin路径下创建pip文件夹,然后创建pip.ini文件, 并在文件下写入 [global] index-url = http://py ...
- Spring集成web环境(使用封装好的工具)
接上文spring集成web环境(手动实现) ##########代码接上文############# spring提供了一个监听器ContextLoaderListener对上述功能的封装,该监听器 ...
- python函数基础算法简介
一.多层语法糖本质 """ 语法糖会将紧挨着的被装饰对象名字当参数自动传入装饰器函数中""" def outter(func_name): ...