面试Java 基础答案

Java 基础

1.JDK 和 JRE 有什么区别?

JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

2.== 和 equals 的区别是什么?

==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。

(比较地址值即是指是否为同一个对象的引用)

equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

两者之间唯一的必然关系被你说反了,equls返回为true,则两者的hashcode一定相等,意即相等的对象必须具有相等的哈希码。每当equals方法被覆写,通常需要重写hashCode方法从而
保持对象行为的一致性。而具有相等的hashcode的两个对象equals不一定成立。

4.final 在 Java 中有什么作用?

final关键字可以用于三个地方。用于修饰类、类属性和类方法。

     被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写);

     对于被final关键字修饰的类属性而言,子类就不能给他重新赋值了,如果重新赋值,会报错:

5.Java 中的 Math.round(-1.5) 等于多少?

round是四舍五入,注意负数5是舍的,例如:Math.round(1.5)值是2,Math.round(-1.5)值是-1;
floor就是直接去掉小数保留整数,即如果参数是正数则小数部分全舍,参数是负数则小数部分全入。 例如:Math.floor(2.6)的值是2,Math.floor(-2.1)的值是-3

6.String 属于基础的数据类型吗?

String不是基本数据类型,而是一个类(class),是C++、java等编程语言中的字符串。
  String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。因为,java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。

为了提高效率节省空间,我们应该用StringBuffer类。

7.Java 中操作字符串都有哪些类?它们之间有什么区别?

String:用来处理长度不可变的字符串
StringBuilder(StringBuffer 这两个只是版本不同而已)用于处理可变长度字符串

8.String str="i"与 String str=new String(“i”)一样吗?

String str1 = “str1”:
1、 在栈中创建str1的引用。
2、 去常量池中查看是否有相同Unicode编码的字符串常量。如果有将str1指向该常量,如果没有则创建一个内容为”str1”的字符串常量,将str1的引用指向该常量。
3、 如果str1进行了赋值str1= “123”,则栈中的str1的引用指向新的内容为“123”的字符串常量。
4、 String str1 = “str1”; String str2 = “str1”;str2的引用指向常量池中已经存在的内容为“str1”的常量,不会重新创建新的常量,str1和str2的引用指向同一个常量。
str1 == str2; str1+”a” != str2+”a”;
String str1 = new String(“str1”):
1、 在常量池中创建内容为“str1”的对象,在堆中创建内容为“str1”的对象。
2、 String str1 = new String(“str1”); String str2 = new String(“str1”);str2不会指向之前创建的对象,而是重新创建一个对象。
str1 != str2;
 

9.如何将字符串反转?

package string;

public class StringTest3 {
public static void main(String[] args)
{
String s="abcdefg";
String s2="";
char[] cs=s.toCharArray();
for(int i=cs.length-1;i>=0;i--)
{
s2=s2+cs[i];
}
System.out.println("对字符串进行反转操作后为:"+s2);
StringBuffer sb=new StringBuffer("abcdefg");
StringBuffer sb2=sb.reverse();
System.out.println("对StringBuffer进行反转操作后为:"+sb2);
}

}

10.String 类的常用方法都有那些?

常用方法

equalsIgnoreCase();//无视大小写比较

toLowerCase(); //变小写

toUpperCase(); //变大写

trim();//去掉字符串两端的空格

concat();//连接字符串,和+一样(任何基本类型+""都是字符串类型)

replaceAll("原子串","新子串") //把原内容全部替换成新内容

其他方法

public int indexOf(String value)//搜索第一个出现子串value的地方,找不到返回-1(字符串中空格也算位置,几个空格几个位置)

public int lastIndexof(String value)//搜索最后一个出现子串value的地方,找不到返回-1

public String substring(int index)//从index开始截取到末尾(注意string的s是小写)

public String substring(int beginindex,int endindex)//从beginindex截取到endindex(包含起始位置,不包含结束为止)

public String[] split(String regex); //拆分字符串byte[] getBytes() //将字符串打散成一个字节数组
 

11.抽象类必须要有抽象方法吗?(重点)

抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

12.普通类和抽象类有哪些区别?(理解性记忆,漫画形式)

13.抽象类能使用 final 修饰吗?

不能的,final是最终类 是不能被继承的。
而 抽象类 abstract 是必须被继承的才有其意义的。
所以不行。

14.接口和抽象类有什么区别?

1、 接口是抽象类的变体,接口比抽象类更加抽象,接口中所有的方法都是抽象的。

2、每个类只能继承一个抽象类,但是可以实现多个接口。

3、抽象类中不一定都是抽象方法,抽象的而抽象类可以实现部分方法。但是接口中方法必须为public修饰的、抽象的不能实现具体的法。

4、接口中基本数据类型为static而抽象类不是的。

什么是接口?
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

什么是抽象类?
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。


相同点

都不能被直接实例化,都可以通过继承实现其抽象方法。
都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点

接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。 
接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

https://blog.csdn.net/citongke1/article/details/8607013

15.Java 中 IO 流分为几种?

Java中IO流分成两大类,一种是输入流,所有的输入流都直接或间接继承自InputStream抽象类,输入流作为数据的来源,我们可以通过输入流的read方法读取字节数据;另一种是输出流,所有的输出流都直接或间接继承自OutputStream抽象类,输出流接收数据,可以通过write方法写入字节数据。在Java的IO流类中,大部分的输入流和输出流都是成对存在的,即如果存在XXXInputStream,那么就存在XXXOutputStream,反之亦然。(SequenceInputStream和StringBufferInputStream是特例,没有对应的SequenceOutputStream类和StringBufferOutputStream类,稍后会解释)。许多IO操作都可能会抛出IOException异常,比如read、write、close操作。
https://blog.csdn.net/iispring/article/details/46821033

16.BIO、NIO、AIO 有什么区别?

https://blog.csdn.net/qq_24693837/article/details/70335491

17.Files的常用方法都有哪些?

https://blog.csdn.net/Myair_AC/article/details/77199359

猜你喜欢

转载自blog.csdn.net/Richard_666/article/details/88246905