Java面试题归纳

Java面试题归纳

  1. java与javac命令
    javac index.java java index

  2. int i = 10000000000000;会报错吗?为什么?
    会报错,int变量只有4个字节,超过了最大变量

  3. 整数有哪几种类型?int几个字节?
    byte(1),short(2),int(4),long(8)

  4. float f = 3.14;报错吗?为什么?
    会报错,3.14默认为double型,需要进行强转float f = 3.14f ;

  5. B/S架构跟C/S架构的区别是什么?
    C/S架构通过客户端来使用服务器,常用于开发软件,如微信APP
    B/S架构通过浏览器来使用服务器,常用于网页,如www.taobao.com

  6. Java中有哪些基本数据类型?
    整型: byte(1),short(2),int(4),long(8)
    浮点型:float,double
    布尔型:boolean
    字符型:char

  7. int t = 5; int r = ++t + t++ + ++t + ++t;
    6+6+8+9=29

  8. short s = 1; s += 1; 会报错吗?short s = 1; s = s+1;会报错吗?为什么?
    前面不会,s+=1自动转换为short类型
    后面会,s=s+1中,1为int型,大转小需要强转

  9. 8*2最快的的运算方式是什么?
    左移一位,8的二进制数为0000 1000,左移一位为:0001 0000为16 System.out.println(8<<1);

  10. System.out.println(5>3?9:3.1);
    结果为9.0
    9:3.1先进行类型转换,9转换为9.0,结果为true则输出9.0,否则输出3.0

  11. switch可以跟哪些数据类型?
    整型:byte,short,int
    字符型:char,String
    枚举:enum

  12. char c = ‘72’ 正确吗?
    不正确,char是字符型变量,单位长度为1
    char c = 72;输出为ASCⅡ表中对应的字符,一个字符
    char c = ‘2’;一个字符

  13. 写出5个异常类(报错)
    ArrayIndexOutOfBoundsException 数组下标越界错误
    NullPointerException 空指针异常
    ClassCastException 指定的类异常
    IllegalArgumentException 方法的参数错误
    ArithmeticException 数学运算异常

  14. 使用冒泡排序,排序一组数据

public static void main(String[] args) {
	int numArr[] = {5,11,9,4};
	int a;
	for(int i=0;i<numArr.length;i++){	
		for(int j=0;j<numArr.length-1;j++){
			if(numArr[j]>numArr[j+1]){
				a = numArr[j];
				numArr[j] = numArr[j+1];
				numArr[j+1] = a;
			}
		}
	}
	System.out.println(Arrays.toString(numArr));
}
  1. Java三大特性
    封装,继承,多态

  2. 重写与重载的区别
    重写:方法名相同,参数列表相同。返回的数据类型,若为基本数据类型则保持一致,若为引用数据类型,父类>=子类。
    重载:方法名相同,参数列表必须不同

  3. this与super关键字
    在重写的方法中,super.方法名为调用父类的方法,this.方法名为调用子类的方法
    如果不涉及重写,this与super没有区别,都调用父类的方法

  4. final的用法
    final修饰属性:属性的内容必须初始化(构造器赋值、定义属性直接赋值)
    final修饰类:表示这个类不能被继承
    final修饰方法:表示这个方法不能被重写

  5. 堆与栈的区别
    堆:存储实例对象,存取速度慢
    栈:存储对象、变量的引用,存取速度快

  6. 抽象类与接口的区别
    抽象类:
    1.有抽象方法的类叫做抽象类,用abstract关键字修饰。
    2.父类定义的抽象方法要通过子类实现。
    3.抽象类不能直接实例化,要通过非抽象子类。
    4.抽象的方法不能有方法体,直接用;结束。
    5.抽象类可以有非抽象的方法,非抽象类不能有抽象的方法。
    6.抽象类的访问修饰符不能为private,否则子类无法实现。
    7.抽象类只能被单继承。
    接口:
    1.接口不能直接实例化,必须有实现类,使用implements关键字。
    2.抽象的方法可有可无。
    3.实现类可以同时实现多个接口。
    4.接口可以多继承,即可以同时继承多个接口。
    5.接口定义的变量只能为静态的常量。

  7. 访问修饰符及作用范围
    在这里插入图片描述

  8. 父类跟子类静态代码块、代码块、构造方法的执行顺序
    父类静态代码块–>子类静态代码块–>父类成员代码块–>父类构造方法–>子类成员方法–>子类构造方法

  9. 请写出5个类、5个包
    类:Date,System,Class,List,HashMap
    包:java.lang包,java.io包,java.util包,java.sql包,javax.servlet包

  10. final、finally、finalize的区别
    final:是修饰符。声明类时,这个类不能再派生出新的子类,一个类不能同时被abstract和final声明。声明属性时属性必须初始化。声明方法时表示这个方法不能被重写。
    finally:在异常处理时提供finally块来执行清楚操作。如果抛出一个异常,相匹配的catch语句执行进入finally块(如果存在finally块的情况下)。
    finalize:是方法名。finalize()方法在垃圾收集器将对象从内存中清除之前作必要的清理工作。这个方法在垃圾收集器确定对象没有被引用的情况之后才能被调用。此方法在Object中被定义,因此所有类都可以调用它,也可以重写该方法。

  11. == 与 equals的区别
    ==用于基本数据类型的对象时比较的是值,用于引用数据类型的对象时比较的是地址。

    equals只能用于引用数据类型,比较两个对象是否相等。equals 默认情况下是引用比较,只是很多类重写了 equals 方法,
    比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

  12. 创建对象有几种方式?
    new、clone、反射、反序列化

  13. System.out.println(Math.round(-3.5));
    结果为-3,
    -3.5+0.5的结果向下取整

  14. 常量属性的赋值方式:
    常量的定义可以在定义时直接赋值 可以在构造方法中赋值
    final关键字修饰 命名规则: 都为大写 字母中间用下划线隔开 例如 PASS_WORD;

  15. Java 中操作字符串都有哪些类?它们之间有什么区别?
    操作字符串的类有:String、StringBuffer、StringBuilder。
    String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

    StringBuffer 和 StringBuilder 最大的区别在于:StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

  16. 下面的代码将创建几个字符串对象?
    String s1 = new String(“Hello”); 2 堆里面一个 常量池里一个
    String s2 = new String(“Hello”);1 堆里面一个 常量池已经存在 无需重新创建
    3个,堆里2个,常量池1个

  17. 在java中,String s=new String(“xyz”);创建了几个对象?(B)
    A 1个 B 1个或2个 C 2个 D 以上都不对
    堆里面一个 常量池可能存在 所有选择1个或者2个

  18. 下面的代码输出什么?
    String s1 = new String(“abc”);
    String s2 = new String(“abc”);
    System.out.println(s1 == s2); false,地址不同
    System.out.println(s1.equals(s2));true,值相同

  19. 下面的代码输出什么?
    String s1= “abc”;
    String s2= “abc”;
    String s3 = new String(“abc”);
    String s4 = new String(“abc”);
    System.out.println("s3 == s4 : "+( s3 == s4)); false 在堆里 地址不同
    System.out.println("s3.equals(s4) : "+(s3.equals(s4))); true
    System.out.println("s1 == s3 : "+(s1 == s3)); false 一个在堆 一个在常量池 地址不同
    System.out.println("s1.equals(s3) : "+(s1.equals(s3))); true
    System.out.println(s1==s2); true 指向常量池的同一个地址

  20. 下面的代码输入什么?
    String s1 = “abc”;
    String s2 = new String(“abc”);
    s2.intern();
    System.out.println(s1 ==s2); false
    如果s2=s2.intern();为true
    true,编译时合为abcd

  21. 下面的代码输出什么?
    String str2 = “ab”;
    String str3 = “cd”;
    String str4 = str2+str3;
    String str5 = “abcd”;
    System.out.println("str4 = str5 : " + (str4==str5));
    false,str2和str3都指向堆里,无法识别为常量

  22. 下面的代码输出什么?
    final String str2 = “ab”;
    final String str3 = “cd”;
    String str4 = str2+str3;
    String str5 = “abcd”;
    System.out.println("str4 = str5 : " + (str4==str5));
    true,final定义为常量属性,str2和str2指向常量池,因此str4也为常量

  23. 下面的代码输入什么?
    String str6 = “b”;
    String str7 = “a” + str6;
    String str67 = “ab”;
    System.out.println("str7 = str67 : "+ (str7 == str67));false

  24. 下面的代码输入什么?
    final String str8 = “b”;
    String str9 = “a” + str8;
    String str89 = “ab”;
    System.out.println("str9 = str89 : "+ (str9 == str89));true

  25. String s1=”Hello”;
    String s2=”hello”;
    String s3=s1.toLowerCase();
    String s4=s2.toLowerCase();
    下面选项结果为true的是:C
    A.S1 == s3
    B.S2 == s3
    C.S2 == s4
    D.S3 == s4
    s2都是小写的 所有直接返回常量池里的hello

  26. Math.round(5.5)、Math.round(-5.5)分别输出多少?
    Integer i1 = 1 ;
    Integer i2 = 1 ;
    Integer i3 = 128 ;
    Integer i4 = 128 ;
    System.out.println(i1 == i2); //true
    System.out.println(i3 == i4);//false
    Integer存储范围(-128,127),超出则开辟新的空间

  27. ArrayList元素用循环全部删除。

List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");

for(int i=list.size()-1;i>=0;i--){
	list.remove(list.size()-1);
}
  1. 说下java中的集合?
    java集合有两大类:List和Set,他们都实现了Collection接口。List包括ArrayList、Vector和LinkedList;Set包括HashSet和TreeSet。

  2. ArrayList跟Vector的区别?(自学Vector,用法跟Arraylist类似)
    二者都有一个初始容量大小,采用线性连续存储空间;当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样ArrayList就有利于节约内存空间

  3. List Set Map的区别?
    List接口:List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,允许有相同的元素。

    Set接口:Set是一种不包含重复的元素的Collection,存放的元素是无序的。

    Map接口:

  4. 说下HashTable HashMap的区别?

  5. HashMap(HashSet)用来装学生,人数在37-43人左右,请问如何初始化HashMap数量达到性能最优?

  6. 重写equals是否需要重写hashcode? 重写hashcode是否需要重写equals?

  7. 说下数组跟链表的区别?

  8. throw跟throws区别?

  9. 堆和栈的区别:
    栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

    堆内存:存储的是数组和对象(其实数组就是对象), 凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

  10. java中可以多继吗?
    不可以 java是单继承机制

  11. 重写和重载的区别
    重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。

    重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用 super 关键字。

你可能感兴趣的:(Java面试题归纳)