1.JDK 和 JRE 有什么区别?
JDK:Java Development Kit
java 开发工具包,提供了java的开发和运行环境
JDK=java开发工具包和JRE
JRE:Java Runtime Environment
java的运行环境
JRE=jvm+核心类库
2.== 和 equals 的区别是什么?
== : 它的作用是判断两个对象的地址是不是相等。
即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对。
hasCode()相同只是表明2个键值对的hash值相等,并不能说明2个键值对相等。
扩展:
在HashMap中:当哈希算法算出的2个元素值相同,称之为哈希冲突。冲突后,进行进一步的判断,判断的是元素的内容,equals方法解决冲突。对使用哈希,所以每个对象都有hashCode()方法。
哈希表在判断元素是否相同,依据hashCode().如果哈希值相同,在判断元素的equals方法,true——不存,false——存储。
4.final 在 java 中有什么作用?
final关键字。最终
1final修饰符,可以修饰类,修饰方法,修饰变量
2final修饰的类不可以被继承.
3final修饰的方法不可以被覆盖(复写).
4final修饰的变量是一个常量,只能赋值一次,当使用的数据不变时,需要定义阅读性强的名称表示该数据,并将其数据final化
被final修饰的变量,名称规范是:所有字母都大写SING_INGSTAFD
final固定的是显示初始化值,不是默认值。
5.java 中的 Math.round(-1.5) 等于多少?
Math.ceil() 执行向上舍入,即它总是将数值向上舍入为最接近的整数;
Math.floor() 执行向下舍入,即它总是将数值向下舍入为最接近的整数;
Math.round() 执行标准舍入,即它总是将数值四舍五入为最接近的整数(这也是我们在数学课上学到的舍入规则)。
ceil:天花板,往大了走,大于等于原值得最小整数,
floor:地板,往小了走,小于等于原值得最大整数
round:四舍五入,尽力往大了弄,floor(x+0.5)
对于正数:round(1.6)=2,round(1.5)=2,round(1.4)=1
对于负数:round(-1.4)=-1,round(-1.5)=-1,round(-1.6)=-2
6.String 属于基础的数据类型吗?
不属于,String属于字符串对象。
基本对象:byte,short,int,long,char,boolean,float,double
引用对象:数组,对象,类
7.java 中操作字符串都有哪些类?它们之间有什么区别?
1可变性:
String 类中使用 final 关键字字符数组保存字符串, private final char value[] ,所以String对象是不可变的。
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder中也是使用字符数组保存字符串 char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
2线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder 是 StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
3性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
String | final修饰,线程安全,适合操作少量数据 |
---|---|
StringBuffer | 无final修饰,但是对方法加了同步锁,线程安全,适合多线程操作缓冲区下大量数据 |
StringBuilder | 无final,无同步锁,线程不安全,适合单线程下操作缓冲区中大量数据 |
8.String str="i"与 String str=new String(“i”)一样吗?
String str = "i";//存放在方法区中的常量池中
String str=new String(“i”);//存放在堆中的一个对象
9.如何将字符串反转?
public static void main(String[] args) {
//StringBuffer的reverse方法
StringBuffer stringBuffer = new StringBuffer ();
stringBuffer.append ("abcd");
System.out.println (stringBuffer.reverse ());
//StringBuilder的reverse方法
StringBuilder stringBuilder = new StringBuilder ();
stringBuilder.append ("abcd");
System.out.println (stringBuilder.reverse ());
//String中的toCharArray()方法
String string = new String ("abcd");
char[] chars = string.toCharArray ( );
StringBuffer stringBuffer1 = new StringBuffer ();
for (int i = chars.length-1;i>=0;i--){
stringBuffer1.append (chars[i]);
}
System.out.println (stringBuffer1);
//String中的charAt()方法
String s = "abcd";
String reverse = "";
for (int i = s.length ()-1; i >=0; i--) {
reverse = reverse+s.charAt (i);
}
System.out.println (reverse);
}
10.String 类的常用方法都有那些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
11.抽象类必须要有抽象方法吗?
不一定。
抽象类中不一定要包含abstract方法。也就是说,抽象类中可以没有abstract方法。
12.普通类和抽象类有哪些区别?
相同:都是用来描述事物,对其进行属性和行为的描述
不同:抽象类描述事物的信息不具体,一般类描述事物的信息具体
代码的不同:
抽象类中可以定义抽象方法,但是一般类不行。
抽象类不可以实例化,一般类可以。
13.抽象类能使用 final 修饰吗?
抽象类必须由子类覆盖抽象方法才可以实例化,创建对象
final,修饰类,确保此类不能被覆盖。
14.接口和抽象类有什么区别?
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
15.java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:
字节流按 8 位传输以字节为单位输入输出数据
字符流按 16 位传输以字符为单位输入输出数据。
16.BIO、NIO、AIO 有什么区别?
BIO: 同步阻塞式IO,一个连接对应一个线程
NIO:同步非阻塞式IO,一个请求对应一个线程 Buffer,Channel,Selector
AIO:异步非阻塞式IO,一个有效请求一个线程
BIO | 这种模式下,我们的工作模式是先来到厨房,开始烧水,并坐在水壶面前一直等着水烧开。 |
---|---|
NIO | 这种模式下,我们的工作模式是先来到厨房,开始烧水,但是我们不一直坐在水壶前面等,而是回到客厅看电视,然后每隔几分钟到厨房看一下水有没有烧开。 |
AIO | 这种模式下,我们的工作模式是先来到厨房,开始烧水,我们不一一直坐在水壶前面等,也不隔一段时间去看一下,而是在客厅看电视,水壶上面有个开关,水烧开之后他会通知我。 |
17.Files的常用方法都有哪些?
Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。