Java基础
2022-10-25 17:06:19 34 举报
AI智能生成
学习java语言需要掌握的一些基础知识
作者其他创作
大纲/内容
Java语言简介
Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新。Java自面世后就非常流行,发展迅速,对C++语言形成有力冲击。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
面向对象
什么是面向对象
面向对象是对于面向过程功能的一种封装如果我们使用面向过程,我们需要编写五个步骤的代码,一步一步去实现;而如果我们使用面向对象的话,只需要调用封装好的两个对象即可。
所以说:面向过程比较直接高效,面向对象更易于复用,扩展和维护。
所以说:面向过程比较直接高效,面向对象更易于复用,扩展和维护。
面向过程
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想
面向对象
对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。 [3]
面向对象的三大基本特征
封装
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
多态
多态是同一个行为具有多个不同表现形式或形态的能力
子主题
子主题
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。当然,如果在父类中拥有私有属性(private修饰),则子类是不能被继承的。
面向对象的五大基本原则
单一职责原则
开放封闭原则
里氏替换原则
接口隔离原则
依赖倒置原则
封装、多态、继承
什么是多态
方法重写与重载
Java的继承与实现
多继承
菱形继承问题
组合与继承
什么是组合
组合与继承的区别和联系
优缺点对比
如何选择
构造函数
默认构造函数
变量
类变量
成员变量
局部变量
作用域
成员变量
方法
Java对象
Object类
Java Bean
getter/setter
为什么使用success而不是isSuccess
equals和hashCode
equals的多种实现
equals和hashCode的关系
平台无关性
Java如何实现的平台无关性
JMV还支持哪些语言
Kotlin
Groovy
JRuby
Jython
Scale
值传递
实参与形参
形式参数:定义函数时使用的参数,用来接收函数传入参数,比如我们写个函数,函数中的参数为形式参数
实际参数:我们调用函数时,函数名后面括号中的参数称为实际参数,必须有确定的值,如下面例子所示
求值策略
值传递
Java传参的类型如果是基本数据类型,是值传递
引用传递
Java传参的类型如果是引用类型,传递的是引用类型的栈地址,仍然是值传递,只不过指向的堆的地址是相同,因此可以修改引用类型指向的推中的内容
共享对象传递
传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。
为什么说Java中只有值传递
在Java中,除了基本数据类型以外,其他的都是引用类型,引用类型在内存中有两块存储空间(一块在栈stack中,一块在堆heap中)。
如果参数是引用类型,传递的就是实参所引用的对象在栈中地址值的拷贝,这里创建的副本是 地址的拷贝。那就有人说了,可是它值变了呀,这明明就是"引用传递"嘛?
我们可以换个角度理解,如果我们把栈地址当成值,会创建栈地址副本(复制栈帧),栈地址最终并没有改变,改变的是堆内存中的值。这就好比栈地址是钥匙,我们copy了一把,它能打开保险箱。我们关心的是钥匙有没有花纹这种变化,至于打开保险箱后的钱多钱少,我们并不需要关心。
虽然调用完函数后,str2变量值(堆中的数据)改变了,但是参数是引用类型,传递的实参是 栈中地址值,这是我们关心的,拷贝的是栈中地址值,最终栈中地址值并没有改变。所以是符合值传递的定义创建副本,不会影响原生对象。
如果参数是引用类型,传递的就是实参所引用的对象在栈中地址值的拷贝,这里创建的副本是 地址的拷贝。那就有人说了,可是它值变了呀,这明明就是"引用传递"嘛?
我们可以换个角度理解,如果我们把栈地址当成值,会创建栈地址副本(复制栈帧),栈地址最终并没有改变,改变的是堆内存中的值。这就好比栈地址是钥匙,我们copy了一把,它能打开保险箱。我们关心的是钥匙有没有花纹这种变化,至于打开保险箱后的钱多钱少,我们并不需要关心。
虽然调用完函数后,str2变量值(堆中的数据)改变了,但是参数是引用类型,传递的实参是 栈中地址值,这是我们关心的,拷贝的是栈中地址值,最终栈中地址值并没有改变。所以是符合值传递的定义创建副本,不会影响原生对象。
基本数据类型
8种基本数据类型
整型
byte
short
int
long
浮点型
float
double
布尔型
boolean
字符型
char
取值范围
byte
short
int
long
浮点型
什么是浮点型
单精度和双精度
为什么不能用浮点型表示金额
自动拆装箱
包装类型
基本类型
自动拆装箱
整型的缓存机制
基本数据类型和包装类怎么选
Java中负数的绝对值不一定是正数
这要从Integer的取值范围说起,int的取值范围是-2^31 —— (2^31) – 1,即-2147483648 至 2147483647
那么,当我们使用abs取绝对值时候,想要取得-2147483648的绝对值,那应该是2147483648。
但是,2147483648大于了2147483647,即超过了int的取值范围。这时候就会发生越界。
那么,当我们使用abs取绝对值时候,想要取得-2147483648的绝对值,那应该是2147483648。
但是,2147483648大于了2147483647,即超过了int的取值范围。这时候就会发生越界。
只有当要取绝对值的数字是-2147483648的时候,得到的数字还是个负数
String
字符串的不可变性
jdk6和jdk7中substring的原理和区别
replaceFirst、replaceAll、replace的区别
String对"+"的重载
字符串拼接的几种方式和区别
StringJoiner的使用和原理
从String中移除空白字符串的多种方法
String.valueOf和Integer.toString的区别
字符串池
常量池
Class常量池
运行时常量池
字面量什么时候存入字符串池
intern的原理与用法
Strring.intern()的作用就是将String池化,这个池是String的常量池。不同版本的JDK有不同的实现。
String的长度限制
关键字
transient
instanceof
volatile
synchronized
final
static
const
集合类
常用集合类的使用
Set和List的区别
1、list可以插入多个null元素,而set只允许插入一个null元素
2、list容器是有序的,而set容器是无序的
3、list方法可以允许重复的对象,而set方法不允许重复对象等等
Set如何保证元素不重复
根据对象的哈希值计算存储位置如果当前位置没有元素则直接存入如果当前位置有元素存在,则进入第二步
当前元素的元素和已经存在的元素比较哈希值如果哈希值不同,则将当前元素进行存储如果哈希值相同,则进入第三步通过equals()方法比较两个元素的内容
如果内容不相同,则将当前元素进行存储。如果内容相同,则不存储当前
集合的遍历
ArrayList和LinkedList和Vector的区别
ArrayList和Vector的底层是动态数组,LinkedList的底层是双向链表.
ArrayList和Vector的区别就是ArrayList是线程不安全的,Vector是线程安全的
ArrayList和LinkedList的区别,其实ArrayList和LinkedList之间的区别就是数组和双向链表之间的区别。
SynchronizedList和Vector的区别
SynchronizedList:java.util.Collections中的一个静态内部类,可以通过List进行构造,用于返回线程安全的List集合
Vector:java.util包中的类,一个和ArrayList相同底层实现的线程安全的List集合
Vector:java.util包中的类,一个和ArrayList相同底层实现的线程安全的List集合
构造机制不同。
SynchronizedList:可将所有的List的子类转成线程安全的类,例如可以把ArrayList和LinkedList直接转换成SynchronizedList,而无需改变底层数据结构。 Vector:底层结构固定,无法转换
SynchronizedList:可将所有的List的子类转成线程安全的类,例如可以把ArrayList和LinkedList直接转换成SynchronizedList,而无需改变底层数据结构。 Vector:底层结构固定,无法转换
扩容机制不同
SynchronizedList:如果用ArrayList构建SynchronizedList的话,那么SynchronizedList为1.5倍扩容
Vector:Vector缺省情况下2倍扩容
SynchronizedList:如果用ArrayList构建SynchronizedList的话,那么SynchronizedList为1.5倍扩容
Vector:Vector缺省情况下2倍扩容
同步机制不同
SynchronizedList:使用同步代码块实现同步,锁定的对象为mutex(构造函数可以传入一个Object,如果在调用的时候显示的传入一个对象,那么锁定的就是用户传入的对象,反之锁定this对象)
Vector:使用同步方法实现同步,锁定this对象
SynchronizedList:使用同步代码块实现同步,锁定的对象为mutex(构造函数可以传入一个Object,如果在调用的时候显示的传入一个对象,那么锁定的就是用户传入的对象,反之锁定this对象)
Vector:使用同步方法实现同步,锁定this对象
HashSet、LinkedHashSet和TreeSet的区别
HashMap、HashTable、ConcurrentHashMap区别
不要使用双括号法初始化集合
同步容器的所有操作一定是线程安全的吗
HashMap的数据结构与扩容机制
HashMap中size和capacity的区别
HashMap中loadFactor和thrshold
为什么建议初始化集合时指定容量
HashMap的初始容量设置成多少合适
HashMap的默认容量为什么是16
HashMap的默认负载因子为什么是0.75
HashMap的线程安全问题
为什么不能在foreach循环里对集合中的元素进行remove/add操作
如何在遍历的同时删除ArrayList中的元素
fail-fast和fail-safe
Java8中的Map为什么引入了红黑树
为什么将HashMap转红黑树的阈值设置为8
Java8中stream相关用法
Java中的并发容器
Linked vs Array
阻塞队列与非阻塞队列
Blocking vs Transfer
Copy-On-Write
Skip List
枚举
枚举的用法
Enum类
Java枚举如何比较快
switch对枚举的支持
为什么说枚举是实现单例最好的方式
枚举的序列化如何实现
枚举的线程安全性问题
为什么接口返回值不能使用枚举类型
IO
字符流、字节流
输入流、输出流
同步、异步、阻塞、非阻塞
Linux5种IO模型
BIO、NIO和AIO的区别
三种IO的用法与原理
Netty
反射
反射的概念与作用
原理
在程序运行的时候获取到想要创造实例的类的信息,使用Class类来创建一个对应的实例。避免了使用new关键字,达到在程序运行时动态创建实例的效果。
Class类
Java.lang.reflect.*
反射是如何破坏单例的
利用反射与工厂模式实现Sping IoC
动态代理
静态代理、动态代理
动态代理与反射的关系
动态代理的几种实现方式
AOP
序列化
什么是序列化与反序列化
为什么序列化
序列化底层原理
什么是transient
为什么不能随便修改serialVersionUID
序列化如何破坏单例模式
使用序列化实现深拷贝
protobuf
为什么说序列化并不安全
Apache-Common-Collections的反序列化漏洞
fastjson的反序列化漏洞
JavaBean的属性名对序列化的影响
注解
注解及注解的使用
元注解
自定义注解
注解的继承与组合
Java中常用注解
注解与反射的组合
日常开发中的常用注解
为什么不要过度依赖注解
JMS
什么是Java消息服务
JMS消息传送模型
JMX
java.lang.management.*
java.management.*
泛型
泛型与继承
类型擦除
泛型各种用法
泛型中KTVE?object等的含义
在泛型为String的List中存放Integer对象
泛型与桥接方法
限定通配符和非限定通配符
上下界限定符extends和super
泛型的PECS原则
List和原始类型List之间的aqkl
List<?>和List之间的区别是什么
泛型会带来哪些问题
异常
异常类型
正确处理异常
自定义异常
Error和Exception
异常链
try-with-resources
finally和return的执行顺序
正则表达式
java.lang.util.regex.*
时间处理
时区
冬令时和夏令时
时间戳
CET,UTC,GWT,CST几种常见时间的含义和关系
SimpleDateFormat的线程安全性问题
Java8中的时间处理
如何在东八区的计算机上获取美国时间
为什么日期格式化使用y表示年,而不能用Y
编码方式
ASCII和Unicode
有了Unicode为啥还需要UTF-8
Unicode是用两个字节表示每个字符的字符编码方案。是将字符信息转化为数字信息的一个关系映射表,在他的表数范围(0-2^16-1)内,每一位数字都对应着一个唯一的字符信息。
什么是UTF-8?
UTF-8是一种编码格式,规定了如何将一个数字转化为二进制,是一种转换规则。
区别:
字符集:是一张映射表,将每一位字符信息对应一个数字信息,供计算机存储。
编码格式:是一种转换规则,规定了数字信息按何种方式转化为二进制数。
总结:字符集是将字符转为数字,编码格式规定数字的进制转化规则。
什么是UTF-8?
UTF-8是一种编码格式,规定了如何将一个数字转化为二进制,是一种转换规则。
区别:
字符集:是一张映射表,将每一位字符信息对应一个数字信息,供计算机存储。
编码格式:是一种转换规则,规定了数字信息按何种方式转化为二进制数。
总结:字符集是将字符转为数字,编码格式规定数字的进制转化规则。
有了UTF-8为什么还需要GBK
GBK、GB2312、GB18030之间的区别
UTF8\UTF16\UTF32的区别
URL编解码、Big Endian和Little Endian
如何解决乱码问题
API&SPI
API
SPI
如何定义SPI
SPI的实现原理
API与SPI的关系和区别
BigDecimal
BigDecimal与精确计数
为什么不直接使用double创建一个BigDecimal
为什么不能使用BigDecimal的equals方法比较大小
0 条评论
下一页