笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
泛型的理解和好处
看一个需求
请编写程序,在ArrayList中,添加3个Dog对象
Dog对象含有name和age,并输出name和age(要求使用getXxx())
先使用传统的方法来解决->引出泛型
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Dog("旺财", 10));
arrayList.add(new Dog("发财", 1));
arrayList.add(new Dog("小黄",5));
//假如我们的程员,不小心,添加了一只猫
arrayList.add(new Cat("招财猫",8));
//遍历
for (Object o : arrayList) {
//向下转型0bject ->Dog
Dog dog = (Dog)o;
System.out.println(dog.getName() + "-" + dog.getAge());
}
}
使用传统方法的问题分析
泛型快速体验险-用泛型来解决前面的问题
看演示
ArrayList<Dog> arrayList = new ArrayList<Dog>();
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//使用传统的方法来解决===>使用泛型
// 解读
//1.当我们ArrayList<Dog>表示存放到 ArrayList集合中的元素是Dog类型〔细节后面说...)
// 2。如果编译器发现添加的类型,不满足要求,就会报错
//3。在遍历的时候,可以直接取出 g类型而不是 Object
ArrayList<Dog> arrayList = new ArrayList<Dog>();
arrayList.add(new Dog("旺财", 10));
arrayList.add(new Dog("发财", 1));
arrayList.add(new Dog("小黄", 5));
//假如我们的程序员,不小心,添加了一只猫
// arrayList.add(new Cat("招财猫",8));//加入Dog类型外的对象会报错,编译不通过
System.out.println("===使用泛科===");
for (Dog dog : arrayList) {
System.out.println(dog.getName() + "-" + dog.getAge());
}
}
}
class Dog {
public String name;
public int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Dog [name=" + name + ". age=" + age + "]";
}
}
泛型的好处
编译时,检查添加元素的类型,提高了安全性
减少了类型转换的次数,提高效率[说明]
√不使用泛型
Dog-加入->Object -取出->Dog //放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog
√使用泛型
Dog -> Dog -> Dog //放入时,和取出时,不需要类型转换,提高效率
不再提示编译警告
泛型介绍
int a = 10;
老韩理解:泛(广泛)型(类型)=> Integer, String,Dog
泛型又称参数化类型,是Jdk5.0出现的新特性,解决数据类型的安全性问题
在类声明或实例化时只要指定女好需要的具体的类型即可。
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮
泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。[有点难,举例]
public class Test {
public static void main(String[] args) {
Person<String> person = new Person<String>("韩顺平教育");
}
}
class Person<E> {
E s;//E表示s的数据类型,该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型
public Person(E s) {//E也可以是参数类型
this.s = s;
}
public E f() {//返回类型使用E
return s;
}
}
泛型的声明
interface 接口<T>{}和class 类<K,V>{}
//比如: List , ArrayList
说明:
泛型的实例化:
要在类名后面指定类型参数的值(类型)。如:
泛型使用的注意事项和细节
说明:T,E只能是引用类型
看看下面语句是否正确?:
List<Integer> list = new ArrayList<Integer>();//OK
List<int> list2 = new ArrayList<int>();//错误
在指定泛型具体类型后,可以传入该类型或者其子类类型
泛型使用形式
List<lnteger> list1 =new ArrayList<lnteger>();
List<lnteger> list2 = new ArrayList<>(); (简写,推荐使用)
如果我们这样写List list3 = new ArrayList(); 默认给它的泛型是[<E>E就是Object]
即:List<Object> list3 = new ArrayList<>();
基本语法
class 类名<T,R...>{//...表示可以有多个泛型成员
}
注意细节
//解读
//1. Tiger后面泛型,所以我们把 Tiger就称为自定义泛型类
//2. T,R,M泛型的标识符,一般是单个大写字母
//3.泛型标识符可以有多个.
//4.普通成员可以使用泛型(属性、方法)
//5. 使用泛型的数组,不能初始化
//6. 静态方法中不能使用类的泛型
class Tiger<T, R, M> {
String name;
R r;//属性使用到泛型
M m;
T t;
//因为new T[8]在编译时就需要获得T类型,而数组在new不能确定T的类型,就无法在内存开空间
T[] ts=new T[8];//编译不通过
public Tiger(String name, R r, M m, T t) {
this.name = name;
this.r = r;
this.m = m;
this.t = t;
}
//因为静态是和类相关的,在类增载时,对象还没有创建
//所以,如果静态方法和静态属性使用了泛型,JVM就无法完成初始化
static R r2;
public static void m1(M m) {
}
public M getM() {
return m;
}
public T getT() {
return t;
}
}
自定义泛型接口
基本语法
interface 接口名<T,R..>{
}
注意细节
//演示
//在继承接口指定泛型接口的类型
interface IA extends IUsb<String,Double>{
}
//当我们去实现IA接口时,因为IA在继承IUsu接口时,指定了U为String R为Double
//,在实现IUsu接口的方法时,使用String替换U,是Double替换R
class AA implements IA{
@Override
public Double get(String s) {
return null;
}
@Override
public void hi(Double aDouble) {
}
@Override
public void run(Double r1, Double r2, String u1, String u2) {
}
}
interface IUsb<U, R> {
int n = 10;
//U name;不能这样使用
//普通方法中,可以使用接口泛型
R get(U u);
void hi(R r);
void run(R r1, R r2, U u1, U u2);
//在jdk8中,可以在接口中,使用默认方法,也是可以使用泛型
default R method(U u) {
return null;
}
}
自定义泛型方法
基本语法
修饰符<T,R..> 返回类型 方法名(参数列表){
}
注意细节
泛型方法,可以定义在普通类中,也可以定义在泛型类
当泛型方法被调用时,类型会确定
public void eat(E e){},修饰符后没有<T,R..> eat
方法不是泛型方法,而是使用了泛型
public class Test {
public static void main(String[] args) {
Car car = new Car();
car.fly("宝马", 100);//当调用方法时,传入参数,编译器,就会确定类型
car.fly(300, 100.1);//当调用方法时,传入参数,编译器,就会确定类型
}
}
//泛型方法,可以定义在普通类中,也可以定义在泛型类中
class Car {//普通类
public void run() {//普通方法
}
//说明泛型方法
//1.<T,R>就是泛型
// 2.是提供给 fly使用的
public <T, R> void fly(T t, R r) {//泛型方法
System.out.println(t.getClass());//String
System.out.println(r.getClass());//Integer
}
}
class Fish<T, R> {//泛型类
public void run() {//普通方法
}
public <U, M> void eat(U u, M m) {//泛型方法
}
//说明
//1. 下面hi方法不是泛型方法
//2.是hi方法使用了类声明的泛型
public void hi(T t) {
}
//泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型
public <K> void hello(R r, K k) {
}
}
泛型的继承和通配符说明
//举例
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Object> objects = new ArrayList<>();
printCollection2(objects);//因为Object不是AA的子类,所以 报错
List<BB> bb = new ArrayList<>();
printCollection2(bb);//因为BB是AA的子类,所以 正常
}
// ? extends AA 表示上限,可以接受AA或者AA子类
public static void printCollection2(List<? extends AA> c) {
for (Object object : c){
System.out.println(object);
}
}
}
class AA{
}
class BB extends AA{
}
为什么需要JUnit
基本介绍
JUnit是一个Java语言的单元测试框架
多数Java的开发环境都已经集成了JUnit作为单元测试的工具
使用步骤
注意:使用之前程序中不能含有自定义的Test类。否则会出现冲突
第一次添加(在需要运行的方法上方添加@Test,后续步骤如下图所示)


后续使用只需要 import该Test
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg