1 java内存泄漏的几种情景
内存泄漏
内存泄露是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。
1、静态集合类引起内存泄露:
2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
3、监听器
4 各种连接
比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的
5、内部类和外部模块等的引用
6、单例模式
2 乐观锁vs悲观锁
乐观锁vs悲观锁
1悲观锁指的是外界对数据修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。
2 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则回返回用户错误的信息,让用户决定如何去做。
3 Obect类中的常用方法
protected Object clone()//创建并返回此对象的一个副本。
boolean equals(Object obj)//指示其他某个对象是否与此对象“相等”。
String toString()//返回该对象的字符串表示。
void wait()//在其他线程调用此对象的 notify() 方法或 notifyAll() //方法前,导致当前线程等待。
void notify()//唤醒在此对象监视器上等待的单个线程。
void notifyAll()//唤醒在此对象监视器上等待的所有线程。
int hashCode()//返回该对象的哈希码值。
Class<> getClass()//返回此 Object 的运行时类。
protected void finalize()//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
1 基本数据类型 , 所占字节
整型: byte 1个字节8位bit short 2字节 int 4字节 (-21 47483648--2147483647) long 8字节
浮点型:float 4字节 32bit 1bit表示符号 9bit表示整数部分 特定算法非2pow9 ,其余小数部分
double 8字节 19bit表示整数部分
字符型:char 16bit 2 字节 0-65535
布尔型:boolean 1bit 1/8 字节
引用数据类型:
数组[] 类class(抽象类abstract class) 接口interface 枚举 enum 注解@interface
2 常量和变量
常量: 在程序运行过程中不能再次发生改变,存储在常量池,只有一份
1 基本类型的值都可以认为是常量 4 3.4 ‘a' true;
2 String类的值可以视为常量。
变量:变量是一个内存空间(小容器)
在栈内存中开辟的一块内存空间。
空间在开辟(变量声明)必须指定类型 名字(规则规约)
空间的内容可以改变 float x = 3.4F;
long y = 2147489999L ;//如果超过int的取值范围2147483647
3 数据类型的转化
1 同种数据类型之间是可以直接进行赋值操作
int a =1 ;int b = a; || float x=3.4;float y=x;
2 数据类型不同的空间之间的赋值 ----》转换问题
同种大数据类型之间才能发生转换
基本类型---基本类型 之间 可以直接转换(自动,强制)
引用类型--- 引用类型之间 可以直接转换(自动 强制--上转型 下转型)
基本类型-- 引用类型 不可以直接转换(间接--包装类/封装类)
大数值转小数值 强制转换 是可以的 但值会发生改变
每一个字符都对应一个Unicode码 a--97
char x ='a' ;int y = x ; //自动转化 y--97
布尔类型不能与其他类型转换。
4 一个字符型数字 转为 数字 Integer.parseInt()/和 Integer.valueOf的区别;
如果是char类型的单个字母, 可以直接把char类型变量减去char型的0然后赋值给int类型
Integer.parseInt()/和 Integer.valueOf 后面只能是字符串
5 如何保留小数点后两位
返回double型的
1.能四舍五入
1 double d = 114.145;
2 d = (double) Math.round(d * 100) / 100;
3 System.out.println(d)
返回String型的
1 double d = 114.145;
2 String.format("%.2f", d);
6 oop 的特性 , 封装,继承,多态,抽象 各自说一下 及为什么要这样做,比如封装的封闭性;
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节
2 继承
3 对多态的详细理解
子类向上转型为父类,会丢失特有的属性和方法,但通过重写父类方法可实现多态,实际调用方法由子类决定。
面向对象4大基本特征:抽象、封装、继承、多态。
抽象。将一些事物的共性抽离出来归为一个类。如对于动物,具有生命体征、活动能力等区别于其它事物的共同特征
封装。有选择地隐藏和暴露数据和方法。比如有U盘这个类,我希望隐藏内部组成和实现,只暴露USB接口以供使用
继承。子类可以直接使用父类的部分数据和方法,可以有选择的扩展。比如鸟是动物,但鸟扩展了飞行的能力。
多态。同一类的对象调用相同方法可以表现出不同的行为。比如动物实现了say()方法,猴子、马等动物重写了say()方法来表现不同的交流语言。
7 abstract 和 interface 的详细区别
- 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法
- 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
- 一个类可以实现多个接口,但最多只能实现一个抽象类
- 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
- 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
8 String 和 Stringbuffer,Stringbuilder的区别。
9 String工具类, 反转,替换等常用方法
10 重载和重写
11 集合
12 final , finally, finalize
13 MVC详解
14 get 和 post 的区别,get 数据集 ascii
15 线程和进程的详细区别
1.进程是系统进行资源分配的基本单位,有独立的内存地址空间; 线程是CPU调度的基本单位,没有单独地址空间,有独立的栈,局部变量,寄存器, 程序计数器等。
2.创建进程的开销大,包括创建虚拟地址空间等需要大量系统资源; 创建线程开销小,基本上只有一个内核对象和一个堆栈。
3.一个进程无法直接访问另一个进程的资源;同一进程内的多个线程共享进程的资源。
4.进程切换开销大,线程切换开销小;进程间通信开销大,线程间通信开销小。
5.线程属于进程,不能独立执行。每个进程至少要有一个线程,成为主线程。
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。
16 进程之间有哪些通信方式
17 什么是死锁,解决方法
打个比方,假设有P1和P2两个进程,都需要A和B两个资源,现在P1持有A等待B资源,而P2持有B等待A资源,两个都等待另一个资源而不肯释放资源,就这样无限等待中,这就形成死锁,这也是死锁的一种情况。给死锁下个定义,如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
解决方法:1、资源剥夺法;2、撤消进程法