总结回顾Java基础知识:
Javase基础知识:
一.抽象类和接口的区别
相同点:
1.抽象类和接口都不能直接被实例化,需要子类继承(实现)方式重写方法实例化
2.都可以拥有抽象方法
不同点:
1.关键字
2.属性:抽象类可以有静态变量,常量和成员变量以及各种权限符,接口只能有常量默认只能public static final修饰
3.抽向类可以有普通方法,接口只能是抽象方法(默认被public abstract修饰)
4.抽象类可以有构造方法,接口不能有
5.一个类可以继承一个父类,一个接口可以继承多个父接口
二.Java基本数据类型和引用数据类型
三.java优点缺点,为啥选java
1.简单性
没有指针,代码清晰明了,语言规范完整
2.面向对象
一切接对象,不同于面向过程,将问题拆解成对象,通过对象交互关联完成任务,简单优雅,缩短项目开发时间,在此之上,有继承,多态,封装等特性。
3.跨平台
jvm特性一次编译到处运行,.java--->编译器编译---》.class文件--->虚拟机解释到各个平台
4.安全性
异常处理,未经授权读写文件,sql注入问题,访问进程越界MMU(虚拟地址到物理地址的映射)
5.支持多线程
内置线程操作函数
6.健壮性:(意料之外)
强类型机制,异常处理,安全检查机制,
四.fianl关键字
final可以修饰类,变量,方法。
类:
最终类该类不能被继承
方法:
最终方法,该方法不能被重写
变量:
最终变量:基本类型值不可变,引用类型地址不可变,值可变
可以修饰成员变量也可以修饰局部变量,形参。final修饰成员变量一定要显示制定初始值(或者通过构造方法)
五.static关键字(描述修饰什么,重要规则)
static除了不能访问构造器,像内部类,代码快,方法,内部类,成员变量都可以修饰。static修饰的成员成为类成员,类成员属于整个类,不属于单个对象。规则:类成员不能访问实力成员,作用域,类成员作用于大于实例,随着整个类加载,很容易导致类成员加载完成,实例还未初始化引发大量错误。所以及时没有创建对象也可以访问staic修饰的变量(类加载完成)静态方法不能访问this,this是随对象创建而创建。总结:静态可以访问静态,静态不能访问非静态需要先创建对象,非可访问静态。static修饰类叫静态内部类,只能存在于内部类,通过外部类名.调用,只能访问外部静态成员。修饰方法叫静态方法。
六.String类,new和字符串直接赋值:
String被final修饰不能被继承,创建字符串有两种方式,String str="1abc"是将字符串直接量,还可以使用new关键字,区别是当字符串直接量创建字符串会在jvm中用常量池管理,new时候先将字符放在常量池中,然后调用String构造器创建新对象,将对象保存在堆中
七.String,StringBuffer,StringBuilder区别
1.String,StringBuffer是线程安全的,StringBuilder是线程不安全的,单线程推荐用性能高。
2.String是一个不可变类,StringBuffe对象代表一个字符序列可白的字符串,append(),insert(),reverse(),setCharAt()...来改变序列,也可以通过toString转化成String,
3.StringBuilder和Buffer都继承自AbstractSb
八.==和equals区别:
1.都是java判断俩个变量是否相同
2.== 基本数据类型,数值是否相同
引用数据类型表示同一个引用(内存地址)
3.equls是Object是方法,用来判断是不是同一个对象,但是通常业务场景需要重写equlas方法来比较引用的内容是否相同
九.为啥重写equals()就是重写hashcode();
1.hashcode用途(获取哈希嘛),equals用途(判断俩个对象是否相同)
2.约定:码相同不一定就是一个对象,同一个对象hashcode一定相同
2.实际业务需求,比较不同对象的内容是否相同,重写equals要满足约定就要重写Hashcode
十.java异常机制
异常处理,try catch finally 谈谈finally
抛出异常 throw throws 谈谈区别
异常跟踪栈
多线程篇:
1.请你理解多线程:
得分点:进程和线程之间的关系,为啥使用多线程
1.线程是系统调度的基本单位,进程是资源分配的基本单位
2.进程包含线程,一个进程可以由多个线程构成,每个线程独立的计数器,堆栈,局部变量
3.线程可以说是轻量的进程(创建更快,销毁更快,调度更快)
4.同一个进程多个线程之间使用同一份内存/文件资源(PCB),进程和进程之间是独立的PCB
得分点2: 使用多线程的优点:
更多的CPU核心,加快了计算机处理器的效率,并行
加快响应时间
2.线程创建的方式
可以答答runnable和Callable接口使用的区别(返回值)Funturetask
3.线程的状态:
加分回答:就绪和运行状态可以合并为可运行状态(Rnnable)
4.wait()和sleep()区别
类型不同:wait是Object类里面实例方法,sleep是Thread里面的静态方法,调用进入waiting
对锁的依赖:
唤醒条件
5.怎么保证线程安全
原子类 JUC里面的automic提供了很多基于cas实现的原子类,例如里面automicinterger类里面就有getAndIncrement(count++),incremnmnetandget(count--)
volatile 保证内存可见性问题(编译器优化导致)多次读取一次修改,由于频繁的读取,就从内存中只读取一次,这其中另一个线程可能就修改了值
锁
加分:JUC下面的Countdounlatch:允许一个线程等待其他线程完成操作,用一个计数器设置选手数量,调用countdownlatch()撞线一次--,完成任务调用await()等待其他
信号量:访问特定资源的线程数量(p acquare,v release操作)
6.谈谈线程同步方式
sychronize:作用域普通方法,静态方法,代码快,注意所力度,基于jvm实现,解释锁特性策略
lock,trylock unlock 及时释放锁资源,true,false参数公平或者非公平,采用Cas+valatile,基于AQS实现。读写锁
7.谈谈线程通信方式:
线程通信指的是多个线程通过共享内存实现消息传递,协调同步,方法执行
等待通知机制wait notify
信号量
CyclicBarrier栅栏机制
锁机制Loak和Conation实现同步和互斥,await(),和siagnalAll()类似于wait,notify,但是可以指定某个线程的唤醒