Java面试基础118问
1:Java特点
健壮,面向对象,开源,跨平台
2:跨平台实现
jvm
3:jdk,jre,jvm关系
jdk>jre>jvm
4:Java一次编写,处处运行,如何实现
字节码
5:标识符
不以数字开头,区分大小写的可由字母,数字,_,$组成的名称
6:关键字
共53,包含保留字const,goto,常用40
7:注释
单行,多行,文档
8:基本数据类型
byte,short,char,int,long,float,double,boolean,分占1,2,2,4,8,4,8,1字节,默认值0,0,0,0L,0.0f,0.0d,false,char无默认值
9:基本类型转换
大到小,显式,强转,小到大,隐式,直转
10:运算符
算数,比较,逻辑,三元,赋值
11:分支结构
if,switch
12:循环结构
for,foeach,while,dowhile
13:break,continue区别
终止,跳出
14:&,&&,|,||区别
前者都执行,后者有一满足则不再往后执行,&&都为true则为true,有一false,则false,||相反
15:for,while,do while区别
都可互相替代,但while,do while 可不知循环起始位置,do while最少执行一次
16:重载
方法名相同,参数列表不同方法
17:数组
动静两种初始化方式,下标从0开始,长度一但固定不可变
18:数组工具类
Arrays,常用方法toStrng,sort,copyOf
19:面向对象
封装,继承,多态,对象与类例如猫与蓝猫的关系
20:封装
private,隐藏我想隐藏的信息
21:继承
extends,子承父,单一继承,且要重写父所有抽象方法,否则则为抽象类
22:多态
父类引用指向子类对象,编译看左,运行看右,提高扩展可维护性
23:匿名对象
无名对象,只能调用一次
24:构造方法
与类同名,无参,含参两种,可重载
25:构造,局部,静态代码块及构造方法
代码块目的抽取共性,一般起始位置书写,加载顺序,静>构>构方>局
26:this,super区别
本类,父类调用
27:重写,重载区别
重写参与父一致,重载则不同
28:static
所修饰为全局共享资源,一经创建,永久存储
29:final
所修饰类,方法,属性为最终类,方法,常量,不可继承,重写,修改
30:向上,向下转型
父类引用指向子类对象,子类引用指向子类对象
31:异常
error,exception,后者为可解决错误,常见解决捕获,抛出,try catch throw throws
32:抽象类
典型就是包含不含方法体的抽象方法的类,均用abstract修饰,方便子类继承重写,不可实例化,但可包含构造,普通,静态等方法和变量,也可全为普通方法
33:接口
只有抽象方法和常量的类,打破单继承,方法默认拼接public abstract,变量默认拼接 public static final,inteface修饰,类与接口实现关系implements,接口与接口继承关系,可多继承,多实现,也可继承的同时多实现
34:抽象类 接口区别
都不能实例化,最大局别抽象类可有变量,构造方法且接口打破了单继承局限
35:设计模式
单例设计模式,sngleton,保证一个类仅有一个实例,并提供一个全局访问点,
常见饿汉,只有一个实例,线程绝对安全,一开始就初始化,懒汉,第一次调用或者需要时才创建对象,非线程安全,延迟初始化,双检锁,线程安全,延迟初始化
36:开闭原则OCP
只能扩展,不能修改
37:object
顶级父类,常用equals,toString等方法
38:String
字符对象,常用length,substring,equals等方法
旗下两个高效拼接方式
StringBuilding,StringBuffer
前者效率更高,后者线程更安全
39:包装类
提供更加丰富的方法调用,除int,char 为Integer,Character外,其余均首字母大写,数字包装类抽象父类Number,xxxValue用来进行数字类型转化
40:Date
日期类,常用getTime,getMonth,日期工具SimpleDateFormat
41:自动拆箱,装箱
包装到基本的相互转换
42:BigDecimal,BigInteger
超级精确小数,超大整数运算,常用方法加减乘除
IO流
字节,字符输入输出流,字节以流的方式,以组传输,字符一个一个传输,效率比字节低,且数据类型只能是字符,字节则可传输多种数据类型,字节输出outputStream,fileoutputStream,bufferedoutputStream,字节输入,inputstream,fileinputstream,bufferedinputstrean
编码转换流之字节字符转换流 ,inputstreamreader
字符输出流writer,filewriter,bufferedwriter,字符输入流,reader,filereader,bufferedreader,编码转换流之字符字节转换流outputstreamwriter
43:序列化,反序列化
数据永久存储到磁盘,及从磁盘取出,序列化必须要实现Serializable接口,objectoutputstream,将Java的基本数据类型和图形持久存储,Objectinputstream对持久存储的数据的各类数据进行读取
44:flush,close区别
刷新但数据仍在流里,释放
45:数组,链表区别
查询,增删快
46:泛型
约束集合,方法,属性的数据类型,编译后消失,常见声明E,T,K,V,N,?
47:类型擦除
只存在编译期,编译后消失
48:集合
collection下子接口list,set(无序),子类arraylist,linkedlist,hashset,treeset,map接口与collection平级,hashmap,treemap
collections工具类 常用方法 sort,max,min,addAll
49:集合和数组区别
主要集合长度可变,数据类型多样,这些都是数组做不到的
50:进程
正在运行的程序,独立,动态,并发
51:线程
特性随机性,系统能够调度的最小单位,包含在进程当中,一个进程包含多个线程,便是多线程程序
52:线程状态
五种,新建,可运行状态,运行状态,终止状态,阻塞状态
产生阻塞原因 等待,同步,其他阻塞
53:多线程创建方式
常见继承实现thread,runnable,callable,pool
54:同步锁
synchronized关键字 解决线程安全问题 可自动释放锁
55:注解
元注解,jdk注解,自定义注解
56:反射
通过映射获取字节码中的资源,类似许愿灯,不仅可以通过反射获取公开资源也可通过暴力反射获取和修改私有资源,通过getDeclaredxxx和setaccessible来使私有属性或方法可以被访问或调用,newInstance来反射创建新实例,执行无参/有参构造
57:内部类
类中类,局部内部类可调外部类资源,外部类则必须创建内部类对象方可,匿名内部类,例如匿名对象后面加个{}形式,无名内部类
59:socket通信
会话机制,本质还是socekt间io流的传输,也称套接字编程,一般分为服务端,客户端两个机制
60: printstream打印流
io流中自己打印流,默认为标准输出,既显示器,可用print,或底层write打印,打印流不能输入
61:properfies,yml文件
优先级前者高
62:网络各层所对应的协议
应用层 http,dns,传输层 tcp 网络层 ip,物理,数据链路层link
63:dos命令备份和恢复数据库
mysqldump,source命令
64:并发编程
多个任务重叠时间执行的架构
65:高并发
重叠时间处理海量任务的能力,标准QBS,每秒响应请求量,吞吐量,平均响应时间,并发数用户,也是最大承载量,高并发就是多线程加锁的设计,提高并发垂直,水平扩展两种方式,垂直就是提升硬件,redis缓存,异步请求增加吞吐,nosql提升数据库访问能力等,水平就是加数量,集群分布式都是方案,包括针对数据库的主从分离,分库分表,读写分离等设计,集群就是多雇几个厨师炒菜,分布式就是多雇几个帮手
66:juc,forkjoin
jdk提供的并发编程工具包,loke重入锁就是juc下的工具,forkjoin,jdk1.7后出现的并发编程工具集,比juc更成体系
67:sleep,wait区别
sleep会自动释放锁,wait不会
68:synchronized
非公平锁,修饰静态方法锁类,实例锁对象,自动解锁
69:loke锁
默认非公平锁,实现类reentryLoke,手动上锁,解锁
70:线程安全的集合
vector,collections.synchronized,
71:读写锁
readwritelok,实现类reentrantwritelokee,为实现线程同步,可以为读和写设置不同的锁,需要手动上锁解锁
72:volatile关键字
jvm轻量同步机制,保证线程读取到最新值
73:calendar
完成日期时间的逻辑运算,缓冲流是为了防止频繁访问硬盘所造成的损伤,Java与硬盘之间
74:MySQL常用数据库引擎
innodb,memmery,mylsam,innodb底层b+树且支持事务,mylsam不支持事务,memmery是存在内存里面的
75:>>>,>>,<<
逻辑右移,无左移,算数右移动,算数左移,逻辑移动结果不变,算数右移/2,除不尽负数正数均往往小取整,算数左移*2
76:枚举
enum,定义通常的固定方法或常量,如日期,下拉框选项等
77:string stringbuffer区别
string不可变,stringbuffer可变,也是一个高效的字符拼接方式
78:hashmap,hashtable,treemap区别
hashmap,hashtable都是无绪的treemap有序,hashtable线程安全不支持null值键,hashmap线程不安全,支持null键和多个null值,treemap顺序访问,key不能为null
79:schronized,reenloke区别
关键字,loke锁的实现类,前者自动释放锁,后者需要手动
80:线程安全的list,vector,synchronizedList,copyonwriterarraylist
81:Java虚拟机的内存划分
程序计数器,栈,堆,常量池,方法区,本地方法栈
82:hashmap数据结构
jdk1.7数组+链表,1.8数组+链表+红黑树,链表节点>8,数组>64转红黑树
83:红黑树
查询快,左侧节点数小于根节点,右则大于根节点,,查询数小于根节点左侧查,大于右侧查
84:递归算法
大部分算法其实都是递归算法,优点整洁,实际开发计算效率要求不高会考虑用递归
85:NoclassDefoundError 和calssnotFoundException的区别
前者错误,后者异常,异常可以处理,错误不行
86:Java里面强引用,软引用,弱引用,虚引用
强是普通对象引用,软是弱一些的,可避免一些垃圾收集,弱可用来构建非特定的约束关系,虚引用并不能访问一些对象,属于一种机制
87:StringBuffer,stringbuilder应用场景
单线程大量缓存数据可用builder,安全用buffer
88:jvm新生代,老年代
所谓的新生代和老年代是针对于分代收集算法来定义的,新生代又分为Eden和Survivor两个区。加上老年代就这三个区。数据会首先分配到Eden区 当中(当然也有特殊情况,如果是大对象那么会直接放入到老年代(大对象是指需要大量连续内存空间的java对象)。),当Eden没有足够空间的时候就会 触发jvm发起一次Minor GC。如果对象经过一次Minor GC还存活,并且又能被Survivor空间接受,那么将被移动到Survivor空 间当中
89:函数式接口
有且只有一个抽象方法的接口
90:lambda表达式
三要素,形参(),箭头->箭头指向后面要做的事情 ,代码块{方法的内容
91==,equals区别
==比较数值,比较引用类型才是地址,equals比较的地址,重写后比较的大小
92:String,Stringbuffer,Stringbuilder区别
运行速度上Stringbuilder>Stringbuffer>String
String 少量字符拼接
Stringbuffer 线程安全
Stringbuilder 单线程大量缓存操作
93:同步,异步,并发,并行
同步排队,异步抢,并发也是集中抢cpu资源,并行一个cpu负责一个线程
94:流程控制语句
break,continue,return
95:String常用方法:
cahrAt,substring,equals,length
96:jdk8新特性
lambda表达式,方法引用,函数式接口,Stream api,修改了日期时间类,还内置了base64编码解码集
97:异常结构
throwable 下error exception
erroe不接解决错误,内存溢出,线程死锁等,exception为可处理错误,又分为非运行时错误和运行时错误,非运行时错误包含IO流错误,sql错误,运行时异常,经典的就是空指针,数组下标越界等
98:BIO,NIO,AIO区别
同步阻塞式IO,同步非阻塞IO.异步非阻塞IO
99:threadLocal
共享变量在每个线程中创建的一个副本,使用完threadlocal后,调用remove方法
100:同步锁,死锁,乐观锁,悲观锁
Java里面可以通过synchronized获取同步锁,保证线程同步互斥,避免同时访问出现问题,死锁就是多个线程同步阻塞,等待其中一个或全部释放.乐观锁只有在更新时才会校验一下,可以使用版本号和cas算法实现,悲观锁恰好和乐观锁相反,Java中synchronized和reentrantloke等独占锁都是悲观锁的实现
101:synchronized底层实现原理
保证同一时刻只有一个方法进入临界区
102:synchronized和volatile区别
volatile只能使用在变量级别,且不会造成线程阻塞,synchronized可以到类级别,可能会造成线程阻塞
103:hash冲突
不同对象算出来的数组下标是相同的就会产生hash冲突,当链表长度>8就会转为红黑树,提高查询效率
104:创建线程的几种方式
thread,runnable,callable,executor接口
105:runnable 和callable区别
runnable 接口 run方法 无返回值 callable 接口 call方法 有返回值
106:start 和 run区别?
start 开启线程 并让jvm调用run在县城执行,run就是普通对象调方法,不开启线程
107:线程相关基本方法
sleep,wait,yieId(线程让步),notify等待线程唤醒
108:wait和sleep区别
wait来自object,等待过程中会释放锁,sleep,来自thread,等待过程中不会释放锁
109:线程池
用来管理线程,提高响应速度
110:线程池的分类
threadPoolExceptor,foekjoinpool,sccheduledthreadPoolExceptor
111:线程池原理
任务提交后,首先判断核心线程有没有满,不是,创建一个新的线程,是则进入队列,判断队列是否满了,不是则放入工作队列,是则进入线程池,判断池中线程是否在都在执行任务,是则触发饱和策略,不是则创建线程执行
112:Gc垃圾回收
system,gc,只有线程共享的才存在垃圾回收,根据引用计数算法和根搜索算法去发现垃圾,针对不再具有引用的的信息进行回收
113:jvm调优
xmx,设置jvm最大内存xms 设置初始内存,xxs,设置每个线程栈大小等
114:构造器constructor是否可以被override
constructor不能被继承,所以不能被重写
115:final,finally,finalize区别
final修饰符,finally,try catch后面表示总是执行的代码,finalize为垃圾回收器在销毁对象时使用的
116:值传递和引用传递区别
一个传值,一个传对象
117:++i,i++区别
前者先运算后加,后者先加后运算
118:字符串存储的机制
字符串会存储在常量池中

