Java基础面试题(60道)

Java基础面试题

1,javac java命令

javac执行编译命令: javac Test.java 将.java文件编译成.class字节码文件
java执行运行命令:java Test 运行.class文件

2,int i=20000000000000;报错吗?为什么?

会报错,因为int取值范围是-2147483648到+2147483647。

3,B(browser)/S(server) 跟C(client)/S(server)架构区别是什么?

B/S结构即浏览器和服务器结构 特点是体验要求一般,加载资源少;升级方便、无需安装、维护便利、跨平台。

C/S结构即客户端和服务器结构 特点是体验要求极高,加载资源多;升级不方便、安装不方便、维护不方便、不跨平台。

4,整数有哪几种类型?

byte(1字节), short(2字节), int(4字节), long(8字节)

5,float f=3.14 ; 报错吗?为什么?

会报错,3.14被默认为double类型,这里需要加上f或者加上float强制转换。

6,3.14是什么类型?

double类型

7,java中有哪些基本数据类型?

整型:byte 、short 、int 、long
浮点型:float 、 double
字符型:char
布尔型:Boolean

8,下面的代码输出什么?

int a = 5 ;
int b = a++ + ++a +3 + a++ ;
System.out.println(a);
System.out.println(b); 

因为++在后先计算后自增,所以前面为计算时的值,括号为此时实际值 5(6)+7+3+7(8) ,a=8, b=22

9,short s = 1 ;s = s + 1 ;有错吗?为什么?short s = 1 ;s += 1 ;有错吗?为什么?

前者错误。因为1是int型,s+1的结果也为int型,需要强制类型转换才能赋值给short型。
后者正确。因为s+=1相当于 s = (short)(s + 1),其中有隐含的强制类型转换。

10, System.out.println(5>3?9:3.1);结果会打印出什么?

9.0。因为它总体返回值是double类型,所以9被转型了。

11,final的用法?

1.当修饰变量的时候表示常量
2.当修饰方法的时候表示这个方法不能被重写
3.当修饰类的时候表示不能被继承

12,long a=1L,switch(a) 结果打印什么?

会报错,因为switch()中不能是long 类型。

13,给数组排序

  • 冒泡排序
public static void main(String[] args) {
        int[] arr = {55,44,13,74,99,86};
        //外层循环表示比较的轮次
        for (int i = 0; i < arr.length-1; i++) {
        	//内层循环控制每轮的比较次数
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j]>arr[j+1]) {//前后两数相比,交换
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int a:arr) {
            System.out.print(a+"\t");
        }
    }

在这里插入图片描述

  • 选择排序
public static void main(String[] args) {
        int[] arr = {10,0,8,6,1,3,5,9,-3};
        for (int i = 0; i < arr.length-1; i++) {//比较轮次len-1
            int index = i;//记录每一轮循环中最小数的下标
            for (int j = i; j < arr.length; j++) {//最小数下标位置范围
                if (arr[j]<arr[index]) {
                    index = j;
                }
            }
            //交换:一开始假设最小的数和实际最小的数,进行交换
            int t = arr[i];
            arr[i] = arr[index];
            arr[index] = t;
        }
        for (int a:arr) {
            System.out.print(a+"\t");
        }
    }

在这里插入图片描述

14,堆跟栈的区别

1.申请方式的不同。栈由系统自动分配,而堆是人为申请开辟的;
2.申请大小的不同。栈获得的空间较小,而堆获得的空间较大;
3.申请效率的不同。栈由系统自动分配,速度较快,而堆一般速度比较慢;
4.储存内容的不同。栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进入栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用第一个字节存放堆的大小,堆中的具体内容是人为安排
5.底层不同,栈是连续的空间,而堆是不连续的空间

15,java中可以多继承吗?

java中类不支持多继承,只能单继承,但是可以多实现。
java中接口之间支持多继承,接口可以继承多个继承。

16,重写跟重载的区别?

1.所处位置不同:重载在同类中;重写在父子类中。
2.定义方式不同:重载方法名相同,参数列表不同 ;重写方法名和参数列表都相同。
3.调用方式不同:重载使用相同对象以不同参数调用;重写用不同对象以相同参数调用。
4.多态时机不同:重载时编译时多态;重写是运行时多态。

17,常量属性的赋值方式?

第一种:使用一个static静态代码块来指定,然后在静态代码块中,我们去动态读取外部的一个Properties文件的值。
第二种:我们可以配置Java的运行时配置,来指定一个-Dname=value的参数,这样也可以在类内部动态的接受到运行时指定的一个参数。
第三种:我们还可以读的到系统配置的PATH或者CLASSPATH里面的值,同理,我们也可以配置自己的环境变量,然后在程序中一样也能读到这些配置的环境变量。

18,java的三大特性?

封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。
继承:子类继承父类的属性和方法,并能扩展新的能力。
多态:父类接受子类的对象,可以调用子类重写父类的方法。

19,说几个访问修饰符的区别?

修饰符\作用域同一个类中同一个包中子类中任何地方
private可以不可以不可以不可以
默认修饰符可以可以不可以不可以
protected可以可以可以不可以
public可以可以可以可以

Public:对外公开
Protected:受保护的,同一个包的子类可以访问。
默认:同一个包中可以访问
Private:只在当前类有效

20,请说出5个运行时异常?

异常描述
java.lang.NullPointerException空指针异常:对象(引用)为空,并且调用相应方法
java.lang.ClassNotFoundException找不到指定类
java.lang.ArrayIndexOutOfBoundsException数组下标越界
java.lang.NumberFormatException数字格式化异常
java.lang.ArithmeticException数学运算异常
java.lang.ClassCastException类型转换异常,向下转型中经常发生
java.text.ParseException时间格式化异常,SimpleDateFormart中经常发生
java.util.InputMismatchException输入类型不匹配异常

21.1,父类代码块、父类静态代码块、父类构造方法、子类代码块、子类静态代码块、子类构造方法,执行顺序如何?

执行顺序:父类静态代码块–>子类静态代码块–>父类代码块–>子类代码块–>父类构造方法->子类构造方法

21.2,请说出5个常见的类?说出5个常见的包?

类:Object、Class、String、System、File、List、HashMap、Date

包:java.lang ,java.io, java.util, java.sql,javax.servlet

22,final、finally、finalize区别?

final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。

finally:异常处理语句结构的一部分,表示总是执行。

finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

23,==跟equals的区别?

==是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。

equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。

24,ArrayList元素用循环全部删除。

for (int i = list.size() - 1; i >= 0; i--) {
	list.remove(i);
}	

25,浅谈一下String, StringBuffer,StringBuilder的区别?

在这里插入图片描述

26,下面的代码将创建几个字符串对象?

String s1 = new String("Hello");  
String s2 = new String("Hello");

3个

27,在java中,String s=new String(“xyz”);创建了几个对象?(B )

A 1个; B 1个或2个; C 2个; D 以上都不对

28,下面的代码输出什么?

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
 //true

29,下面的代码输出什么?

String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 ==s2); 
//false

30,下面的代码输出什么?

30、下面的代码输出什么?
String s1= "abc";
String s2= "abc";
String s3 = new String("abc");  
String s4 = new String("abc"); 
System.out.println("s3 == s4 : "+(s3==s4)); 
System.out.println("s3.equals(s4) : "+(s3.equals(s4)));  
System.out.println("s1 == s3 : "+(s1==s3));  
System.out.println("s1.equals(s3) : "+(s1.equals(s3))); 
System.out.println(s1==s2);  
//true

31,下面的代码输出什么?

String str1 = "ab" + "cd"; 
String str11 = "abcd";   
System.out.println("str1 = str11 : "+ (str1 == str11));  
//true

32,下面的代码输出什么?

String str2 = "ab"; 
String str3 = "cd";
String str4 = str2+str3;  
String str5 = "abcd"; 
System.out.println("str4 = str5 : " + (str4==str5));
//false

33,下面的代码输出什么?

final String str2 = "ab"; 
final String str3 = "cd";
String str4 = str2+str3;  
String str5 = "abcd"; 
System.out.println("str4 = str5 : " + (str4==str5)); 
//true

34,下面的代码输出什么?

String str6 = "b";  
String str7 = "a" + str6;  
String str67 = "ab";  
System.out.println("str7 = str67 : "+ (str7 == str67));  
//false

35,下面的代码输出什么?

final String str8 = "b";  
String str9 = "a" + str8;  
String str89 = "ab";  
System.out.println("str9 = str89 : "+ (str9 == str89));  
//true	

36,下面选项结果为true的是:(C)

String s1=”Hello”; 
String s2=”hello”; 
String s3=s1.toLowerCase(); 
String s4=s2.toLowerCase();

A.S1 == S3
B.S2 == S3
C.S2 == S4
D.S3 == S4

37.1,Math.round(5.5)、Math.round(-5.5)分别输出多少?

6,-5

37.2,下面的代码输出什么?

Integer i1 = 1 ;
Integer i2 = 1 ;
Integer i3 = 128 ;
Integer i4 = 128 ;		
System.out.println(i1 == i2);  //true    
System.out.println(i3 == i4);  //false  

38,说下java中的集合?

在这里插入图片描述

  • List、Set、Map是集合体系中最主要的三个接口。

  • 其中List和Set继承自Collection接口。

  • List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。

  • Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。

  • Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是三个主要的实现类。

39,ArrayList跟Vector的区别?

  • 线程安全:Vector线程安全,ArrayList线程不安全。
  • 扩容方式:ArrayList以1.5倍的方式在扩容。Vector 当扩容容量增量大于0时、新数组长度为原数组长度+扩容容量增量、否则新数组长度为原数组长度的2倍。
  • 效率:如果不考虑到线程的安全因素,一般用Arraylist效率比较高。
  • 内存空间:当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

40,List Set Map的区别?

List:

  • 可以允许重复的对象
  • 可以插入多个null元素。
  • 是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序

Set:

  • 不允许重复对象
  • 无序容器,你无法保证每个元素的存储顺序
  • 只允许一个 null 元素

Map:

  • Map不是collection的子接口或者实现类。Map是一个接口。
  • Map的每个 Entry 都持有两个对象,也就是一个键一个值,Map可能会持有相同的值对象但键对象必须是唯一的。
  • Map里你可以拥有随意个 null 值但最多只能有一个 null 键。

41,说下HashTable HashMap的区别?

1.继承的父类不同
2.HashMap线程不安全,HashTable线程安全
3.包含的contains方法不同
4.Hashmap是允许key和value为null值的;HashTable键值对都不能为空

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

HashMap默认容量是2的幂次方。故初始容量为64性能最优

43,重写equals是否需要重写hashcode? 重写hashcode是否需要重写equals?

前者不需要,后者需要

44,说下数组跟链表的区别?

(1)数组的元素个数是固定的,而组成链表的结点个数可按需要增减;
(2)数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:
(3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。
(4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。
(5)对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。
与数组的区别 从增删改查操作的效率上来谈
增删: 链表的效率更高
改查: 数组的效率更高

45,throw跟throws区别?

throw 是在方法体中主动抛出一个异常
throws 把异常往上抛 谁调用谁处理

46,你知道哪些JDK8新特性?

Lambda表达式
函数式接口
*方法引用和构造器调用
Stream API
接口中的默认方法和静态方法
新时间日期API

47,where跟having的区别?

Where是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。
Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

48,JS中 == 跟 === 有什么区别?

== 表示相等,值相等
=== 表示恒等,类型和值都要相等

49,请说下xml跟json的区别?

1、传输同样格式的数据,xml需要使用更多的字符进行描述,
2、流行的是基于json的数据传输。
3、xml的层次结构比json更清晰。

50,请说下3次握手跟4次挥手?

三次握手:
第一次握手:客户端发送第一个包,其中SYN标志位为1, ACK=0,发送顺序号sequence=X(随机int)。客户端进入SYN发送状态,等待服务器确认。
第二次握手:服务器收到这个包后发送第二个包,其中包SYN、ACK标志位为1,发送顺序号seq=Y(随机int),接收顺序号ACK=X+1,此时服务器进入SYN接收状态。
第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=1,接收顺序号ACK = Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。

四次挥手:
第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq为X。
第二次挥手:被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq为Z,接收顺序号ack为X+1。
第三次挥手:被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq为Y,接收顺序号ack为X。
第四次挥手:主动关闭方发送第四个包,其中发送顺序号为X,接收顺序号为Y。至此,完成四次挥手。

51,断开连接的时候客户端为什么需要等待2MSL时间?

1.为了保证客户端发送的最后一个ACK报文段能够达到服务器。
2.防止已失效的连接请求报文段出现在本连接中。

52,servlet是单线程还是多线程?是单例的吗?

servlet单实例多线程

53,请说下servlet的生命周期?

  • 加载跟实例化Servlet

    Servlet 通过调用 构造 方法进行实例化,构造方法必须为无参构造方法。默认是在第一次被访问的时候构造对象。也可以在web.xml中通过N配置Servlet被创建的时机。(N为一个整数表示优先级,>=0表示在web服务器启动的时候创建,<0表示第一次访问时创建)

  • Servlet 实例创建完毕后立马通过调用 init () 方法进行初始化,如果初始化失败抛出ServletException,Servlet对象将会被垃圾回收器回收。init初始化操作只会执行一次。初始化时机紧跟Servlet创建。

  • Servlet 调用 service() 方法来处理客户端的请求。

  • Servlet 通过调用 destroy() 方法终止(结束)。

  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

54,get请求与post的请求的区别是什么?

get

  • 参数拼接在url,不安全
  • 只能是字符串类型
  • 大小有限制2kb,速度快

post

  • 参数封装到请求体,安全
  • 还可以是非字符串类型比如文件
  • 理论上大小没限制,速度慢

55,请求转发跟请求重定向的区别是什么?

  • 转发在服务器端完成的;重定向是在客户端完成的
  • 转发的速度快;重定向速度慢
  • 转发的是同一次请求;重定向是两次不同请求
  • 转发不会执行转发后的代码;重定向会执行重定向之后的代码
  • 转发地址栏没有变化;重定向地址栏有变化
  • 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

56,JSP是服务器端页面还是客户端页面?

服务器端页面

57,jsp的本质是一个servlet

58,静态包含(指令)跟动态包含(动作)有什么区别?

  • 原理不同:
    ​ 静态包含:先合并再翻译
    ​ 动态包含:先翻译在包含

  • 最终编译成java文件的数目不同。
    静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。

  • 静态包含在两个文件中不能有相同的变量,动态包含允许

  • 语法不同:
    静态包含语法: <%@inclue file=“被包含的页面”%>
    动态包含语法: <jsp:include page=“被包含的页面”>

  • 参数传递不同 :
    静态包含不能向被包含页面传递参数
    动态包含可以使用jsp:param标签向被包含页面传递参数

59,JSP的9大内置对象?

request 请求对象
response 响应对象
pageContext 页面上下文对象
session 会话对象
application 应用程序对象
out 输出对象
config 配置对象
page 页面对象
exception 例外对象

60,会话跟踪的几种技术?

URL重写
隐藏表单域
cookie
sesion

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页