泛型和枚举
面试八股文:计算机专业课
JavaSE高级部分
1.泛型
2.枚举
3.多线程(难点)
4.集合(数据结构,树-二叉、红黑、B+、B-)
5.IO流(操作文件)
6.网络通信Socket(tomcat)
7.反射和注解
泛型:(Generics)
之前涉及到的超级数组中,要么只能存数字,要不(Object)啥都能存。有点点鸡肋。
什么是泛型?-->泛型广泛的、普通的类型。泛型能够帮助我们把类型明确的工作推迟到创建对象或者调方法的时候。
意思就是,我定义类的时候,不需要考虑这个数组到底要存什么类型。创建这个超级数组对象的时候才把里面要存的数据的类型确定下来。
泛型的修饰:1.泛型类 2.泛型方法 3.泛型接口
泛型类:
把泛型定义在类上,用户在使用类的时候才能把类型给确定。
具体使用方法:使用<>加上一个未知数,通常用T K V大写字母表示。但实际上用啥都行,只要是个单词就可以。
当我们在一个类后面加上了泛型<T>,这个T就是一个数据类型。既然T是一个数据类型,那我们就可以拿过来用。

如果一个泛型类,在创建对象的时候没有指定泛型类型,默认还是Object。
在使用类的时候,去确定泛型类型。
SuperArray存String类型
SuperArray1存Employee类型
规范:JDK7之后,可以省略等号右边的泛型声明,但<>必须得有。类型推断
完整写法:JDK7之前
泛型方法:
如果我们只关心某个方法,可以不定义泛型类,只定义泛型方法。
泛型方法是不是一定要在泛型类里?no
泛型类里是不是一定要有泛型方法?no
在定义泛型方法时,要首先定义泛型类型。定义在方法中间,泛型的使用处之前。
拿着这个t在方法中做好多事情,再把t返回回去。调用另一个方法。
使用泛型方法,最好要结合返回值。如果没有返回值,那么它和Object没有差别。
重点:知道什么样的方法叫泛型方法。
泛型中的继承关系:继承和泛型没有强制关系
1.父类是一个泛型类,子类要不要是泛型类?no
2.永远记住,泛型的声明只能在当前类名后或者方法中间。
3.在子类继承父类时,子类泛型和父类泛型都写出来的情况下,父跟子。

4.如果在继承时,没有写出任何泛型,当前子类就不是泛型类。
如果在一个泛型类中,尽量就不要再使用泛型方法。泛型方法多数都是出现在非泛型类中。
静态泛型方法
1.静态方法如果是泛型方法,泛型的声明必须写。
2.因为静态结构是属于类的,不属于某个对象。
?通配符:可以接受任何类型
如果使用Object类型,别写泛型。泛型约束类的数据类型。JDK1.5之后才有的泛型。
类型擦除:
为了一些兼容性,使用到原始类型(没有泛型)是可以的。
泛型刚刚出现的时候,存在着大量的不使用泛型的代码。
保证代码的兼容性,将参数化类型的实例传递给设计用于原始类型的方法必须是合法的。
为了保持这种兼容性,Java泛型中,其实有一种类似于伪泛型,因为Java在编译期间,所有的泛型都会被擦掉。
Java的泛型语法是在编译期这个维度上实现的。正常来说在生成的字节码文件中,不不含泛型的类型信息的。
在JVM中,看到的只是SuperArray,由泛型追加的类型信息对JVM是看不到的。可以理解为:泛型的本质就是让程序员在编写代码时遵守的一个规则。
比如SuperArray:在确定了泛型之后,这个超级数组中就统一只放同一类型的,如果放入其他类型,编译不通过。
小要求
1.泛型不能是基本数据类型,-->用包装器类型(原则上来说,数组可以作为泛型;语法角度不可以)
<>里面放的就应该是类名,数组是在编译后才会生成一个类($xxx)
2.方法重载:a.同一个类型 b.方法名相同 c.参数不同
原理:类型擦除
3.多态上。
泛型的应用场景
1.父类(接口):起到的是一个规范的作用,对里面的数据类型没有明确要求。
2.容器类:(超级数组、链表、队列、栈)
当类型无法确定时,使用泛型。开发中,我们更多是会使用到一些泛型类或是泛型接口。
接口中存储的一定是大家都能用的。
removeFirst removeLast
以后我们面向接口编程,接口里的方法不能出现实现类里方法体为空的情况。
枚举类型
应用场景:
在某些情况下,一个类的对象的个数是有限的。
如季节,春夏秋冬,比如24节气,星期......
规定这个类的对象的个数。

枚举类型的关键字enum,👆作用等同于:public static final Season SPRING = new Season(1,"春天");
枚举类中:把需要用到的对象声明出来。
写对应的构造器,可以有对应的get、set方法。
枚举在switch中可以使用
枚举的静态导入,*代表导入枚举类的所有对象

枚举类的命名规则:所有的枚举类要以Enum结尾。
单例模式4-->使用枚举类实现单例模式《高效Java》 Ch05
单元素的枚举类型已经成为实现单例模式的最佳方案。

枚举的优势
1.int类型不具备安全性。假如某个程序员在定义int时少写了个final,会存在被他人修改的风险。枚举类,它天然就是一个常量类
2.使用int类型,语义不够明确,如果说在控制台打印输入1。
3.枚举里面都是常量,静态。推荐枚举的比较使用==
多线程入门
我们要学习多线程,需要学习一些计算机组成的一些知识。CPU8核以上和内存16G。

计算机为了完成特定的任务,用某种编程语言写一个软件(程序)。
程序要想运行就必须加载到内存中执行。
在执行程序的时候,实时的指令加载到CPU内存的指令寄存器中执行。
执行过程中产生的数据要加载到数据寄存器中,ALU赋值进行算法逻辑运算的操作。
系统总线(System Bus):连接计算机系统的主要组件,用来降低成本和促进模块化。-->可以通过软件来控制硬件。
进程:一个正在执行中的程序就是一个进程。系统就会为这个进程发配独立的运行资源。
进程是程序的一次执行过程,它有自己的生命周期。它会在启动程序时产生,运行程序时存在,关闭程序时消亡。
早期的计算机,单进程,同一时间只能执行一个进程。计算器,同一时间只能执行一段代码。
随着计算机的发展,CPU的计算能力大幅提升,按照时间线交替执行不同继承的方式。每个执行一点点时间,感官上觉得这么多的进程是同时在运行。
如果一个进程有多个任务
如果为每一个任务分配单独的进程去执行,进程间通信。CPU调度。
病毒,熊猫烧香。操作你的运行中的进程,修改了你的数据。
引入了线程。线程是由进程创建,是进程的一个实体,是具体干活的人。
一个进程有多个线程。线程不独立分配内存,而是共享进程的内存资源。
线程可以共享cpu资源。
进程更强调的是内存资源分配,线程更强调的是计算的资源的分配。
因为有了线程的概念,一个进程的线程不能修改另一个线程的数据,线程之间相互之间都是隔离的,安全性更好。
使用浏览器打开两个腾讯视频,他们同时播放视频,我一个浏览器也可以同时下载多个文件。同时播放两个视频,在多线程的作用下。
下载,网络,IO问题。
我的电脑有2个核心,又有4个逻辑处理器。2核心4线程。
8核心16线程啥意思?
理论上,一个核在一个时间点只能抛一个线程,但是cpu同一个时间能跑16个线程。
1.物理cpu内核,每颗物理cpu可以有1个或多个物理内核。通常情况下物理cpu内核数都是固定的,单核cpu就只有一个物理内核...
2.逻辑cpu内核,操作系统可以使用逻辑cpu来模拟真实cpu。在没有多核心cpu情况下,单核cpu只有一个核,可以把一个cpu当个多个cpu来使用,逻辑cpu的个数就是作用的cpu物理内核数。英特尔研发的技术--超线程,2002年发布,硬件有关,了解即可。
几个问题:
1.我们的进程直接创建,不能调度线程。
2.QQ执行了一会,不执行,等其他线程执行完毕之后。
在上一次执行间歇期,会记录位置。
不同进程间的线程切换,耗费极大资源空间。
微服务,金融、电商(技术角度,难度最大,流量大)、zf(最简单,技术老)、数据
今日需要掌握的点
1.泛型类泛型接口的应用,何时确定泛型类型
2。枚举类的声明和使用
3.什么是进程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端