java语言三大特性:继承,封装,多态
jdk和jre的区别:jdk是java开发工具包,提供了开发环境和运行环境。jre提供了java的运行环境,jdk中包含jre
java基本数据类型:byte 1个字节 short char 2个字节 int float 4个字节 long double 8个字节 boolean
3个引用类型:数组,类,接口
在idea中方法如果不用public修饰 会自动去除可运行按钮
.equals比较真实值 ==比较的是地址值
while和do while 的区别:while循环在开始会判断下一个迭代是否继续, do while 在结尾判断下一个迭代是否继续 至少执行一次循环体
public > protected > default > private 不写默认default
char 变量可以储存一个中文汉字 因为 Unicode码占16位 2个char 字节刚好16位
& 都要 &&一个满足即可
-128~127数字做了缓存
final是一个修饰符也是一个关键字 被final修饰的方法不能被重写,但允许重载,类不能被继承,变量不能修改
finally是一个关键字 finally在异常处理时提供fianlly块来执行清理操作,不管有没有异常抛出都会执行,通常用于释放资源 在极端情况下 如果对应的try没有执行 或者在try块中的jvm关机 不会执行
finalize 是gc回收对象之前都会调用改方法
hashcode 和 equals 区别: hashcode更偏向于性能,equlas更偏向于准确性
java中操作字符串的类有string stringBuffer stringBuilder 后2个都是在原有对象基础上进行操作的 stringBuffer是线程安全的 多用于多线程操作 stringBuilder是非线程安全的 性能优于stringBuffer
抽象类不能用final修饰 抽象类是用来被继承的 final修饰了咋继承呢?
抽象类不能使用静态修饰 因为抽象类是要被用来重写的 用static 修饰了还咋重写呢?????
静态方法内部不能发出对非静态方法的调用 因为非静态方法对象的调用要先创建对象
static 不允许用来修饰局部变量
方法的重载和重写都是用来实现多态的方式,区别是前者是实现了编译前的多态性,后者是实现编译时的多态性。
java序列化是指将对象转换为字节序列的过程,反序列化是指将字节序列转换为目标对象的过程
java对象在网络上进行传输或者持久化储存在文件中的时候需要进行序列化
序列化的实现是需要继承Serializable接口
如果某些对象不像被序列化 在字段前面加transient
hashmap和hashtable的区别:hashmap允许key value 为Null hashtable不允许 hashtable是同步的 hashmap不是 hashtable用于多线程
用hashmap还是treemap:对定位一个元素进行插入和删除用hashmap更好,如果要对一个key集合进行遍历操作 用hashtree更好
hashmap的实现原理:hashmap是基于hash算法实现的,通过put(key,value)和get(key)来储存和获取。当传入key时hashmap会根据key.hashcode()计算出hash值,hash值将value保存在bucket里
当计算出的hash值相同时,我们称之为hash冲突,hashmap的做法是用链表和红黑树储存相同的hash值,当hash冲突较少的时候用链表否则用红黑树。
ArrayList和linkedlist的区别:arraylist是动态数组的数据结构实现,而linkedlist是双向链表的数据,arraylist在随机访问的时候效率要更高,而linkedlist是线性的数据存储方式,所有需要移动指针从前往后找
增加和删除操作,在非首尾的情况下 linkedlist比arraylist效率高。频繁的读取元素 arraylist更好
Array和ArrayList的区别:Array只能储存基本数据类型和对象,ArrayList只能存储对象。
Array是指定固定大小的,而ArrayList的大小的自动扩展的。
Array的内置方法没有ArrayList多,比如addAll,removeAll,iteration等方法只有ArrayList
在Queue中poll()和remove()有什么区别?都是返回第一个元素,并在队列中删除返回的对象。 不同点:如果没有元素poll会返回null,而remove会直接抛出异常
hashmap的底层实现原理:从结构实现来看,hashmap是一个数组+链表+红黑树实现的,当链表》8的时候,转换为红黑树
error表示系统级的错误,exception表示程序需要捕捉,需要处理的异常
常见的异常:NullpointerException空指针异常 NumberFormatException 字符串转换为数字异常 ClassCastException数据类型转换异常
throw在方法内用来猜测会有什么异常,然后抛出,throws表示一种可能性。
java异常分为编译时异常和运行时异常
java反射,在JDBC中用java反射动态加载了数据库驱动程序
web服务器中运用反射调用了sevlet的服务方法
spring框架的注入用到了反射
反射机制的优缺点:优点:提高代码灵活度。缺点:性能比直接的java代码要慢
java流派:按单位分:字节流,字符流。按流方向:输出流,输入流
缓存大多数用字节流比较好,因为字节流是字符流的包装,而大多数时候IO操作都是直接操作磁盘文件,所以这些流在传输时都是以字节的方式进行的。
如果需要操作通过IO在内存中频繁处理字符串的情况使用字符流会好些,因为字符流具备缓冲区,提高性能
读取数据量很大的文件时,速度会很慢 字节流选择BufferInputstream和 bufferoutputstream 字节流选择bufferreader 和bufferwriter
io模型有阻塞io,非阻塞IO 多路服用IO 信号驱动IO 以及异步IO
什么是进程,进程就是系统中正在运行的一个程序,程序一旦运行就是进程。进程可以看成是程序执行的一个实例,进程是系统资源分配的一个独立实体,每个进程都有独立的地址空间
一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
什么是线程,是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程的实际运作单位,一条线程指的是进程中一个单一顺序的控制流,一个进程可以并发多个线程,每条线程并行执行不同的任务
线程的实现方式:1继承thread类 ,2.实现runnable接口 3.使用callable和future
thread中的start 和run
start 启动线程 run 线程方法的调用
new 新建线程
线程状态:新建 就绪 阻塞 运行 死亡
sleep停止 stop 作废
interrupted 和 isInterrupted
前者判断当前线程是否已经中断,会清除状态
后者判断线程是否已经终端,不会清楚状态
yield 放弃当前cpu资源 让其他任务占用cpu执行时间
线程的优先级 优先级高的线程得到的cpu也比较多。 java线程优先级分为1~10个等级,数字越大优先级越高,默认优先级大小为5,超出范围输出java.lang.IllegalArgumentException
优先级继承特性:线程的优先级具有线程性,比如A线程启动B线程,A,B线程的优先级是一样的
java中
threadlow.setPriority用来设置线程优先级的
线程的种类:用户线程 ,守护线程
守护线程的特点:守护线程是一个比较特殊的线程,主要被用于后台调度以及支持性工作。当java虚拟机中不存在非守护线程的时候,守护线程才会随着jvm一起结束工作
java中经典的守护线程:GC(垃圾回收器)
如何设置守护线程:Thread.setDaemon(true)
Daemon属性需要在线程启动之前设置,不能启动了再设置
java虚拟机退出的时候 Daemon中的finally块并不一定会执行
join是指将某个线程加入到当前线程,让当前线程处于blocking状态
synchronized包括哪两个jvm重要的指令:monitor enter 和 monitor exit
synchronized关键字可以用来对代码块或者方法的修饰
synchronized锁的是什么?
普通同步方法-》锁的是当前实例对象
静态同步方法 锁的是当前类的class对象
volatile是轻量级的synchronized锁,它在多处理器开发中保证了共享变量的“可见性”