Java基础
目录
1.==和equals的区边?
- ==比较的对象的是地址值是否相等,基本数据类型==比较地址值,引用数据类型==比较内存地址
- equals 有俩种情况,第一种为类重写equals方法后,就会比较这俩个对象的内容是否相等,如果相等就会返回true,就会认为这俩个对象相等,第二种为不重写equals方法,相当于通过==来比较。
2.collection和collections的区边?
- collection是接口,是各种集合的父接口
- collections是java.util下面的工具类,提供了操作集合的各种方法
3.String为什么是final修饰的?
- 用final修饰才能实现常量池,节约内存
- String被final修饰后,是多线程安全的,同一字符串可以被多个线程共享,所以final可以避免一个对象改变String对其他对象产生影响
- 实现String可以创建hashcode的不可变
4.final是什么?
修饰的类不能被继承,修饰的方法不能被重写,修饰的变量不能被修改,所以就是个常量
5.面向对象是什么?特点是什么?
- 面向对象是把问题事务分解成各个对象,这些对象是用来描述某个事物在整个解决问题中的步骤的行为
- 特点:
- 封装:隐藏对象的数据和实现细节,仅对外提供公共的访问方式 好处:提高了安全性
- 继承:子类继承父类,并拥有父类的属性和行为,并能扩展新的能力
- 多态:子类继承父类,并重写父类的所有方法,
- 父类引用指向子类对象,编译看左边,运行看右边,向上造型(同一调用标准,提高通用性)
6.重写和重载的区边?
- 都是体现多态的实现方式,重载编译时多态,重写运行时多态
- 重写:子类继承父类后,需要重写父类的方法,改变父类原有功能的一种,子类需要有足够的权限
- 重载:在一个类里,方法名相同,参数列表不同的现象,体现程序的灵活性
7.static的作用?
- 1.被static修饰的静态变量由多个对象共享,当修改这个静态变量的值后,其他对象的静态变量值也会修改。
- 2.被static修饰的方法是静态方法,可以用类名,方法名直接调用
8.抽象类和接口的区边?
- 抽象方法没有方法体,
- 接口就是个特殊的抽象类,所以里面的方法都是抽象方法,在JDK1.8之后也接口中也可以有一般方法,需要用default和static修饰
- 抽象类需要用extends来继承,接口需要用implements来实现
- 抽象类能有main方法,可以运行他,而接口没有main方法
- 接口可以多实现,类只能单继承
9. 序列化和反序列化的区边?
序列化就是把对象存储到硬盘上,反序列化就是获取对象文件中的数据,转成后台对象类的数据
作用减少内存消耗或在远程rpc调用对象的时候需要
10.线程的创建方式有哪几种?
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
- 创建线程池创建
11. 线程的生命周期?
创建,就绪,运行,阻塞,终止
创建:四种创建线程的方式,start没启动
就绪:创建线程后,调用Thread类start方法来启动线程
运行:线程获取CPU时间,为运行窗台
阻塞:调用sleep方法让线程睡眠,调用wait方法让线程等待等,可以使线程阻塞
终止:线程run方法完成或者是主线程main方法完成时,就认为终止了
12.为什么要创建线程池?
- 降低资源消耗:重复利用已经创建的线程,降低线程创建和销毁造成的资源消耗
- 提高响应速度:当任务到达时,不需要等线程创建就可执行
- 提高线程的可管理性:使用线程池可以进行统一的调优和监控
13.死锁是什么?如何避免?
俩个或俩个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象
避免:将系统中的所有资源设置标志位,排序将所有进程的申请资源以一定的顺序进行排序
目录
单例设计模式:
一个类只有一个实例,分为懒汉式和饿汉式
代理模式:
工厂模式:
观察者模式:
JVM相关
1.jvm运行机制
类加载器将.class文件以二进制的形式读入到内存中,并将其放在运行时的方法内,然后在推中创建一个java.lang.Class对象,封装类在方法区内的数据结构。
2.jvm堆和栈
堆:
- 用来存放对象实例和数组
- 当堆中的实例对象不在被指向时,JVM启动垃圾回收机制,自动清除,
- 堆中的队友实例对象都有内存地址值
- 有默认初始化值
栈:
- 对象的引用变量和基本变量都在栈中存放
- 数据执行完毕,变量会立即释放
- 没有默认初始化值,需手动设置
方法区:
共享内存,存储被虚拟机加载的类,常量,静态变量,编译器编译后的代码
本地方法栈:
- 和栈的作用类似 ,区别就是
- 栈:虚拟机执行java(.class)服务
- 本地方法栈: 虚拟机使用到的native方法服务
程序计数器:
当前线程所执行的字节码的行号指示器
3.堆和栈的区别
堆得内存不连续,所以在运行的时候就确定了
栈的内存连续,在编译的时候就确定了
堆内存远远大于栈内存
堆存放的是实例对象和数组
栈存放的是 局部变量,返回结果 栈更关注的是程序方法的执行
堆对于整个程序都是共享的
栈只对线程是可见的,生命周期和线程相同
4.GC垃圾回收是什么?
当堆中的对象不在被指向引用时,就会通过垃圾回收来释放内存
5.垃圾回收算法?
标记---清除算法,标记---整理算法,复制,分代收集算法
6.分代收集算法怎么说?
年轻代和老年代
年轻代:分为三个区 Eden区,From区与To区
- 创建一个对象总在Eden区操作得时候,当这个区满了就会触发一个垃圾回收,会把有用的对象复制到From区
- 当Eden区创建对象又满了的时候,触发垃圾回收,将 Eden区,From区有用的对象复制到To区
- 在下一次垃圾回收的时候,将Eden区与To区有用的对象复制到from区,如果经过多次的垃圾回收后,会达到From区与To区的阈值,就会都复制到老年区
- 老年代在经过这么几次垃圾回收后,会进行全量回收,如果全量回收次数频繁的话,会对系统造成很大的影响