😄 吊打面试官,你需要懂这些Java基础题(系列一)
本篇文章适合正在学习Java基础的小伙伴儿,以及正在找工作的大佬面试使用。如果文章有写的不准确或需要改进的地方,还请各位大佬不吝赐教💞💞💞。
胖胖仔在此先感谢大家了。😘😘😘
🏠个人主页:https://www.artprogramming.xn–6qq986b3xl/点击直达
🧑个人简介:大家好,我是胖胖仔,一个想要与大家共同进步的程序猿😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
🌆Java基础思维导图
🏯Java的基本数据类型有哪些?默认值?
基本数据类型 | 默认值 | 包装类 | 范围 |
---|---|---|---|
byte | 0 | Byte | -2^7 ~ 2^7-1 |
short | 0 | Short | -2^15 ~ 2^15-1 |
int | 0 | Integer | -2^31 ~ 2^31-1 |
long | 0 | Long | -263~263-1 |
char | Character | \u0000~\uffff | |
float | 0.0f | Float | -3.410^38 ~ 3.410^38 |
double | 0.0d | Double | -3.410^38 ~ 3.410^38 |
boolean | false | Boolean |
🏰自动装箱,自动拆箱的应用场景
自动装箱:一个基本类型的数据直接赋值给对应的包装类型。💛
自动拆箱:一个包装类型的对象直接赋值给对应的基本类型。💙
⛺️面向对象的三大特征是什么?
面向对象的程序设计方法具有三个基本特征:封装、继承、多态。
🏭面向对象的三大特征是什么?
封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;
继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;
多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
🗼说一首重写和重载的区别
重载发生在同一个类中,若多个方法之间方法名相同,参数列表不同,则构成重载关系。
重写发生在父类子类中,若子类方法想要和父类方法构成重写关系,则它的方法名,参数列表,必须与父类相同。
🗾对泛型的理解
丢进 忘记 取出 自动记住
Java集合有一个缺点把一个对象“丢进”集合之后,集合会“忘掉”这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型(运行时类型没变)
Java集合设计成能保存任何类型的对象,只要具有很好的通用性。
1.想创建一个只能保存Dog对象的集合,但程序将Cat对象“丢"进去,所有可能引发异常。
2.对象“丢进”集合时, 集合丢失了对象的状态信息,只知道它盛装的时Object
有了泛型,程序再也不能“不小心”把其它对象“丢进“集合中。而且程序更加简洁,集合自动记住所有集合元素的数据类型,从而无须对集合元素进行强制类型转换。
🚙 List<? super T>和List<? extends T>有什么区别?
参考答案
通配符,T的父类型,T的子类型。
- ? 是类型通配符,List<?> 可以表示各种泛型List的父类,意思是元素类型未知的List;
- List<? super T> 用于设定类型通配符的下限,此处 ? 代表一个未知的类型,但它必须是T的父类型;
- List<? extends T> 用于设定类型通配符的上限,此处 ? 代表一个未知的类型,但它必须是T的子类型。
🌄说一说对Java反射机制的理解
编译时类型和运行时类型
程序运行时,
1.可以通过反射获得任意一个类的Class对象
2.可以通过反射创建任意一个类的实例,并访问该实例的成员
3.可以通过反射机制生成一个类的动态代理类或动态代理对象
Java程序中的对象在运行时表现出两种类型,即编译时类型和运行时类型。例如 Person p = new Student(); ,这行代码将会生成一个p变量,该变量的编译时类型为Person,运行时类型为Student。程序在运行时接收到外部传入的一个对象,该对象编译时类型是Object,但程序又需要调用该对象的运行时类型的方法。这就要求程序程序需要在运行时发现对象和类的真实信息,
1.假设在编译时和运行时都完全知道类型具体信息,先使用instanceof运算符进行判断,再利用强制类型转换成运行时类型的变量即可
2.编译时根本无法预知该对象和类可能属于那些类,程序只依靠运行时信息来法相该对象和类的真实信息。
通过反射机制,我们可以实现如下操作:
1.程序运行时,可以通过反射获得任意一个类的Class对象,并通过这个对象查看这个类的信息;
2.程序运行时,可以通过反射创建任意一个类的实例,先访问该实例的成员;
3.程序运行时,通过反射机制生成一个类的动态代理类和动态代理对象。
🚘Java中有那些容器?
- Set代表无序的,元素不可重复的集合;
- List代表有序的,元素可以重复的集合;
- Queue代表先进先出(FIFO)的队列;
- Map代表具有映射关系(key-value)的集合。
HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap,这些都是线程不安全的集合类,但是它们的优点是性能好。
🌈Map put的过程
-
首次扩容:
先判断数组是否为空,若数组为空则进行第一次扩容(resize);
-
计算索引:
通过hash算法,计算键值对在数组中的索引;
-
插入数据:
- 如果当前位置元素为空,则直接插入数据;
- 如果当前位置元素非空,且key已存在,则直接覆盖其value;
- 如果当前位置元素非空,且key不存在,则将数据链到链表末端;
- 若链表长度达到8,则将链表转换成红黑树,并将数据插入树中;
-
再次扩容
如果数组中元素个数(size)超过threshold,则再次进行扩容操作。
🌅JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap,是基于数组+链表来实现的,底层是维护一个entry数组
JDK8中的HashMap,是基于数组+链表+红黑树来实现的,底层维护一个Node数组
HashMap为什么用红黑树而不用B树
如果用B/B+树的话,数据量不是很多的情况下,数据都会挤在一个结点里面,这个时候遍历效率就退化了链表。
🌅Java中的IO流
IO(Input Output)用于实现对数据的输入与输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream)。流是从起源到接收的有序数据,有了它程序就可以采用同一方式访问不同的输入/输出源。
数据流向:输入流和输出流
数据类型:字节流和字符流
处理功能:节点流和处理流
欢迎大家关注公众号《深度IT世界》学习更多内容。💓💓💓