- JDK与JRE的区别?
- JDK:Java开发工具包,提供了Java的开发环境
- JRE:提供Java的运行环境
- StringBuffer、StringBuild以及String的区别?
-
相同点:它们都是操作字符串的类
-
不同点:
-
String是final修饰的,所以它每次操作都会创建一个对象,在经常改变的场景下不推荐使用
- StringBuffer与StringBuild都是能够动态的对字符串做处理,它们的区别是StringBuffer是线程安全的,StringBuild线程不安全但是执行效率要比StringBuffer高
- 执行效率:StringBuild>StringBuffer>String
-
-
- final的作用是什么?
- 类:当类被修饰时,该类不能够被继承
- 变量:当变量被修饰时,该变量是个常量
- 方法:当方法被修饰时,该方法不能被重写
- String的常见方法有哪些?
- indexOf(String str):返回指定字符的第一次出现的索引
- charAt(int index):返回指定索引处的字符
- replace(char oldChar,char newChar):返回替换所有匹配的字符后的字符串
- trim():返回去除字符串前后空格
- split(String str):分割字符串,返回一个分割后的字符串数组
- getBytes():返回字符串的byte类型数组
- length():返回字符串长度
- toLowerCase():将所有的大写字符转换为小写字符
- toUpperCase():将所有的小写字符转换为大写字符
- substring(int beginIndex):截取字符串
- substring(int beginIndex,int endIndex):截取之间的字符串
- equals(Object obj):字符串比较
- ==与equals的区别是什么?
- ==:
- 基本类型:值的比较
- 引用类型:引用是否相同
- equals:本质上就是==,只不过String和Integer等重写的equals,把它变成了值比较
- ==:
- hashCode()相同equals()一定为true吗?equals()为true那么hashCode()值会相同吗?
- 不一定为true,hashCode()值相同可能是因为散列表中的哈希值相同,但实际比较的参数不一定相同
- 一定相同,因为equals()为true代表比较的参数一定相同,所以执行hashCode()方法得到的值肯定相同
- 自动拆箱怎么实现的?
- 自动装箱:基本数据类型转为包装类型,调用包装类的ValueOf()方法
- Integer num=10;----------->Integer num=Integer.ValueOf(10);
- 自动拆箱:包装类型转为基本数据类型,调用包装类的xxxValue()方法
- int num1=num;------------->int num1=num.intValue();
- 自动装箱:基本数据类型转为包装类型,调用包装类的ValueOf()方法
- JavaBean是什么?
- JavaBean是一种遵循特定写法的Java类
- 特点:
- 这个Java类中必须包含无参构造器
- 属性必须使用private修饰
- 私有属性必须通过public修饰的方法暴露给其他程序,并且方法的命名也必须遵循一定的命名规范
- 重载和重写的区别,以及是否能够通过返回类型来判断重载的方法?
- 两者的区别:
- 重载:修饰符可以不同,返回类型可以不同,参数列表可以不同
- 重写:修饰符必须比被重写大或等于,返回类型必须相同,参数列表必须相同
- 不能够通过返回类型来判断重载,当我们声明一下两个方法,在调用时无法确定会调用哪个方法,方法在声明时编译也会报错
- int test(int x,int y)
- float test(float x,floaty)
- 两者的区别:
- 类加载器是什么?
- 类加载器(ClassLoader)是Java运行时环境的一部分,负责动态的加载Java类到JVM内存中。Java类都是按需加载,也就是每个类在第一次被使用时才会被加载。有了类加载器,系统就不需要知道文件或文件系统,因为类加载器会完成对类加载。
- 每个Java类必须有某个加载器装入到内存中
- JVM的三大默认的加载器:
- 引导(BootStrap)加载器:主要负责加载Java核心库,存放在<JAVA_HOME>/jre/bin目录下
- 扩展(EXtensions)加载器:用来在<JAVA_HOME>/jre/bin/ext或将java.ext.dirs中指明的目录中加载Java的扩展库
- Apps加载器(系统加载器):根据Java应用程序的类路径来加载Java类
- 抽象类和接口的区别?抽象类能被final修饰吗?
- 两者区别:
- 抽象类:能够被类继承、存在构造器、存在静态方法、存在方法体、对变量的修饰没有要求
- 接口:能够被类实现、不存在构造器、不存在静态方法、不存在方法体、变量只能被public static final修饰
- 抽象类不能被final修饰,因为抽象类就是要被其他类继承,所以不能被final修饰
- 两者区别:
- int和Integer的区别?
- int是基本数据类型,Integer是其包装类
- 当某应用中的属性需要存在缺省值时,引用类型的缺省值为null,而基本数据类型的缺省值则与其类型有关
- 面向对象的特征?
- 继承:一个新类从现有类中派生,这个过程就是继承。派生类继承了基类的属性和方法,并且能够新增方法和属性
- 封装:将一个类的属性或方法通过修饰符进行修饰,不同修饰符所支持其他类的访问范围不同,从而能够精确的控制类中的属性或方法
修饰符 本类 本包 子类 异包 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × - 多态:同一个行为具有不同的多个表现形式,如:重载(编译时多态)与重写(运行时多态)
- 抽象:就是把一个对象分析出各个属性,来替代表达的手法。如:学生信息表与学生成绩表,首先把它们都拥有的属性提取出来放在抽象类中,然后在继承类中添加需要的属性
- Java中如何跳出当前的多重嵌套循环?return、break以及continue之间的区别?
- 使用return或break关键词
- return是跳出整个函数体
- break是跳出循环体执行循环体之后的代码
- continue是跳出本次循环执行下一次循环
- Java的序列化是什么?如何实现序列化?使用场景?
- 序列化:就是处理对象流的一种机制,对象流就是将对象的内容进行流化。可以对流化后的对象进行读写,也可以将流化后的对象传输在网络之间。序列化的作用就是为了解决对对象流读写操作时所引发的问题
- 实现序列化:实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标记对象时刻被序列化的
- 使用场景:
- 使用socket在网络上传送对象时
- 想把内存中的对象状态保存到一个文件中或者数据库中时
- 想通过RMI(远程方法调用)传输对象时
- 常见的异常有哪些?
- 算术异常类型:ArithmeticException----->1/0
- 空指针异常类型:NullPointerException----->一个对象没有被实例化就被调用
- 数组下标越界异常:ArrayIndexOutOfBoundsException----->当访问的数组索引超过了实际长度时
- 字符串转换数字异常:NumberFormatException----->Integer,value("xx")
- 输出输入异常:IOException----->发生在读写异常时
- 算术异常类型:ArithmeticException----->1/0
- throw、throws、try、catch、finally分别代表什么?在try块中可以抛出异常吗?
- try:一块预防所有"异常"的代码块
- catch:指定你想要捕获的“异常”类型
- throw:用来明确地抛出一个“异常”,放在方法体中
- throws:用来标明一个成员函数可能抛出的各种“异常”,出现在函数头
- finally:为确保一段代码不管发生什么“异常”都被执行的一段代码
- 可以抛出异常,因为throw能够在方法体中抛出异常
- throw和thows的区别?
- throw:用来明确地抛出一个“异常”,放在方法体中
- throws:声明可能会抛出的异常
- final、finally、finalize之间有什么区别?
- final:修饰符,详见问题3
- finally:try-catch-finally中的部分,表示不论发生什么都会被执行,finally部分可以被省略,但如果存在一定会被执行
- finalize:是Object类的方法,在垃圾回收器执行的时候会调用被回收对象的此方法
- try-catch-finally中哪个部分可以省略?
- catch与finally都可以被省略,但不能都省略
- try-catch-finally中,如果catch中return了,finally还会被执行吗?
- 会执行,return会等finally执行完毕才会执行,finally比return的优先级高
- Java中有哪几种类型的流?JDK为每种类型的流提供了一些抽象类一共继承,请说出他们分别是哪些类?
- 字节输入输出流,InputStream/OutputStream
- 字符输入输出流,InputStreamReader/OutputStreamWrite
- BIO、NiO以及AIO之间的区别?
- BIO:Blocking IO 同步阻塞IO,传统IO,特点是模式简单使用方便,并发处理能力低
- NIO:Non Blocking IO 同步非阻塞IO,传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现多路复用
- AIO:Asynchronous IO 异步非阻塞IO,也称NIO2,异步IO的操作基于事件和回调机制
- 同步、异步、阻塞、非阻塞是什么?
- 同步:使用同步IO时,Java需要自己处理IO的读写
- 异步:使用异步IO是,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后通知Java回调
- 阻塞:使用阻塞IO时,Java调用会一直阻塞直到读写完毕才返回
- 非阻塞:使用非阻塞IO时,如果不能立马读写,那么Java调用会马上返回,直到IO事件分发器通知可读写时再进行读写
- Files的常见方法有哪些?
- Files.exists():检测路径是否存在
- Files.createFile():创建文件
- Files.createDirectory():创建文件夹
- Files.delete():删除一个文件或一个文件夹
- Files.copy():复制文件
- Files.move():移动文件
- Files.size():查看文件个数
- Files.read():读取文件
- Files.write():写入文件
- 抽象类的构造器有什么作用?
-
抽象类的构造器与普通类的构造器的作用是一样的--->初始化类
- 因为抽象类不能被实例化,所以继承了抽象的普通类可以在构造方法中调用抽象类的有参或无参构造方法
- 反射是在运行状态中,对于任意一个类,都能够知道这个类所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
- 获取反射方法有三种:
- Class.forName("类名");
- 对象.getClass();
- 类名.class
- 动态代理:就是在运行时动态生成代理类,代理就是完成你需要完成的事
- 使用场景:SpringAOP、Hibernate的数据查询、RPC、Java注解等
- JDK原生的动态代理:只提供接口的代理,制作过程快,但执行慢
- CGLIB动态代理:基于继承当类的子类实现,制作过程慢,但执行快