泛型

泛型:参数化的类型,即把数据类型当做参数来传递

有的地方又称为泛化的类型,用一个单个大写字母,例如<T>来代表任意类型,这个T就是泛化的类型。

泛型的好处:

(1)表示某个变量的类型更灵活

(2)安全:有了泛型,在编译期间就可以避免不符合类型的数据赋值

(3)避免数据类型转换

泛型类或泛型接口

【修饰符】 class 类名<类型变量列表/泛型类型形参列表>{

}
【修饰符】 interface 接口名<类型变量列表/泛型类型形参列表>{

}

使用

(1)创建对象时

在创建类的对象时指定类型变量对应的实际类型参数,指定泛型实参时,必须左右两边一致,不存在多态现象

(2)继承、实现接口

在继承泛型类或实现泛型接口时,指定类型变量对应的实际类型参数

注意

(1)<类型变量列表/泛型类型形参列表>:使用单个的大写字母表示,例如:<T>,<E>,<R>...

(2)<类型变量列表/泛型类型形参列表>:可以多个,每个之间使用,分割,例如:<K,V>

(3)如果要指定<类型变量列表/泛型类型形参列表>的实际类型,必须是引用数据类型,不能是基本数据类型

(4)类和接口上的类型形参不能用于静态方法中

(5)<类型变量列表/泛型类型形参列表>可能有上限,< T extends 上限1 >

类型变量的上限

当在声明类型变量时,如果不希望这个类型变量代表任意引用数据类型,而是某个系列的引用数据类型,那么可以设定类型变量的上限。

< T extends 上限1 & 上限2 ...>

上限中类只能有一个,如果有必须在最左边,接口的话可以多个。多个上限之间是&(与)的关系。

如果在声明<类型变量>时没有指定任何上限,默认上限是java.lang.Object。

泛型擦除

当使用参数化类型的类或接口时,如果没有指定泛型,会发生泛型擦除,泛型的类型就会自动按照最左边的第一个上限处理。如果没有指定上限,上限即为Object。

泛型方法

如果我们定义类、接口时没有使用<类型变量>,但是某个方法定义时或静态方法定义时,想要自己定义<类型变量>就可定义泛型方法

语法:

【修饰符】 <类型变量列表/泛型类型形参列表> 返回值类型  方法名(【数据形参列表】)【throws 异常列表】

使用:

方法被调用时,根据方法的实参的类型自动推断。

注意:

泛型方法的定语与泛型类的定义注意点相同,并且泛型方法可定义静态方法

每一个泛型方法的<类型变量列表/泛型类型形参列表>是独立的,和别的方法无关,和类上面的泛型也无关

类型通配符

当我们声明一个方法时,某个形参的类型是一个参数化的泛型类或泛型接口类型(Map<K,V>),但是在声明方法时,又不确定该泛型实际类型,我们可以考虑使用类型通配符。

形式:

(1)泛型类/接口名<?>        ?代表任意引用数据类型

(2)泛型类/接口名<? extends 上限>  ?代表的是该上限或上限的子类类型

(3)泛型类/接口名<? super 下限>     ?代表的是该下限或下限的父类类型

注意:

<?>:不可变,因为<?>类型不确定,编译时,任意类型都是错

<? extends 上限>:不可变,因为<? extends 上限>的?可能是上限或上限的子类,即类型不确定,编译按任意类型处理都是错。

<? super 下限>:可以将值修改为下限或下限子类的对象,因为<? super 下限>?代表是下限或下限的父类,那么设置为下限或下限子类的对象是安全的。

泛型的其他小问题

1、<>在左右两边 类型必须一致

2、JDK1.7之后允许右边<>里面空着,根据左边的自动推断

3、try...catch的catch里面不能使用T这种来代表任意异常类型。

4、泛型类不能创建数组对象

5、泛型可用于可变形参列表(T... t)

超类通配符<? super 下限>主要用于灵活的写入和比较,而<? extends 上限>主要用于读写,不能写入或者修改

数组算法升华

1、数组的反转

方法一:

1、借助一个新数组

2、首尾对应位置交换

缺点:需要借助一个数组,浪费额外空间,原数组需要垃圾回收

方法二:

数组对称位置的元素互换。

2、数组的扩容

(1)先创建一个新数组,可以扩容为原来的1.5倍、2倍等

(2)把旧数组的数据赋值到新数组中

(3)把新元素添加到newArr的最后

(4)如果下面继续使用arr,可以让arr指向新数组

数组扩容太多会造成浪费,太少会导致频繁扩容,效率低下

3、数组元素的插入

(1)判断数组是否需要扩容

  如果需要,先扩容

(2)把[index]位置和它后面的元素往右移动

(3)在[index]位置放入新元素

4、数组元素的删除

(1)把[index+1]位置和它后面的元素往左移动

(2)把当前数组的最后一个元素还原(0/null)

5、数组的二分查找

二分查找:对折对折再对折

要求:要求数组元素必须支持比较大小,并且数组中的元素已经按大小排好序

6、数组的直接选择排序

int[] arr = {....};

//轮数 = arr.length-1
for(int i=0; i<arr.length-1; i++){
  //(1)找出本轮最小值
  int minIndex = i;
  for(int j=i+1; j<arr.length-1; j++){
    if(arr[minIndex] > arr[j]){
      minIndex = j;
    }
  }
  //(2)如果本轮最小值不在它应该在的位置
  if(minIndex != i){
    int temp = arr[minIndex];
    arr[minIndex] = arr[i];
    arr[i] = temp;
  }
}

Java语法进阶10-泛型的更多相关文章

  1. Java语法进阶12-集合

    集合 集合:是一种容器,用来装对象的容器,不能装基本数据类型. 数组也是容器,可以用来装基本数据类型,也可以用来装对象. 本质上,集合需要用对应的数据结构实现,是多个类实现接口Collection系列 ...

  2. Java语法进阶10-多线程

    多线程 并发与并行.进程,线程调度自行百度 线程(thread):是一个进程中的其中一条执行路径,CPU调度的最基本调度的单位.同一个进程中线程可以共享一些内存(堆.方法区),每一个线程又有自己的独立 ...

  3. Java语法进阶13-文件、IO流

    File File是文件和目录路径名的抽象表示形式,即File类是文件或目录的路径,而不是文件本身,因此File类不能直接访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流. File ...

  4. Java语法进阶16-Lambda-Stream-Optional

    Lambda 大年初二,大门不出二门不迈.继续学习! 函数式接口 Lambda表达式其实就是实现SAM接口的语法糖,所谓SAM接口就是Single Abstract Method,即该接口中只有一个抽 ...

  5. Java语法进阶14-网络编程

    网络编程 软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构. B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构. 网络通信协议 网络通信 ...

  6. Java中的10颗语法糖

    语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的 ...

  7. java语言进阶(二)_Collection_泛型

    主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList ,那么集合到底是什么呢? 集 ...

  8. Java基础语法<十二> 泛型程序设计

    1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...

  9. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

随机推荐

  1. PHP中echo与print语句的实例教程

    在 PHP 中,有两种基本的输出方法:echo 和 print. echo与print的差异 echo能够输出一个以上的字符串. print只能输出一个字符串,并始终返回 1. 提示:echo 比 p ...

  2. 洛谷P2634 聪聪可可 (点分治)

    ###题目链接### 题目大意: 给你一棵树,假如树上两点间的距离是 3 的倍数 的点对有 s 对,则输出最简分数  s/n ,其中 n 表示所有整棵树的点对总数. 分析: 1.显然,可以采用点分治. ...

  3. 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码

    WiFi密码Python暴力破解   Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...

  4. IDM下载工具使用

    平时网上找资料,找视频,难免都需要下载到本地,奈何下载速度都一般,最近发现一款多线程下载工具,堪称无敌!!

  5. Lab4\5:进程和线程

    进程的定义 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程 源代码在经过编译链接之后生成了可执行文件,再由操作系统进行加载并且进行一些堆栈的分配才是进程 进程控制块 操作系统管理 ...

  6. linux目录相关操作

    mkdir:新建目录 mkdir [-mp] 目录名称 -m:配置文件权限,直接设置,不需要看默认权限(umask) -p:递归创建目录 rmdir:删除空目录 rmdir [-p] 目录名称 -p: ...

  7. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  8. Vue组件通信之非父子组件传值

    前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是 ...

  9. Spring的相关注解

    说明写在最前面:摘录于   博客园--受伤滴小萝卜   文章 文章链接受伤滴小萝卜文章--Spring注解 本文章只用作学习和帮助其他人学习记录使用 Spring 注解学习笔记 声明Bean的注解: ...

  10. 学习spring和spring mvc过程中遇到的一些问题

    以下仅为个人通过网上查找资料总结的内容,如有不对的地方欢迎提出: 注解: @Controller//表明本类是一个Controller @RequestMapping(value="/dem ...