Java 新特性之泛型

本文详细介绍了Java中的泛型概念,特别是在集合类(如ArrayList和HashMap)中的使用,以及自定义泛型类、接口和方法。文章还探讨了泛型在数据库操作(ORM)中的应用,以及如何通过DAO设计模式简化操作。此外,提到了泛型在Java开发中的重要性和在求职季面试中的价值。
摘要由CSDN通过智能技术生成
  1. 把一 个集合中的内容限制为一个特定的数据类型,这就是泛型背后的核心思想;

  2. 泛型在实例化之后,后面的集合就一定要放实例化时固定的类型了。

2 泛型在集合中的使用

==============================================================================

/**

  • 需求:存放学生的成绩

  • 1 在集合中使用泛型的情况:以ArrayList为例

*/

@Test

public void test2(){

// 如果没有,那么就表示ArrayList中变量类型是 Object 类型的。

ArrayList list = new ArrayList<>();

list.add(78);

list.add(87);

list.add(99);

list.add(65);

Iterator iterator = list.iterator();

while(iterator.hasNext()){

int stuScore = iterator.next();

System.out.println(stuScore);

}

}

/**

  • 需求:存放学生的成绩

  • 2 在集合中使用泛型的情况:以HashMap为例

*/

@Test

public void test3(){

Map<String,Integer> map = new HashMap<>();

map.put(“Tom”,87);

map.put(“Jerry”,87);

map.put(“Jack”,67);

//泛型的嵌套

Set<Map.Entry<String,Integer>> entry = map.entrySet();

for (Map.Entry<String, Integer> e : entry) {

String key = e.getKey();

Integer value = e.getValue();

System.out.println(key + “----” + value);

}

}

3 自定义泛型结构

============================================================================

3.1 自定义泛型类、接口


  1. 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内 。比如:<E1,E2,E3>;

  2. 泛 型类的构造器为 public GenericClass(){} ,而非public GenericClass<E>(){}

  3. T 不能用基本数据类型填充,但可以使用包装类填充;

  4. 静态方法中不能使用类的泛型;

  5. 异常类是不能泛型的;

  6. 不能使用 new E[] ;但是可以 E [] elements = (E[])new Object[capacity];

  7. 父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型。

/**

  • 自定义泛型类

    1. 中的 T 表示的是什么类型;
    1. 泛型类并不是表示这个类是什么类型,而是表示类中的属性是什么类型,且这些类型在构造对象的时候确定;
    1. 类名中的 是为了声明这个类是泛型类。

*/

public class Order {

String orderName;

int orderId;

//类的内部结构就可以使用类的泛型

T order;

public Order(){

// 在构造函数中必须使用下面一种方法

// T[] arr = new T[10];

T[] arr = (T[]) new Object[10];

}

public Order(String orderName,int orderId,T order){

this.orderName = orderName;

this.orderId = orderId;

this.order = order;

}

//如下的三个方法都不是泛型方法

public T getOrder(){

return order;

}

public void setOrder(T order){

this.order = order;

}

@Override

public String toString() {

return “Order{” +

“orderName='” + orderName + ‘’’ +

“, orderId=” + orderId +

“, order=” + order +

‘}’;

}

//静态方法中不能使用类的泛型,因为泛型的创建是在类的实例化时,而静态方法是属于类本身的。

// public static void show(T order){

// System.out.println(order);

// }

}

3.2 自定义泛型方法


public class Order {

String orderName;

int orderId;

T order;

public Order(){

T[] arr = (T[]) new Object[10];

}

//泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。

// 换句话说,泛型方法所属的类是不是泛型类都没有关系。

//泛型方法是可以声明为静态的,原因是泛型方法的泛型参数是在调用方法时确定的,并非在实例化类时确定。

public static List copyFromArrayToList(E[] arr){

ArrayList list = new ArrayList<>();

for(E e : arr){

list.add(e);

}

return list;

}

}

3.3 自定义泛型在数据库上的使用


在 Java 对数据库的操作中,我们常采用 ORM 思想,即数据库中的一张表对应一个 JavaBean 对象。

基本思想:对于不同表的很多操作都是相同的,这些操作,唯一不同的是被操作的对象。所以我们可以定义一个 DAO.java 来定义操作数据库中的表的通用操作,然后利用泛型来约定不同的对象。

1)定义基本操作的Dao类

/**

  • DAO:data(base) access object

*/

public class DAO {//表的共性操作的DAO

//添加一条记录

public void add(T t){

}

//删除一条记录

public boolean remove(int index){

return false;

}

//修改一条记录

public void update(int index,T t){

}

//查询一条记录

public T getIndex(int index){

return null;

}

//查询多条记录

public List getForList(int index){

return null;

}

//泛型方法

//举例:获取表中一共有多少条记录?获取最大的员工入职时间?

public E getValue(){

return null;

}

}

2)数据库中的某一张表的 JavaBean对象

/**

  • 此类对应数据库中的 customers 表

*/

public class Customer {

}

3)数据库中的另一张表的 JavaBean对象

/**

  • 此类对应数据库中的 students 表

*/

public class Student {

}

4)操作 customs 表的 DAO

/**

  • 只能操作 customs 表的 DAO

*/

public class CustomerDAO extends DAO{

}

5)操作 students 表的 DAO

/**

  • 只能操作 students 表的 DAO

*/

public class StudentDAO extends DAO {

}

6)测试类

public class DAOTest {

@Test

public void test1(){

//对 customs 表进行操作

CustomerDAO dao1 = new CustomerDAO();

dao1.add(new Customer());

List list = dao1.getForList(10);

//对 students 表进行操作

StudentDAO dao2 = new StudentDAO();

Student student = dao2.getIndex(1);

}

}

如果没有多态的话,我们需要写很多重载的方法。这是一个重点。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
[外链图片转存中…(img-rg68lNes-1712595083200)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值