JAVA核心知识点整理
2024-07-29 15:59:38 0 举报
AI智能生成
登录查看完整内容
Java语言基础是学习Java的第一步,包括数据类型、运算符、控制语句等。Java提供了丰富的数据类型,如整型、浮点型、字符型、布尔型等,这些数据类型为程序员提供了灵活的编程选择。运算符用于执行各种算术、逻辑和位操作,控制语句则用于控制程序的流程。模板对Java的核心知识点进行了全面整理和深入解析,包括Java语言基础等内容,可以帮助大家更好地掌握Java编程技术,提高开发能力。在实际应用中,要注重练习和实践,不断提升自己的编程水平。
作者其他创作
大纲/内容
像栈溢出、堆溢出、方法区溢出这些
Error
可以进行处理,处理完程序可以继续正常运行,如果不处理,程序直接停止
下标越界、类型转换异常、空指针、运算符异常、非法参数
运行时异常〔非受检)
找不到文件
未知host
非运行时异常(受检)
Exception
Throwable
有资源要释放的用try resourcetry
try catch finally
处理
throw
手动抛异常
异常
资源分配的单位:进程
调度单位:线程
进程和线程的区别看操作系统去
并发:时间段
并行:时刻
并发和并行的区别也看操作系统去
互斥
请求和保持
不可抢占
循环等待
看操作系统去
避免一个线程向时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
使用try Lock
死锁的避免
死锁
问题:不支持多继承
继承thread类
实现Runnable接口
实现Callable接口〈有返回值、-异常),用FutureTask接收返回值
线程池
线程的创建方式
NEW
RUNNABLE
wait
time waiting
block
terminate
线程生命周期
start()|注意和run()区别,直接调用run是在主线程里执行方法,调用start()本质是调用了native方法向操作系统申请了资源
join,在一个线程中调用其他线程的join方法,实现同步效果
sleep,记住不释放锁就行了
打断线程
interrupt()
判断打断线程的状态,不会清除打断标记
islnterrupted()
判断线程状态,会清除打断标记
interrupted(),静态方法
中断
线程常用方法
线程id
线程名
线程优先级
线程状态
线程属性
空间换时间,每个线程拥有自己的一份副本变量
当一个线程调用ThreadLocal的Set方法时,首先会从尝试直接从当前Thread的threadLocals或员变量获取,如果这个成员变量为null,则表示当前线程还没有初始化ThreadLocalMap,接着会调用createMap方法初始化当前线程的ThreadLocalMap对象,.key值为当前的ThreadLocal对象,创建完成后将这个对象赋值给当前Thread的threadLocalMap对象。
ThreadLocalMap
ThreadLocal只是一个壳子,内部使用的ThreadLocalMap类才是实质
InheritableThreadLocal继承自ThreadLocal,重写了childvalue. getMap和\"createMap方法,实现父子线程共享的核心是对于childvalue的重写。结合-Thread类的init方法来看,Thread对象在创建的时候,如果父类的inheritableThreadLocals不为空,则会调用ThreadLocal的createlnheriteMap方法进行创建,接着通过childvalue方法获取父线程的值,把父线程的inheritableThreadLocals的值赋值到新的ThreadLocalMap对象
InheritableThreadLocal
ThreadLocal
线程安全问题(这里不写,看JVM去)
object类里的wait、notify等方法
LockSupport里的park、unpark
JUc里的await,signal等方法
线程通信
并发机制的底层实现原理(看JVMq)
降低资源消耗
提高线程响应速度
提高线程的可管理性
优点
核心线程数
最大线程数
空闲线程存活时间
存活时间的单位
等待任务的阻塞队列
创建线程的工厂
直接抛出异常
让调用者自己执行
丢弃最近的―个任务,执行当前任务
.不处理,丢弃
拒绝策略
线程池的主要参数
如果满了”按照策咯处理无法执行的任务
如果满了,判断线程池是否已满
提交一个任务,首先判断核心线程池是否已满
线程池的处理流程
shutdown
强硬,直接停止正在执行的线程,关闭线程池
shutdownNow
线程池的关闭
CPU密集型、IO密集型或者是混合型
①判断任务特性
②使用有界队列
③合理监控线程池
如何合理的配置线程池
多线程并发
indexOf
charAt
查找
subString
split
截取
replace
替换
大小写转换
trim
去空
开头结尾
length
getbytes
toString
String
StringBuilder
StringBuffer
曰期类
System类
Runtime类
常用API
数组、线程不安全
ArrayList
双向链表
LinkedList
数组,线程安全
Vector
List(有序可重复)
底层是HashMap的key
HashSet
LinkedHashSet
TreeSet
set(无序不可重复)
Collection
数组+链表+红黑树
HashMap
Properties
HashTable数组+链表
TreeMap
排序
复制,替换
添加
同步
Collections工具类
集合
类
接口
方法
泛型工作中偶尔会用到(封装Result类)
java的泛型是编译擦除的
泛型
反射工作中基本没用到,但是理解这个很重要,对看源码帮助很大
反射
老实说我不是很想讲这个,工作中要使用基本都是调人家封装好的,像hutool和guava、 apach的lang
IO
老实说我这个也不想讲,写业务根本就没有地方给你用网络编程,除非你自己造
网络编程
Lambda表达式
函数式接口
Stream APl
8
新特性
高级
byte
short
int
long
整型
float
double
浮点型
char
字符型
true
false
布尔
基本数据类型
小的会自动转大的
自动类型握升
丢失精度
(5强制类型)
强制类型转换
只能用+号运算,结果一定是String
甚本数据类型和String的运算
byte、short、char在运算中会转为int
引用数据类型—类、接口、数组
变量
直接使用i++和++i没区别
i++,先用i,在加1
++i,先加1再用i.
结合赋值符使用
++
减减同上
--
不细讲了,主要是*+和--两个说一下
算术运算符
这类会带有险式的强制类型转换,转为=号左边的
主要是说一下+=、-=这类的
赋伯运算符
没说法
比较运算符
两个的,如果左边第一个条件不满足,就会直接返回false;一个的两边都得判断完才能得出结果
面试问的比较多的是|和||的区别、&和&&的区别
逻辑运算符
运算符
没哈好说的,顾名思义
顺序
if-else
switch表达式在jdk7后支持String,本质是使用String的Hash值
这块涉及到面试问的比较多的一个题
break和default留意一下就可以了
switch-case
网上的课程说法是能用switch的可以尽量用,效率会高一点,但是我个人实际编码过程中是没怎么用过,直接if就完事了,review的时候要领导提意见了再说
上面两个效率比较
分支
for
while
至少执行一次
do...while
循环
流程控制
个人习惯例: \
声明+初始化
长度arr.length
索引 arr[i]
使用
在有IDE加持的情况下,这些基础操作都不是事儿,代码提示一把梭
遍历
有一说一我真没见过用多维数组的,甚至一维都少见,更甚数组都少见到用的,基本都是集合框架那块用的多,数组一是定长,而是提供的方法支持没有集合那么多,用起来确实没集合框架那么顺手
多维数组
数组填充我还真没用过
用的比较多的就数组拼接、sort排序、二分查找、数组复制、数组比较
对应工具类Arrays
下标越界
空指针
数组异常
数组
基础语法
面向对象是将构成问题的事物分解成一个个的对象,使用对象去描述事物在解决问题过程中的行为,而不是专注于使用对象去完成一个步骤
1.1面向对象
1.2面向过程
两者在解决问题时,专注的角度不同,面向对象正如这个名称而言,它更关注问题中设计到了那些对象,有什么属性,涉及到什么行为,去将这样的对象一个个实例化,再通过对象之间的行为去解决一个问题,而,面向过程也是,关注点在于第一步要做什么、第二部要做什么,这样一个循序渐进的过程。
1.3总结
面向对象和面向过程的区别
成员变量
局部变量
成员方法
默认提供无参构造,如果你自己写了构造函数,则不提供无参构造
构造器
匿名对象
new
clone
反序列化
对象的创建方式
对象
成员变量基于对象的创建过程,这个过程有一个设置零值的操作,所以可以只进行声明,不进行初始化
静态变量在类加载时处理,它也有一个零值的设置阶段,所以也可以只声明不初始
然后就是作用范围,类先加载,然后对象才能在创建,所以在静态方法里肯定是不能用成员方法和成员变量的
总之这些东西罗里吧嗪一堆很难说清楚的,但是你从JVM的角度去推,\"思路就很清晰
举个例子
封装简而言之就是将类的内部细节隐棘,只对外提供公共的访问方法。JavaBean就是一个很好的例子,将字段私有化,只对外提供Setter和Getter方法进行访问。
封装
PS:继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展
3、子类可以用自己的方式实现父类的方法(重写)
继承注意点:
继承
编译时多态
运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定,主要.指方法的重写
运行时多态的必要条件:继承、方法重写、父类引用指向子类对象《(向上转型》
PS:重写发生在父子类之间,并有一下规范:子类重写的方法的返回值类型婴小于或者等于父类,返回值也一样,而方法的权限修饰符要大于父类,这是为了符合设计模式关于类设计的五大原则之一里氏替换
运行时多态
多态的优点在于提高了程序的可拓展性
多态
面向对象的特点
让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类
单一职责
对扩展是开放的,而对修改是封闭的
开闭原则
当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系
里氏替换
高层模块不应该依赖于低层模块,二者都应该依赖于抽象
抽象不应该依赖于细节,细节应该依赖于抽象
倒置依赖
接口隔离
面向对象的SOLID原则
公共所有人都能访问-
public
仅限同一个包下的类能访间
默认
仅限同一个包下的类以及它的子类能访问
protect
只有当前类能访问
private
都可以修饰
方法、字段
修饰问题
访问权限问题
构造器问题
同一个类,方法名一样,参数列表不同
重载
重写
重载和重写
本质是一个指针,在局部变量表索引0的位置
this
关键字
super
this和super
抽象声明的属性都是静态常量;抽象类没限制
属性
构造函数
接口支持多继承,抽象类不支持
多继承
接口和抽象类
getClass
反射用的
equals
haschode
集合用的
wait
notify
notify all
并发用的
触发垃圾回收的方法,已经不用了
JVM用的
Object类的方法
成员内部类
静态内部类
匿名
非匿名
局部内部类
本质也是类,但是对象个数有限
枚举我工作中没有从零写过,都是在已有的枚举上加,像自定义状态码啥的就用-枚举,至于它有什么方法,有一说一我没怎注意,IDEA里·一下看哪个能用就用哪个。。。 。
枚举
重写检查
抑制警告
弃用标识
常用注解
被javadoc记录
@Document
注解作用范围
@Target
自定义的一律RUNTIME
生命周期
@Retention
允许子类继承父类注解
@lnherited
元注解
声明
读取(用反射)
自定义注解
注解
基本数据类型不符合面向对象特性
为什么要包装类
直接记,除了浮点都有缓存
留意缓存值,面试有问
拆箱和装箱看看就好了,反正也不是你手动拆或者装的
字符串、基本数据类型、和包装类间转换
进制转换
比较
包装类的APl,没特别留意过
包装类
面对对象
Java知识脉络
0 条评论
回复 删除
下一页