最全预备知识---java之泛型的探索,掌握数据库其实很容易

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public class TestDemo {

public static void main(String[] args) {

MyArrayList1 myArrayList = new MyArrayList1();

//什么类型都可以放到数组里

myArrayList.add(19);

myArrayList.add(20);

myArrayList.add(“sdsd”);

//缺点:取数据的时候需要强制类型转换

int a=(int)myArrayList.get(1);

System.out.println(a);

}

}

可以看到只需要修改数据类型为Object,便可以完成对顺序表的操作,但是这样的操作有一个缺点,就是插入数据的时候可以随便插入,但是获取数据的时候却必须进行强制类型转换,所以就会显的非常的麻烦,此时为了简化就需要用到泛型.

下面先来看下泛型是如何解决我们上述顺序表的,来看源码(并仔细看注释):

//类这块的泛型的字母可以是任意的

//T是类型变量(Type Variable),变量名一般要大写

//T在定义时是形参,代表的意思是MyArrayList最终传入的类型,但现在还不知道

class MyArrayList {

//定义一个T类型的数组,此时并不知道到底是什么类型的数组

public T[] elem;

public int usedSize;

public MyArrayList() {

/*此处为什么要用强制类型转换:我来解释下:

首先这么写是因为泛型类的原因,当我们强转其为T类型的数组时,此时我们并不知道这个数组强转后到底是什么数组,因为

T此时并没有给定一个合适的引用类型,而数组的类型是由后续我们填入的引用类型来决定的,这就提供类一个通用的数组模板,且后期

不需要进行强制类型转换

*/

this.elem = (T[]) new Object[10];

/*为什么不直接定义一个T类型的数组,因为此时发生了泛型的擦除机制,即将泛型擦除为Object,从而此时的泛型具有了Object的特质

所以此时的this.elem=new T[10];就等价于this.elem=new Object[10];

注意我们并不能直接写成this.elem=new T[10]这样的形式,原因是T只是在编译的时候被擦除为Object,具有了Object的特质,并不是T直接就等价于Object

而当我们是想要一个非Object类型的通用的数组,且后期不需要进行强制类型转换,此时才需要写成 this.elem = (T[]) new Object[10]这种形式.

并且只有当父类赋给子类的时候才进行强制类型转换,子类给父类不需要进行强制类型转换,因为发生了向上转型.

/*

此时大家还是会有疑问,此时创建数组可否换一个写法:如下所示:

this.elem = (T[]) new Integer[10];

此时我们会发现编译器会报出一个ArrayStoreException异常,原因是T与Object其实在这里是绑定的,

举个例子,假如我们此时T处为String类型的话,(T[]) new Object[10];就等价于(String[]) new Object[10],

此时String是Object类的子类,此时便会创造出一个String类型的数组,

如果此时是(T[]) new Integer[10];这段代码的话,就等价于(String[]) new Integer[10],此时String并不是Integer的子类

那么最终便会抛出ArrayStoreException异常。

*/

}

//插入数据,插入的数据类型由T处的数据类型决定

public void add(T data) {

this.elem[this.usedSize] = data;

usedSize++;

}

//根据T处的数据类型来返回相应的值

public T get(int pos) {

return this.elem[pos];

}

}

public class TestMain {

public static void main1(String[] args) {

//T为String类型

MyArrayList myArrayList = new MyArrayList<>();

myArrayList.add(“sss”);

myArrayList.add(“ddd”);

myArrayList.add(“fff”);

String str = myArrayList.get(1);

System.out.println(str);

//T为整数类型

MyArrayList myArrayList2 = new MyArrayList<>();

myArrayList2.add(1);

myArrayList2.add(2);

int val = myArrayList2.get(1);

System.out.println(val);

//T为浮点数类型

MyArrayList myArrayList3 = new MyArrayList<>();

}

}

可以看到此时不再进行强转类型转换来获取顺序表中的数据,而是直接通过下标便可以获取,这就是泛型的厉害之处

从而引出泛型的两个意义

1、自动进行类型的检查

为什么可以自动进行类型的检查,是这样的:T处的数据类型可以有很多种,例如简单数据类型的包装类,引用类型以及自定义数据类型,假如此时我们在泛型类内部

定义一个数组的话,这个数组的类型可以跟T处定义的类型有关,并且后期往数组里面插入数据的时候会自动检查插入的数据是否跟T中的数据类型匹配,如果匹配,那么就直接插入,这样子我们就制作出来了一个通用的顺序表

2、自动进行类型的转换

紧接着上面,根据之前我们写通用顺序表的写法,是直接定义一个Object类型的数组,这样就会导致

最终我们在获取顺序表中的某个值的时候必须进行强制类型转换(具体可参照上面的diamagnetic),而当我们使用了泛型之后,便不再存在这样的问题,因为泛型会帮我们自动进行类型的转换。例如String str = myArrayList.get(1)这段代码,他就自动进行了类型转换

同时通过初始化数组的时候的T【】这样的强转方式,我们引出一道面试题目:

泛型是怎么编译的?

答:这涉及到了泛型的擦除机制,进行类型擦除,编译的时候都会把泛型擦除为Object并不是我们所理解的替换为Object,从而此时的泛型具有了Object的特质

泛型的注意事项

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

1:泛型只存在于编译时期,只是编译时期的一种机制,1.即运行期间没有泛型的概念。

2:简单类型不能做泛型类型的参数,例如下面的int就不能做参数,尖括号中只能是引用类型,而像java当中的八种基本数据类型

就不能放在尖括号里面,此时放入的应该是这八种基本类型所对应的包装类,因为包装类是引用类型

MyArrayList myArrayList1 = new MyArrayList<>();

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值