JDK和JRE有什么区别?
JDK:Java Development Kit 的简称,java开发工具包,提供了java的开发环境和运行环境。
JRE:Java Runtime Environment的简称,java运行环境,为java的运行提供了所需环境。具体来说JDK其实包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具。简单来说:如果你需要运行java程序,只需安装JRE就可以了,如果你需要编写java程序,需要安装JDK。
== 和 equals 的区别是什么?
== 解读
对于基本类型和引用类型 == 的作用效果是不同的,如下图所示:
基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;
代码示例:
String x = “string”;
String y = “string”;
String x = new String(“string”);
System.out.println(x==y);//true
System.out.println(x==z);//false
System.out.println(x.equals(y));//true
System.out.println(x.equals(z));//true
代码解读:因为x和y指向的是同一个引用,所以 == 也是 true,而new String()方法则是重写开辟了内存空间,所以 == 结果为 false ,而 equals 比较的一直是值,所以结果都为 true。
equals解读:equals 本质上就是 ==, 只不过String 和Integer 等重写了 equals 方法,
把它变成了值比较。看下面的代码就明白了。
首先来看默认情况下equals比较一个有相同值的对象,代码如下:
class Cat{
public Cat(String name){
this.name = name;
}
private String name;
public String getName() {
return name;
}
public String setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat(“猫”);
Cat c2 = new Cat(“猫”);
System.out.println(c1.equals(c2));//false
看equals源码就知道了,源码如下:
public boolean equals(Object obj){
return (this == obj);
}
原来 equals本质上是 == 。
两个相同值的String对象,为什么返回的是true?代码如下:
String s1 = new String("amo");
String s2 = new String("amo");
System.out.println(s1.equals(s2));//true
String 的 equals 源码如下:
public boolean equals(Object anObject){
if (this == anObject){
return true;
}
if (anObject instanceof String){
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length){
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0){
if (v1[i] != v2[i]){
return false;
}
i++;
}
return true;
}
}
return false;
}
String 重写了 Object 的 equals方法,把引用比较改成了值比较。
总结: == 对于基本类型来说是值比较。对于引用类型来说是比较的引用;
而equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如String、
Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
两个对象的 hashCode() 相同,则 equals() 也一定为 true ,对吗?
不对,两个对象的 hashCode() 相同,equals() 不一定 true。
代码示例:
String str1 = “通话”;
String str2 = “重地”;
System.out.println(String.format("str1: %d | str2: %d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
执行结果:
str1: 1179395 | str2: 1179395
false
代码解读:
显然 “通话” 和 “重地” 的hashCode() 相同,然而 equals() 则为false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等, 并不一定能得出键值对相等。
final 在 java 中有什么作用?
final修饰的类叫最终类,该类不能被继承。final 修饰的方法不能被重写。final修饰的变量叫常量,
常量必须初始化,初始化之后值就不能被修改。
java中的Math.round(-1.5)等于多少?
等于-1,因为在数轴上取值时,中间值(0.5) 向右取整, 所以正0.5是往上取整,负0.5是直接舍弃。
String 属于基础的数据类型吗?
Sting不属于基础类型,基础类型有8种:byte、boolean、char、short、int、float、long、double,而String属于对象。
java中操作字符串都有那些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder
String 和StringBuffer、StringBuilder的区别在于String声明是不可变的对象,每次操作都会生成新的String 对象,然后将指针指向新的String 对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。
StringBuffer 和StringBuilder 最大的区别在于, StringBuffer 是线程安全的,而StringBuilder 是非线程安全的, 但StringBuilder 的性能却高于StringBuilder,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
String str = “i” 与 String str = new String(“i”) 一样吗?
不一样,因为内存的分配方式不一样。String str = "i" 的方式,java虚拟机 会将其分配到常量池中;而 String str = new String("i") 则会被分到堆内存中。
如何将字符串反转?
使用StringBuilder 或者 StringBuffer 的 reverse()方法
示例代码:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse());// gfedcba
// StringBulider reverse
StringBulider stringBulider = new StringBulider();
stringBulider.append("abcdefg");
System.out.println(stringBulider.reverse());// gfedcba
String类的常用方法都有那些?
indexOf() | 返回指定字符的索引 |
charAt() | 返回指定索引处的字符 |
replace() | 字符串替换 |
trim() | 去除字符串两端空白 |
split() | 分割字符串,返回一个分割后的字符串数组 |
getBytes() | 返回字符串的byte类型数组 |
length() | 返回字符串长度 |
toLowerCase() | 将字符串转成小写字符 |
toUpperCase() | 将字符串转成大写字符 |
substring() | 截取字符串 |
equals() | 字符串比较 |
抽象类必须要有抽象方法吗?
示例代码:
abstract class Cat{
public static void sayHi() {
System.out.println("hi~");
}
}
抽象类并没有抽象方法但完全可以正常运行。
普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
普通类可以直接实例化,抽象类不能直接实例化。
抽象类能使用final修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,
所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:
接口和抽象类有什么区别?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有 。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据。
BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是平常使用的传统 IO ,特点是模式简单使用方便,并发处理能力低。
NIO:New IO同步非阻塞 IO , 是传统 IO 的升级,客户端和服务器端通过 Channel ( 通道 ) 通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2 ,实现了异步非堵塞 IO,异步 IO 的操作基于事件和回调机制。
Files 的常用方法都有哪些?
Files.exists() |
检测文件路径是否存在 |
Files.createFile() | 创建文件 |
Files.createDirectory() | 创建文件夹 |
Files.delete() | 删除一个文件或者目录 |
Files.copy() | 复制文件 |
Files.move() | 移动文件 |
Files.size() | 查看文件个数 |
Files.read() | 读取文件 |
Files.write() | 写入文件 |
有不对欢迎指出,侵删
标签:面试题,java,String,equals,println,Java,抽象类,out From: https://www.cnblogs.com/yvette-hathaway/p/17252775.html