JavaSE 不管面试遇到否,这些都是基础很重要
JVM是什么?
JVM是虚拟机,硬件机器在内存上的一个映射
JVM就像笔套一样,套接在不同系统windows,linux,ios上。在JVM虚拟机上运行的程序生成字节码后直译成机器码
java在JVM虚拟机上的执行速度很大程度甚至快过c和汇编
JVM内存结构有
JVM的3类装载器
启动类加载器 BootStrap C++
拓展加载器 extention java
应用程序加载器 加载当前应用,类路径下的所有类
堆:新生区(伊甸园,幸存0,幸存1),养老区,元空间
堆内存放实例和数组
元空间(方法区,永久区)属于堆的内容,是逻辑上存在的空间
存放类模板数据,被加载的类信息/常量/静态变量/即时编译的信息
栈:方法使用完弹栈,先进后出
8种基本类型变量(byte,char,short>int>long>float>double double),参数变量,实例方法,引用类型变量
一‘什么是面向对象(OOP)?
封装:封装实体类,封装方法(不暴露具体功能实现的步骤),类似古代封建制度
继承:继承父类特性,扩展自己特性
多态:对象的可替换性,父类引用指向子类对象
1.拿到物品就知道形状
2.看到宠物就知道喂什么食物
多态核心:重载和重写
抽象:1.过程抽象:将系统按功能划分成子系统的自顶向下,将单一架构的系统重构成若干子系统的过程
2.数据抽象:对操作数据类型对象过程的描述
二’interface是什么,接口的作用是什么?
interface是一个特殊的类,内含常量和抽象方法
1.方便团队协作开发,接口字面意思即插即用 2.接口多态 3.扩展性强(传参的参数使用接口)
三‘什么时候使用断言assert?
断言作用快速调试及测试程序,传入参数参数程序的健壮性,assert会返回true或false
idea断点中可以输入指定参数查看状态
四’StringBuilder,StringBuffer,String区别
StringBuilder线程不安全的,执行效率最高,可变字符串可使用append方法拼接
StringBuffer线程安全的,可变字符串
String为final修饰,不可变字符串的常量,拼接用+
五‘数组只有size()方法,有length属性,javaScript中字获取符串长度使用length属性
String有length()方法
六’编码问题 1char=2byte,1符号1数字=1byte,1中文=1char,1byte=8bit
ASC 1byte | Unicode 2byte|UTF-8 3byte
七‘什么是序列化,Java如何序列化,序列化作用是什么
序列化是一种处理对象流的机制
实现Serializable接口,(序列化)通过输出流writeObject(Ob ob)保存状态,(反序列化)通过输入流readObject()读取对象
序列化实现对象的深复制,防止数据重复存储,也是服务之间通信的需要
八’list有序可重复,数据结构数数组,插入删除数据移动速度慢
Set无序不可重复,Map键值对(Set,值不唯一)
TreeSet,TreeMap可重复用二叉排序树
九‘vector线程安全的,查询效率与ArrayList一致
十‘ArrayList数据结构是数组,LinkedList数据结构是双向链表
对于增加和删除LinkedList由于数据结构的原因占明显优势
十一’HashMap与TreeMap
两者顺序不一样,导致hashCode不一样
HashMap通过hashCode对其内容进行快速查找,增删HashMap是最好选择
如果需要按自然顺序或自定义顺序遍历key,TreeMap更好
TreeMap保持着某种固定的顺序,有序结果集使用TreeMap
十二‘HashTable是线程安全的,key和value都不能为null
HashMap允许一个key为null,多个value为null
十三’如何解决HashMap的线程不安全问题?
1.替换成HashTable,导致表锁,效率底
2.使用Collections类的synchronizedMap()包装
3.使用ConcurrentHashMap的分段锁,只锁住修改的部分
十四‘Collections和Collection的区别
Collection是java.util下的接口,子接口Set,List
Collections是java.util下的类,针对集合提供一系列的静态方法实现和对各种集合的搜索排序及线程安全操作
十五’List,Map,Set三个接口,存取元素时,各有什么特点?
List可重复,Set不可重复,Map的value可重复
十六‘Set中用还是Equals来区别元素是否重复呢?
使用equals()判断内容是否相同
而判断地址是否相等,用来决定引用值是否指向同一对象
十七’TreeSet和TreeMap排序时如何比较大小?Collections的sort如何排序比较元素的?
1.TreeSet实现Compareble接口的compareTo方法传入参数回调
2.TreeMap同TreeSet,TreeMap的key必须实现Compareble接口回调方法compareTo排序value
3.Collections.sort()的2种重载方式
.传参对象必须实现Compareble接口回调方法compareTo排序
.接口注入,即自定义排序,要求第二个参数是Compareble的子类型重写compare方法自定义排序规则
十八‘Map集合实现类有哪些?简介
HashMap(线程不安全),HashTableMap(安全),LinkedHashMap,TreeMap,CurrentHashMap
CurrentHashMap解决HashMap不安全的最好方案,它使用分段锁,只对修改的内容加锁
TreeMap可以指定排序方式进行比较
同LinkedList由于是链表结构,保存了插入时的顺序,查询效率慢
十九’Arraylist的扩容,传入的参数大于默认值时位运算右移一位>>扩容1.5倍
二十‘HashMap扩容机制,默认因子0.75,默认为数组长度*0.75,超过后扩大一倍
二十一’例举6个常见异常?
IllegalStateException:非法状态
OverFlowStack:递归栈溢出
OutOfMemory:强引用状态致GC无法回收造成内存泄漏导致的内存溢出OOM
ConcurrentModification:并发修改异常
ClassCastException:数据类型转换异常
SQLException:操作数据库异常
ArithmeticException:算术异常等
二十二‘流是啥?
1.字节流:InputStream,OutputStream
字符流:Reader,Writer
2.按功能有节点流OutputStream,处理流OutputStreamWriter
3.BufferReader属于那种流?主要作用?
BufferReader属于处理流中的缓冲流,用来读取内容到内存里面,有readLine()
4.节点流是啥?处理流是啥?作用是啥?
节点流直接与数据相连,用于输入和输出
处理流的构造器必须传入节点流的子类,用来加工节点流进行功能上扩展加快读取和写入速度等等
5.如果我要堆字节流进行大量的硬盘读取,要用哪个流,为什么?
使用缓冲输入流BufferedInputStream能够减少堆硬盘的损伤
6.如果我要打印出不同类型的数据到数据源,哪个流最合适?
使用PrintWriter可以打印各种数据类型
7.用什么把对象动态写入到磁盘,写入要实现什么接口?
ObjectInputStream,实现Serializable接口
8.io流怎么读取文件的?
File获取路径字符流,Reader加入文件,字符串缓冲流处理Reader,定义字符串遍历内容
File file = new File(“d:/spring.txt”);
Reader reader = new FileReader(file);
BufferedReader buffered = new BufferedReader(reader);
String data = null;
while((data = buffered.readLine())!=null)
二十三’sleep()与wait()有什么区别?
Thread.sleep(),不会释放对象锁
wait是Object类的方法,会释放对象锁,使用notifyAll()后线程进对象锁定池获取对象进入运行状态
二十四‘sleep()与yield()有什么区别?
1.sleep不考虑线程优先级,yield考虑线程优先级
2.sleep方法后转入阻塞状态,yield方法后转入就绪状态
3.sleep具有更好的移植性,yield(与操作系统相关)
二十五’启动一个线程用run()还是start()
启动一个线程调用start()方法,run()方法可以产生必须退出的标志来停止一个线程
二十六‘说出线程同步相关的方法
wait:使一个线程处于等待(阻塞)状态,并且释放所有对象的锁
sleep:使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法会抛出IInterruptedExeption异常
notify:由JVM确定唤醒哪个线程,与优先级无关
notifyAll:唤醒所有等待的线程让他们
高级玩法:lock,unlock调试还提供newCondition()方法产生用于线程之间通信的(条件)Condition对象
二十七’编写多线程程序几种实现方式?
1.extends Thread
2.implement Runnable 推荐使用灵活度高,扩展性强
3.实现callable接口,call()在线程执行结束会产生一个返回值适配futureTask(操控线程)
4.线程池
二十八‘synchronized关键字的用法
修饰普通方法,修饰静态方法,修饰代码块
二十九’举例说明同步异步
抢同一个资源同步,多核cpu轮番访问资源
抢不同资源异步,ajax默认异步
三十‘java线程池概述?
复用线程提高应用程序的性能
1.构建一个ThreadPooLExecutor并指定默认要创建的线程数量
2.通过threadPool.excute()添加实现了Runnable接口的要执行的线程的java类
3.在实现Runable接口的java类run方法体中写入具体的业务代码
应用场景:大量的图片处理生成缩略图加水印,构建一个线程数为5的线程池,
然后分段批量提取500条为一组数据,交给线程池中线程处理,充分利用CPU
三十一’线程间通信过程?
线程之间的可见性,A线程将更新过的变量刷新到主内存,B线程读取
三十二‘线程生命周期是什么?
新建,就绪,阻塞,运行,死亡
sleep,wait阻塞
notify就绪
三十三‘什么是反射?那里用到反射?优缺点?
1.反射就是动态加载对象,并对对象进行剖析。从我的感觉出发,AOP面向切面编程的动态代理Proxy和Cglib也可以广义成反射
2.JDBC中注册驱动Class.forName(""),mybatis,spring框架中都用到反射
3.优点:可以动态的创建对象和编译,最大限度地发挥了Java的灵活性
缺点:对性能有影响。
使用反射是一种解释操作,告诉JVM我们要做什么并满足我们地要求,这类操作总是慢于直接执行java代码
三十四’简介设计模式6种
1.单例模式
私有化静态的全局变量
私有化构造函数
公有的静态方法
2.代理模式
Proxy动态代理和Cglib代理
Proxy:newProxyInstance()优点:降低耦合,不改类不继承,增强方法
缺点:必须依赖一个接口
Cglib:生成子类实例来代理,但是继承父类过多属性会消耗内存
灵活性高于Proxy,各有优缺点
3.工厂模式
首先需要定义一个Base基类(抽象成颜色,尺寸)
基类的子类(抽象成衣服,鞋子,帽子)通过不同的方法实现了基类中的方法
然后定义一个工厂类,工厂类根据条件(抽象成搭配要求)生成不同的子类实例
开发人员可以调用基类中的方法(抽象成配套)而不必考虑到底返回的是哪一个子类的实例
4.适配器模式
建立一个可以重复使用的类,在安卓中适配类用的比较多
例安卓中对 条目样式模式自适应各种类型手机
使用场景:java中JDBC要对不同数据库mysql,oracle的数据库连接池进行适配。linux系统上运行windows程序。电源适配器
5.命令模式
皇帝-大臣-执行命令
使用场景:模拟CMD
6.观察者模式
对象的一对多模型,一个对象变化时,所有依赖它的对象都会得到通知并被自动更新
按顺序观察会导致系统卡壳,默认异步
使用场景:建立一套完整的触发机制,A观察B的同时被C观察