41.JAVA的IO流是什么?
java中的IO流分为字节流和字符流
字节流是InputStream和OutputStream,、字符流是Reader和Writer
字节流处理8位字节数据,适用于处理二进制文件例如:图片视频等
字符流:处理16位字符数据,适用于文本文件
42.什么是JAVA的网络编程?
一般让你手写一个网络通信代码
比较复杂,可以去学习Netty
43.JAVA中的基本数据类型有哪些?
byte,char,short,boolean,int ,float,long,double
44.什么是JAVA中的自动装箱和自动拆箱?
自动装箱:是指将基本类型转换成包装类
自动拆箱:是指将包装类转换成基本类型
45.什么是JAVA中的迭代器(iterator)?
iterator是结合框架中用来遍历元素的接口,核心方法如下:
hasNext(),如果返回true表示集合中还有下一个元素,返回false代表遍历结束
next(),返回下一个元素
remove(),删除最近一次通过next()方法获取到的数据
46.JAVA运行时异常和编译时异常的区别是什么?
运行时异常(uncheckedException),发生在程序的运行过程中,一般不需要显示捕获处理,也可以选择用try-catch捕获
常见的有;索引异常,除数不能为0异常等等
编译时异常(checkedException),发生在程序的编译的时候,需要显式处理通常用try-catch捕获,或者直接用throw抛出
常见异常有:文件未找到,数据库访问出错
47.什么是JAVA中的继承机制?
继承是java面向对象的三大特性之一:允许子类继承父类的所有属性和方法,即使是private的也可以继承,只是没有访问权限,这样可以提高代码的复用,减少代码的冗余度
48.什么是JAVA的封装特性?
java封装特性也是三大特性之一,是将对象的数据和方法封装在一个类的内部,通过特定的接口访问,这样可以影藏内部实现只暴露出特定的接口,提高了安全性
49.JAVA中的访问修饰符有哪些?
修饰符 | 当前类 | 同一包内 | 子类(不同包) | 其他包 |
---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
默认 | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
50.JAVA中静态方法和实例方法的区别是什么?
静态方法属于类级别,随着类的加载而加载,可以直接通过类名进行调用,
可以访问类的静态变量和静态方法,但是不能访问实例对象和方法,不可以使用this.这个关键字,因为this指代的是实例对象
实例方法是对象级别,对着对象的创建而加载,需要通过实例对象进行调用
51.for循环和foreach循环的区别是什么?
普通的for循环允许开发者控制初始化,判断条件和步进
foreach是java5引入的一个语法糖,用于遍历数组或者实现了iterator接口的集合
是从头遍历到尾的,不提供索引
同时在使用其遍历集合的时候不能对集合进行增,删防止结构发生改变,
如果需要增加可以使用普通的for循环在确定循环次数的情况下进行增加,
删除的时候建议使用iterator中的remove()方法,因为这个方法维护了modCount变量的状态,可以防止发生异常,
不可以使用循环根据索引删除,这样会出现问题(因为集合被更改之后索引就会发生变化)
52.什么是JAVA中的双亲委派机制?
双亲委派机制是java的类加载机制:类加载器在加载某一个类的时候会优先派给父类加载器进行加载,父类加载器无法加载的时候再由这个加载器进行加载
JAVA有三种加载器:
Bootstrap,根加载器
Extension:扩展加载器
Application:应用程序类加载器
为什么会有双亲委派机制?
为了保证安全性和一致性,因为每次加载都要追寻父类加载器最终是Bootstrap类进行加载,这样就可以防止如果一个人造了一个危险的类让JVM加载,但是找不到其父类就无法加载
一致性是保证这个类在JVM中只会被加载一次,确保整个应用中使用的是同一个类对象。
违反双亲委派机制的例子:
JDBC,是SPI机制,通常是通过线程的上下文来加载SPI的实现类,绕过了父类加载器
53.JAVA中的wait()和sleep()有什么区别?
wait()方法是Object中的方法,只能在同步块或者同步方法中调用,因为wait()方法依赖于对象锁管理线程的等待和唤醒方法,调用之后会立即释放当前线程所含有的对象锁,进入等待状态
而sleep()方法是Thread类中的方法,可以再任何上下文中调用不需要任何对象锁
用途:
wait()一般用户线程间通信,配合notify()和notifyAll()来唤醒
sleep()方法通常用于控制线程的执行频率或者模拟延时
54.JAVA中的字节码是什么?
字节码是java编译器将java源代码编译之后生成的中间表示形式,位于java源代码和jvm执行的机器码之间
JVM通过解释器逐条执行字节码,将字节码片段转换成机器码执行
java的反射机制,可以在运行时修改字节码文件动态的创建对象,执行方法
字节码增强和框架:例如CGLIB可以修改类的字节码来实现动态代理
55.什么是JAVA中的BIO/NIO/AIO?
BIO:阻塞IO流,调用方发起IO请求之后会一直阻塞直到操作完成之后才继续执行
NIO:非阻塞IO流,调用之后立即返回,即使操作没有完成,通常结合IO复用技术,使得一个线程可以管理多个连接(比如Netty中的eventLoop)通常是一个线程循环遍历这些通道实时检查哪一个通道发送了消息)
AIO:异步IO,不需要等待调用完成,操作系统或者底层库在IO操作完成后通过回调事件通知的方式告诉调用方
56.什么是Channel?
Channel是java nio中的 一个核心概念用户数据的读写操作,
Channel: 是双向的,可以同时支持读取和写入
常用语非阻塞IO操作,可以结合Selector来实现多路复用,从而处理多个并发连接
57.什么是Selector?
Selector是java NIO中用于实现IO多路复用的组件,可以通过一个线程管理多个通道Channel
与传统的BIO相比,以前一个通道需要用一个线程来处理,如果大量并发的情况下线程间的切换会非常浪费资源
所以使用Selector来节省资源
零散知识点:
-
private不可以修饰接口,不可以修饰abstract,不可以修饰类
-
接口中的常量默认时public static final 即常量,默认方法是public abstract 需要声明但是不用实现
-
java8之后可以使用静态方法和默认方法不过需要显式声明,这两个方法可以实现
-
JAVA中初始类加载顺序:
父类静态代码块——子类静态代码块——父类普通代码块——父类构造函数——子类普通代码块——子类构造函数
初始化类的时候会执行一遍上面代码块中的内容
-
符号优先级排序(从大到小):
“>”——“<”——“&&”——“||”
-
对于枚举类型,有多少个实例就会执行多少次构造方法,并且枚举类的构造方法只能用private修饰或者不添加
-
JAVA中不可以使用数字来代替if()中的判断,只能用true或false
-
在byte a=1; byte b=2;
byte c=a+b;
如果这样写会报错,因为byte在运算的时候会先转换成int类型进行计算,然后再将(int)类型的结果赋值给byte类型,没有出现类型转换会报错
但是如果是a+=b;这样写就不会报错,因为这样写编译器会自动进行强制类型转换
但是如果a和b都被final修饰的话就不能够强制转换了,因为final类不能改变
-
equals()方法判断值是否相等的时候会先判断两个类型是否相同如果不相同直接返回false,否则返回true