Java基础
数组
一组连续空间,存储多个相同类型的值
特点
- 数据类型相同
- 长度固定
数组的扩容
- 创建一个新数组,使用For循环将元素逐一赋值
- System.arraycopy(原数组名,原数组起始下标,新数组名,新数组起始下标,复制的长度)
- Java.util.Arrays.copyOf(原数组名,新数组名)
排序
- 冒泡(相邻两个元素两两比较,互换位置)
- 选择(固定值和其他值依次比较,互换位置)
- 快速
查找
- 二分法查找【递归】
静态&最终&抽象
静态static
简述
- 可以修饰属性和方法
- 修饰属性——>静态属性(类属性)
- 修饰方法——>静态方法(类方法)
- 静态成员全类所有对象共享
- 全类就一份,不会因为创建多个对象而产生多份
- 不必创建对象,直接通过类名进行访问
特点
- 静态方法可以直接访问静态成员
- 静态方法不能直接访问非静态成员
- 可以继承,没有覆盖和多态
抽象Abstract
简述
- 修饰类——>称为抽象类,无法New对象
- 作用
- 为子类提供共性的属性和方法
- 可以声明引用,强制使用多态(分类引用指向子类对象)
- 作用
- 修饰方法——>称为抽象方法,无法直接使用
- 作用
- 强制子类覆盖父类中所有的抽象方法,如果不覆盖,该类必须声明为抽象类
- 作用
最终Final
简述
- 修饰类——>没有子类
- 修饰方法——>可以继承,不能覆盖
- 修饰变量——>只能赋值一次,不能改变,修饰变量我们称之为常量
- 实例变量:没有默认值,必须手动赋值,赋值的时机:
- 显示初始化
- 动态代码块
- 每一个构造方法
- 静态变量:没有默认值,必须手动赋值,赋值的时机:
- 显示初始化
- 静态代码块
- 局部变量
- 基本数据类型:数值不可变
- 引用数据类型:地址不可变
- 实例变量:没有默认值,必须手动赋值,赋值的时机:
类加载过程
https://blog.csdn.net/romantic_jie/article/details/91355437
JVM原理&调优【重点】
略(后面详细介绍)
Object类
所有的父类,如果没有显示继承,那么隐式存在
作用
- 作为形参——>可以接受所有对象
- 作为返回值类型——>可以返回所有对象
- Java中每一个对象多可调用Object类中的方法
Object类常用的方法有哪些?(低于5个)
- hashCode toString getClass equals wait notify notiyAll clone fianlize等
集合
简述
Java集合类存放在java.util包中,是一个用来存放对象的容器。
注意:
- 1.集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。
- 2.集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
- 3.集合可以存放不同类型,不限数量的数据类型。
集合和数组的区别
- 长度
- 数组不可变
- 集合可变
- 元素的数据类型
- 数组可以存储基本类型数据和引用数据类型
- 集合只能存储引用数据类型
集合类原理,尤其HashMap、HashTable、ConcurrentHashMap等
-
HashTable: KV都不允许为null,线程安全,效率低
-
HashMap(和HashTable相反):哈希表(
Node[]
)、链表(Node next
解决哈希冲突)、红黑树(TreeNode
解决链表过长,效率过低问题) -
ConcurrentHashMap:1.7版本之前 哈希表 + 链表 + 分段锁 1.8以后 哈希表 + 链表 + 红黑树
CAS(Compare And Set): 类似于乐观锁
面试题?
List下有三个实现类的特点
ArrayList:底层数组实现,查询快,增删慢。线程不安全,效率高。
Vector:底层数组实现,查询快,增删慢。线程安全,效率低。
LinkedList:底层链表实现,查询慢,增删快。
set集合
list和set区别?
* List:有序,可重复
* Set:无序,不可重复
HashSet
* 如何保证元素唯一:HashSet存储元素底层依靠两个方法hashcode() equals()
* 执行步骤:
* hashcode先执行,会判断存储的元素哈希值是否一样
* 相同:执行equals判断内容
* 相同:不存
* 不同:存
* 不同:存储
注:如果存储自定义对象,请在类中覆盖hashcode和equals。
Map和Colleciton区别
Collection:List可重复,Set集合不可重复。光棍
Map:键不可重复,值可重复。
IO
分类
- 方法:输入流和输出流
- 功能:节点流和过滤流
- 单位:字节流和字符流
使用
略
对象序列化和反序列化
网络中传输的数据均为字节,保证数据能够进行网络传输
- 实现序列化接口
- 不需要参与对象的序列化
transient
BIO、NIO、AIO?
-
BIO:同步阻塞IO
-
NIO:同步非阻塞IO Netty
-
AIO:异步非阻塞IO
网络编程
阻塞和非阻塞体现在线程利用率
阻塞:先有线程再有完整的IO操作,线程服务于一次完整的IO
非阻塞:关注的事件,事件发生后进行事件操作,线程利用率更高
同步和异步
request.getInputStream
线程
进程:正在运行的程序。
cpu:单cpu一个时间点只能执行一个进程。
- 为什么我们感觉多个进程是同时执行的?
- 是因为cpu在做着程序之间的高效切换,让我们感觉是同时在执行。
线程:在一个进程中,包含多个任务,而每一个任务就是一个线程。
多线程:每一个进程想要执行必须抢到cpu才能执行,如果一个进程中线程的数量比较多,那么该进程抢到的概率就更大,但是不保证一定抢到,因为线程的执行是随机性的。
并发:在一段时间内多个线程切换执行。
并行:在一个时间点多个线程同时执行。
创建
- extend Thread
- implements Runnable
- 线程池
运行状态
- 初始化状态
- 就绪状态 thread.start()
- 运行状态
- 阻塞状态 sleep(不会释放锁) | wait(释放锁标记)
- 死亡状态
线程安全
多线程并发环境中操作临界资源,保证线程的安全,对临界资源加锁
同步锁
- 同步方法
- 同步代码块
线程池
将需要执行的任务交给线程池,线程池会分配线程去执行该任务,任务执行结束线程不会死亡,而是回到线程池中处于空闲状态,等待下一个任务。
- FixedThreadPool
- CachedThreadPool
反射
类对象
通过.class文件获取的对象,使用该对象中的构造方法,实例变量,实例方法。
- getClass
- Class.forName(推荐(将来可以将字符串写入到配置文件中))
- 对象.class
使用
- 反射调用方法、属性
设计模式
-
单例(静态内部类)
保证内存中只有一个对象
- 私有属性方法
- 本类提供一个对象
- 将该类对象提供给外界使用
-
工厂(好处 : 解耦合)
主要解决的是对象创建的问题,工厂的职责在于创建一个对象
-
代理(静态代理、动态代理)
客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。
-
适配器
将一个类的接口转成客户期望的另外一个接口,使得原本由于接口不匹配而不能一起工作的那些类可以一起工作。
-
责任链
当系统需要嵌入多个独立功能模块时,可以使用责任链设计模式
责任
:主要负责实际功能实现。链
:用于协调责任调度,记录调度状态。
网络
TCP/IP协议的三次握手和四次挥手
https://blog.csdn.net/qq_38950316/article/details/81087809
网络七层模型
- 应用层 Http
- 会话层
- 表示层
- 传输层 TCP/UDP 报文
- 网络层
- 数据链路层
- 物理层
JavaWEB框架复习
Java 语法基础:HashMap结构,锁-分类,JVM GC策略,自定线程池参数含义,JVM内存分析指令-jmap,jstack,jstats, Java类加载策略,网络编程 阻塞IO和NIO – 高级Java开发工程师
Spring
概念:一款轻量级的javaEE解决方案,众多优秀设计模式的组合
IOC(控制反转)
控制:给属性赋值的权利
反转:把给属性赋值的权利由代码反转到了配置文件中
控制反转,有容器工厂负责对象的创建销毁(生命周期)
<bean id="xxx">
或者@Bean
DI(依赖注入)
当一个类型需要另一个类型时,可以把另一个类型作为该类型的属性,通过对应的注入方式进行赋值
set注入
、构造注入
和自动注入(ByType @Autowired | ByName @Resource)
AOP(面向切面编程)
将代码中其它功能(事务、日志、性能等)剥离出来形成独立的功能方法或者功能类,如果使用到这些功能时,通过动态代理方式生成代理类,增强普通类功能
动态代理(字节码处理技术): 原始方法 + 额外功能 = 代理类
- JDK(默认):必须提供接口
- CGLIB(基于父子类继承关系)