208道面试题 java基础(1-17)

版权声明:本文为博主原创文章,未经博主允许不得转载

一、Java 基础

1.JDK 和 JRE 有什么区别?

	jdk是java开发组件,是提供给开发人员的
	jre是java运行环境,是提供给使用者的,使用者只关心这个程序能不能用,而不关心他是怎么运行	的。所以提供的jre是供使用者下载使用的。
	简单来说:jdk和jre的区别就是一个用于开发,一个用于运行

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

== 是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是内存地址值。
(比较地址值即是指是否为同一个对象的引用)
equals() 是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。

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

equls返回为true,则两者的hashcode一定相等,意即相等的对象必须具有相等的哈希码。每当equals方法被覆写,通常需要重写hashCode方法从而保持对象行为的一致性。

而具有相等的hashcode的两个对象equals不一定成立。你可以这样认为也行,hashcode是作为一个对象存储的参考,hash表本身是一种散列表,在数据存储这块,功效比较大,而equals是相当于两对象之间的属性(成员变量)“相等”,意即具有相同的行为(方法)。或许这样讲起来理解比较的费劲。举个例子,比如你定义class A有两个属性,int aA,aB,在定义一个class B也有两个属性,int bA,bB,然后覆写hashcode方法,A类为return aAaB;B类为return bAbB.现在情况已经很显然了,各自实例化一个对象:a,b,假如:a.aA=b.bA,a.aB=b.bB,相等,或者a.aA=b.bB,a.aB=b.bA两个对象a,b的hashcode一定相等,当时你能说两个对象相等吗?显然不能吧,a与b都是不同类的实例。连equals最基本的obj instance of A或是obj instance of B都不成立。如果是同一个类的不同对象,当两者拥有相同hashcode的时候,则一定相等,或者equals成立的时候则hashcode一定为真,这也就是所谓的相等的对象具有行为一致性。

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

Java关键字 final 有“无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。

final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

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

-1

  计算方法:
参数的小数点后第一位<5,运算结果为参数整数部分
参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变
参数的 小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分

总结:大于五全部加,等于五正数加, 小于五全不加

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

java 中 String 是个对象,是引用类型 ,基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构 ,基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为 。

8种基本数据类型:

boolean(1字节) (只能代表真和假)

byte(1字节) (取值-128至127)

char (2字节)(代表1个字符中文或者英文)

short(2字节) (短整型)

int(4字节) (整型)

long(8字节)(长整型)

float(4字节)(单精度小数)

double(8字节)(双精度小数)

对应的基本类型包装类: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”)一样吗?

不一样。前者是一个常量,后者又重新new了一个对象,内存空间不一样。

9.如何将字符串反转?

方法1 递归方法

public static String reverse1(String s) {
  int length = s.length();
  if (length <= 1){
     return s;
    }
  String left = s.substring(0, length / 2);
  String right = s.substring(length / 2, length);
  return reverse1(right) + reverse1(left);
 }

方法2 通过 charAt(int index)返回char值进行字符串拼接

public static String reverse2(String s) {
  int length = s.length();
  String reverse = "";
  for (int i = 0; i < length; i++)
   reverse = s.charAt(i) + reverse;
  return reverse;
 }

方法3 把字符串转换成字符数组倒叙拼接然后返回值

public static String reverse3(String s) {
  char[] array = s.toCharArray();
  String reverse = "";
  for (int i = array.length - 1; i >= 0; i--)
   reverse += array[i];
  return reverse;
 }

方法4 调用StringBuffer中的reverse方法

public static String reverse4(String s) {
  return new StringBuffer(s).reverse().toString();
 }

方法5 把字符串转换成字符数组首位对调位置

public static String reverse5(String orig) {
  char[] s = orig.toCharArray();
  int n = s.length - 1;
  int halfLength = n / 2;
  for (int i = 0; i <= halfLength; i++) {
   char temp = s[i];
   s[i] = s[n - i];
   s[n - i] = temp;
  }
  return new String(s);
 }

方法6

public static String reverse6(String s) {
  char[] str = s.toCharArray(); 
  int begin = 0;
  int end = s.length() - 1;  
  while (begin < end) {
   str[begin] = (char) (str[begin] ^ str[end]);
   str[end] = (char) (str[begin] ^ str[end]);
   str[begin] = (char) (str[end] ^ str[begin]);
   begin++;
   end--;
  }
 return new String(str);
}
方法7
import java.util.Stack;
public class StringReverse {    
 public static String reverse7(String s) {
  char[] str = s.toCharArray();
  Stack<Character> stack = new Stack<Character>();
  for (int i = 0; i < str.length; i++)
   stack.push(str[i]);
  
  String reversed = "";
  for (int i = 0; i < str.length; i++)
   reversed += stack.pop();
  return reversed;
 } 
}

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

替换字符串 replace();
分割字符串 split(“regex”);
equals 字符串比较
length() 获取长度

更多的常用方法查看 api

下面列举了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) 得到指定内容最后一次出现的下标

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

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

12.普通类和抽象类有哪些区别?

(1)抽象类不能被实例化。

(2)抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。

(3)抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体

(4)含有抽象方法的类必须申明为抽象类

(5)抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。

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

抽象类需要被继承才能使用,而被final修饰的类无法被继承,所以abstract和final是 不能共存的。

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

(1)、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
(2)、抽象类要被子类继承,接口要被类实现。
(3)、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
(4)、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
(5)、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
(6)、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
(7)、抽象类里可以没有抽象方法
(8)、如果一个类里有抽象方法,那么这个类只能是抽象类
(9)、抽象方法要被实现,所以不能是静态的,也不能是私有的。
(10)、接口可继承接口,并可多继承接口,但类只能单个继承。

(11).抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
(12).抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
(13).抽象类主要用来抽象类别,接口主要用来抽象功能.
(14)、抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。

15.java 中 IO 流分为几种?

(第1种分类)可以分4种。

(1)字节输入流(InputStream)
(2)字节输出流(OutputStream)
(3)字符输入流(Reader)
(4)字符输出流(Writer)

(第2种分类)

按流向分(站在程序角度考虑)

输入流(input)

输出流(output)

按类型分:

字节流(InputStream/OutputStream)
任何文件都可以通过字节流进行传输。

字符流(Reader/Writer)

非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行。

节点流(低级流:直接跟输入输出源对接)

FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.

处理流(高级流:建立在低级流的基础上)

转换流:InputStreamReader/OutputStreamWriter,字节流转字符流/字符流转字节流

缓冲流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedReader可对节点流经行包装,使读写更快

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

答:https://blog.csdn.net/u010310183/article/details/81700405

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

答:https://www.cnblogs.com/cocoxu1992/p/10460994.html

猜你喜欢

转载自blog.csdn.net/weixin_44914784/article/details/89886263