本文为【Java基础 合集】初版,后续还会进行优化更新,欢迎大家关注交流~
hello hello~ ,这里是绝命Coding------老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
💥个人主页 :绝命Coding-CSDN博客
💥 所属专栏 :后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖
更多历史精彩文章(篇幅过多,不一一列出):(简历相关)
求职经验分享(1):一份合格的简历应该如何写?-CSDN博客(推荐)
求职经验分享(2):简历如何优化以及如何应对面试【后端篇】-CSDN博客
(项目亮点相关)
大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(1):Redis篇】-CSDN博客
大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】-CSDN博客
(八股文)
大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】_java中redis如何实现点赞-CSDN博客大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】_布隆过滤器不能扩容-CSDN博客
.........
为什么 Object 有 wait ,为什么不全在 Thread 类上写?/ 为什么wait()、notify()、notifyAll()被定义在Object类中而不是在Thread类中?
- 对象锁的概念:
-
- Java 的并发控制机制是建立在对象锁的概念之上的。每个 Java 对象都有一个相关联的监视器(monitor),用于线程间的同步和通信。
- 当一个线程需要访问一个对象时,它必须先获取该对象的锁。因此,线程的等待和通知操作都是针对特定对象的,而不是线程本身。
- 可重用性:
-
- 将这些方法定义在
Object
类中,使得所有的对象都具有这些等待和通知的能力,提高了代码的可重用性。 - 如果放在
Thread
类中,则每个线程对象才拥有这些能力,使用起来会更加不方便。
- 将这些方法定义在
- 线程状态与对象状态的关系:
-
wait()
、notify()
和notifyAll()
方法是用于协调线程对共享资源的访问,这种协调是建立在对象状态的基础之上的。- 一个线程可能需要等待某个对象进入特定的状态,才能继续执行。因此,这些方法的定义放在
Object
类中更加合适。
- 与锁机制的集成:
-
- Java 的同步机制是基于对象锁的。当一个线程获取了一个对象的锁时,它就拥有了对该对象进行
wait()
、notify()
和notifyAll()
操作的能力。 - 将这些方法定义在
Object
类中,可以很好地与 Java 的锁机制相集成。
- Java 的同步机制是基于对象锁的。当一个线程获取了一个对象的锁时,它就拥有了对该对象进行
Condition 类和 Object 类锁方法区别
Condition
类是 Java java.util.concurrent
包中的一个接口,它提供了比 Object
类的 wait()
、notify()
和 notifyAll()
方法更丰富和灵活的线程同步机制。
- 更细粒度的线程同步控制:
-
Condition
接口可以和Lock
接口配合使用,提供了更细粒度的线程同步控制能力。- 一个
Lock
对象可以关联多个Condition
对象,线程可以针对特定的Condition
进行等待和唤醒操作。
- 更灵活的等待条件:
-
- 与
Object
类的wait()
方法只能针对整个对象的状态进行等待不同,Condition
接口可以让线程等待特定的条件变量。 - 线程可以使用
await()
方法等待特定的条件,当条件满足时,其他线程可以使用signal()
或signalAll()
方法来唤醒等待的线程。
- 与
- 更丰富的等待和唤醒方式:
-
Condition
接口提供了await(long time, TimeUnit unit)
,awaitUntil(Date deadline)
等方法,允许线程在指定的时间内等待或者等待到指定时间。- 相比于
Object
类的notify()
和notifyAll()
方法,Condition
接口提供了signal()
和signalAll()
方法来唤醒等待的线程。
Java的基本数据类型都是从object中继承的是吗?
不是的,Java 的基本数据类型并不是从 Object
类继承的。
泛型
"参数化类型 "
泛型就是将类型参数化,其在编译时候才能确定具体的参数
引出泛型的原因:每次使用都需要强制转换成想要的类型;在编译时编译器不知道类型转换是否正常,运行时候才知道是否安全
泛型只存在于编译阶段,而不存在于运行阶段,class文件中没有泛型这个概念
原理
类型擦除
编译器在生成字节码 时会将泛型类型信息擦除,使得泛型类型在运行时不可见。这是为了保持与旧版Java代码的兼容性。
在编译时,对于泛型类或泛型方法,编译器会将泛型类型参数用实际类型 进行替换。
类型擦除的结果是,编译后的字节码中不再包含泛型的类型信息。在运行时,无法获取泛型类型的具体信息,只能看到原始类型。
(类型擦除是编译器在编译过程中把泛型的类型信息删除,只保留原始类型,这样在运行时就无法知道具体的泛型类型了。例如,一个泛型类List<T>
,在编译后的字节码中会变成List,无法知道原来是哪种类型。这是为了保证与之前的非泛型代码的兼容性,但也意味着在运行时无法获取泛型的具体类型,只能操作原始类型的对象。)
应用场景
好处
泛型的主要目标是提高java程序的类型安全
泛型的一个附带好处是使用时候直接得到目标类型,消除许多强制类型转换
由于泛型的实现方式,支持泛型不需要JVM或类文件更改
java中所有类都是基于object,那为什么还要使用泛型,有什么好处?/ 说一说java泛型,泛型的数据类型全部换成object行不行
Java中所有类都是基于Object类的,但是使用泛型可以让我们更好地限制容器内元素的类型,提高程序的安全性和可读性。对于一些特殊的应用场景,单纯使用Object类可能无法满足需求。
完全可以使用Object类替代泛型,但这样会带来一些问题:
1)失去编译时类型检查的优势,增加运行时出错的可能性;
2)需要大量的强制类型转换,代码可读性会下降;
3)无法利用泛型带来的语法糖,如更简洁的集合初始化等。
模版和泛型的区别 / java是伪泛型,cpp泛型怎么实现的
- 模板是C++的一种预处理机制,在编译期展开生成具体的代码;而Java的泛型是伪泛型,在编译后会执行类型擦除,生成普通的字节码。
- 模板可以实现真正的泛型,没有类型擦除;而Java泛型是通过类型擦除来实现的,会丢失一部分类型信息。
extends和super在泛型使用的区别
- extends用于上界限定,限定泛型类型必须是指定类型或其子类。
- super用于下界限定,限定泛型类型必须是指定类型或其父类。
java程序编译之后会有什么?泛型会在字节码文件中存在吗?
- 编译后的Java字节码文件中,不会保留任何原始的泛型信息。
- 编译器会执行"类型擦除"操作,将所有泛型类型参数替换为它们的第一个上界(通常是Object)。
- 为了维持多态性,编译器可能会生成一些桥接方法。
- 由于泛型信息被擦除,编译器有时需要插入强制类型转换来确保类型安全。
- 总的来说,Java中的泛型是编译时的语法糖,但在字节码层面是不存在的。
泛型通配符及其之间的区别,类型擦除
- ?:表示所有类型
- ? extends E: 表示E的子类型
- ? super E: 表示E的父类型
- 类型擦除会导致通配符丢失部分类型信息,需要谨慎使用。
泛型实现机制是什么
泛型的实现机制是基于类型擦除,编译器在编译时会将泛型转换为原始类型(通常是Object),然后进行强制类型转换。这样既能保证泛型的兼容性,又能最大限度地利用现有的面向对象技术。
泛型理解吗,有什么功能,除了限制所放容器的数据类型还有什么功能?
1)限制容器元素类型,提高安全性;
2)消除强制类型转换,提高代码可读性;
3)配合通配符实现灵活的类型参数绑定。除此之外,泛型还可以用于方法、接口、类的定义,提高代码的复用性和灵活性。
泛型在哪些地方不适用
1)基本数据类型,因为基本类型无法作为类型参数;
2)创建泛型数组,数组协变特性与泛型不兼容;
3)异常处理,异常类型无法作为类型参数。
如何分别处理不同的泛型
可以通过类型参数限定(如T extends Number)、通配符(如? extends Number)等方式来处理不同的泛型。
泛型如何被创建,我们怎么去定义这些泛型
泛型的定义方式是在类、接口或方法声明时添加类型参数,如 public class GenericClass<T>{}。
泛型的上下界如何界定,什么时候用什么?
- 上界限定(extends关键字)用于限制类型参数的范围,确保类型参数是指定类型或其子类。
- 下界限定(super关键字)用于限制类型参数的范围,确保类型参数是指定类型或其父类。
如果有两个方法,方法签名一样,然后参数是List的不同泛型,那请问他是方法重载吗?
如果两个方法签名完全一致,但参数列表的泛型类型不同,这就是方法重载。
java泛型与泛型擦除以及使用场景、具体注意事项
Java的泛型是伪泛型,在编译后会执行类型擦除,生成普通的字节码。
使用泛型的主要好处是:
1)增强代码的类型安全性,
2)消除强制类型转换,
3)提高代码的可读性。
使用时需要注意类型擦除带来的一些限制,如不能创建泛型数组等。
JAVA的数据类型
分为数据类型和引用类型
(1)基本类型8个
整数 byte/short/int/long
浮点 float/double
字符 char
布尔 boolean
int 为 4字节 (32位),float一样,其他除以2的倍数或乘2的倍数
(2)引用类型
数组,类,接口
两者区别(扩展)
(1)存储位置
C语言与JAVA的区别
(跨平台,操作内存,指针)
C语言 JAVA
(1)C语言编译型,代码在编译时候会被转换成机器码,直接在计算机上运行;Java是一种解释型语言,它的源代码需要经过解释器转为机器码才能运行
(2)C语言可以直接操作内存,JAVA不行
(C语言支持低级别的内存管理和指针操作;JAVA提供了更多面向对象特性,如封装,继承和多态,还支持自动内存管理和安全机制)
(3)C语言不容易跨平台 ,Java跨平台
(4)C语言有指针,Java没有指针
C++与JAVA的区别
(支持面向对象,跨平台,指针,垃圾回收,多重继承)
(与C语言的差不多)
(1)Java是纯粹的面向对象语言,所有的对象都继承自Object C++兼容C,不但支持面向对象也支持面向过程
(2)Java通过虚拟机从而实现跨平台特性 C++依赖于特定的平台
(3)Java没有指针,他的引用可以理解成安全指针 C++具有和C一样的指针
(4)Java支持自动垃圾回收 C++需要手动回收(C++允许直接访问和操作内存)
(5)Java不支持多重继承,只能通过实现多个接口来达到相同目的 C++支持多重继承
解释下什么是面向对象?面向对象和面向过程的区别?
(1)面向对象:
"万物皆对象"
现实任何物体都可以归为一类事物
每一个个体都是一类事物的实例
以对象为中心
以消息为驱动
(2)区别
①编程思路:
函数 对象
(面向过程是以过程为中心,强调的是过程的执行顺序;面向对象是一种以数据为中心,强调的是数据的抽象和封装)
②封装性:
功能 数据和功能
(面向过程没有封装机制,程序代码和数据是混合在一起的;面向对象数据和代码分开存储,并通过对象的方法来访问和修改数据)
③继承和多态
④
(在面向过程编程中,程序代码以过程的形式来实现特定的功能;每个过程都是一段独立的代码,可以被多个过程调用。面向对象编程则是以对象的形式来实现功能。每个对象都是一个独立的实体,包含了数据和操作数据的方法。对象之间可以通过方法来互相调用)
static的作用
Static的特点
1、static是一个修饰符,用于修饰成员
2、static修饰的成员被所有的对象所共享
3、static优先于对象存在,因为static的成员随着类的加载就已经存在了
4、static修饰的成员多了一种调用方式,即可以直接被类名调用。类名.静态变量
5、static修饰的数据是共享数据,对象中的存储的是特有数据
static修饰的东西,提前加载内存中
/
两个基本的用法:静态变量和静态方法
也就是被static所修饰的变量或者方法都属于类的静态资源,类实例所共享
static也用于静态代码块,多用于初始化操作
static也多用于修饰内部类,此时称之为静态内部类
最后一种用法是静态导包,即 import static 是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名
静态字段存储在类的方法区 中,它们在类加载时被初始化,并且在整个程序运行期间存在。
后期新的八股文合集文章会继续分享 ,感兴趣的小伙伴可以点个关注~
更多精彩内容以及免费资料请关注公众号:绝命Coding