Java面试题

一、 Java 基础
1.JDK和JRE有什么区别?
JDK就是Java Development Kit ,JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
2.== 和 equals 的区别是什么?
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
a.比较的是操作符两端的操作数是否是同一个对象。
b.两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
c.比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

3.两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
两个object对象,如果equals()相同,hashcode()一定相同,如果,hashcode()相同,equals()不一定相同。
4. final 在 java 中有什么作用?
Final可以修饰:类,函数,变量
修饰类时:表示最终类,任何类不能再继承它。
修饰函数时:表示该方法是该类中的最终函数,继承他的方法不能去重写它。
修饰变量时:表示该变量是常量或者叫终态变量,一旦初始化后不能再改变变量的值。
5. java 中的 Math.round(-1.5) 等于多少?
-1,
math.round()四舍五入,返回一个最接近的值,如果是0.5,上下距离一样,向正无穷方向取值,其实就是取较大的值。
public void testRound(){
System.out.println(Math.round(12.5)); //13
System.out.println(Math.round(-12.5)); //-12
System.out.println(Math.round(-12.6)); //-13
}
6. String 属于基础的数据类型吗?
不属于。String是一个对象。
8种基本数据类型: boolean byte char shrot int long float double
对应的基本类型包装类:Boolean Byte Character Short Integer Long Float Double
7. java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
区别:String是不可变的对象,对每次对String类型的改变时都会生成一个新的对象,StringBuffer和StringBuilder是可以改变对象的。
对于操作效率:StringBuilder > StringBuffer > String
对于线程安全:StringBuffer 是线程安全,可用于多线程;StringBuilder 是非线程安全,用于单线程
不频繁的字符串操作使用 String。反之,StringBuffer 和 StringBuilder 都优于String
8. String str=“i"与 String str=new String(“i”)一样吗?
不一样
String str =”i”是一个常量,String str = new String(“i”)重新new了一个对象,内存空间不一样。
9.如何将字符串反转?
第一种、
public class Main {
public static void main(String[] args) {
String s1 = “asdfghjkl”;
System.out.println(new Main().swapWords(s1));
}
public void swap(char[] arr, int begin, int end) {
while (begin < end) {
char temp = arr[begin];
arr[begin] = arr[end];
arr[end] = temp;
begin++;
end–;
}
}
public String swapWords(String str) {
char[] arr = str.toCharArray();
swap(arr, 0, arr.length - 1);
int begin = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] == ’ ') {
swap(arr, begin, i - 1);
begin = i + 1;
}
}
return new String(arr);
}
}
第二种、
public class Main {
public static void main(String[] args) {
String s1 = “asdfghjkl”;
String[] s = s1.split(”");
List list = list = Arrays.asList(s);
Collections.reverse(list);
System.out.println(list);
}
}
第三种、
public class Main {
public static void main(String[] args) {
String s1 = “asdfghjkl”;
System.out.println(new StringBuilder(s1).reverse().toString());
}
}
10. String 类的常用方法都有那些?
下面列举了20个常用方法。格式:返回类型 方法名 作用。
1、和长度有关:
int length() 得到一个字符串的字符个数
2、和数组有关:
byte[] getByte() ) 将一个字符串转换成字节数组
char[] toCharArray() 将一个字符串转换成字符数组
String split(String) 将一个字符串按照指定内容劈开
3、和判断有关:
boolean equals() 判断两个字符串的内容是否一样
boolean equalsIsIgnoreCase(String) 忽略太小写的比较两个字符串的内容是否一样
boolean contains(String) 判断一个字符串里面是否包含指定的内容
boolean startsWith(String) 判断一个字符串是否以指定的内容开头
boolean endsWith(String) 判断一个字符串是否以指定的内容结尾
4、和改变内容有关:
String toUpperCase() 将一个字符串全部转换成大写
String toLowerCase() 将一个字符串全部转换成小写
String replace(String,String) 将某个内容全部替换成指定内容
String replaceAll(String,String) 将某个内容全部替换成指定内容,支持正则
String repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容
String substring(int) 从指定下标开始一直截取到字符串的最后
String substring(int,int) 从下标x截取到下标y-1对应的元素
String trim() 去除一个字符串的前后空格
5、和位置有关:
char charAt(int) 得到指定下标位置对应的字符
int indexOf(String) 得到指定内容第一次出现的下标
int lastIndexOf(String) 得到指定内容最后一次出现的下

  1. 抽象类必须要有抽象方法吗?
    抽象类不一定有抽象(abstrace)方法,有抽象类(abstrace)方法的类一定是抽象类。
  2. 普通类和抽象类有哪些区别?
    a.抽象类不能被实例化。
    b.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
    c.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
    d.含有抽象方法的类必须申明为抽象类
    e.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
  3. 抽象类能使用 final 修饰吗?
    不能
    抽象类中的抽象方法是未来继承之后重写方法,而用final修饰的类,无法被继承。
  4. 接口和抽象类有什么区别?
    1.抽象类是被子类继承,接口是被类实现
    2.接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
    3.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
    4.接口是设计的结果 ,抽象类是重构的结果
  5. java 中 IO 流分为几种?
    1.字节输入流(InputStream)
    2.字节输出流(OutputStream)
    3.字符输入流(Reader)
    4.字符输出流(Writer)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值