Java 常见面试题(一)

1,javac java命令

javac是将java文件编译成class文件,
java是执行你编译的class文件。

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

会报错!
因为:int max=2147483647;int min=-2147483648

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

B/S:浏览器与服务器应用。体验要求一般,加载资源少;升级方便、无需安装、维护便利、跨平台。
C/S:客户端和服务器应用。体验要求极高,加载资源多;升级不方便、安装不方便、维护不方便、不跨平台。

4,整数有哪几种类型?

 byte,short,int,long

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

小数默认是double型
也就是说上面的3.14是double型
double长度是比float长
就好像你long不能直接转换成int
必须强制转换
以上有两种办法可以解决
1是float f =(float)3.14
2是float f=3.14f

6, 3.14是什么类型?

double类型

7,java中有哪些基本数据类型?(String不是基本数据类型)

          整型:byte 、short 、int 、long

          浮点型:float 、 double

          字符型:char

          布尔型:Boolean

          String是引用类型

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

a=8 ;b =22

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

对于 short s = 1; s = s + 1; 由于1是int类型,因此s + 1运算结果也是int型,需要强制类型转换才能赋值给short型。而short s = 1; s += 1; 可以正确编译,因为 s += 1; 相当于 s = (short)(s + 1); 其中有隐含的强制类型转换。

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

9.0

11,final的用法?

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

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

1

13,给数组排序

sort

14,堆跟栈的区别

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

15,java中可以多继承吗?

1.java中类不支持多继承,只能单继承,但是可以多实现;

2.java 中接口之间支持多继承;

16,重写跟重载的区别?

重写:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

重载:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名不同参的两个或两个以上的方法
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准

面试时,问:重载(Overload)和重写(Override)的区别?

答:方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

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

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

18,java的三大特性?

封装

封装指的是属性私有化(一般为private),提供setter和getter方法来访问属性。在构造方法中使用set方法进行合理值的判断
封装目的:增强安全性和简化编程,有效的保护了属性,降低了非法篡改和赋值的风险
继承

本质:调用子类构造方法时会自动先调用父类构造方法,也就是说:创建子类对象,内存中有子类对象和父类对象extends关键字起的作用
继承目的:代码复用。

多态

多态可以分为两种:设计时多态和运行时多态。 设计时多态:即重载,是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
运行时多态:即重写,是指Java运行根据调用该方法的类型决定调用哪个方法。

多态目的:增加代码的灵活度。

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

访问权限 类 包 子类 其他包
public ∨ ∨ ∨ ∨ (对任何人都是可用的)
protect ∨ ∨ ∨ ×    (继承的类可以访问以及和private一样的权限)
default ∨ ∨ × ×    (包访问权限,即在整个包内均可被访问)
private ∨ × × ×    (除类型创建者和类型的内部方法之外的任何人都不能访问的元素)

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

1)java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
2)java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
3)java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
4)java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
5)java.lang.IllegalArgumentException 方法传递参数错误。
6)java.lang.ClassCastException 数据类型转换异常。

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

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

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

常用的类: BufferedReader ,BufferedWriter , FileReader, FileWirter String ,Integer,java.util.Date,System,Class,List,HashMap

常用的包:java.lang java.io java.util
java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate

22,final、finally、finalize区别?

1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
2)finally:异常处理语句结构的一部分,表示总是执行。
3)finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用.

23,==跟equals的区别?

equals和== 最大的区别是一个是方法一个是运算符。
==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
equals():用来比较方法两个对象的内容是否相等。
注意:equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。

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

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

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

在这里插入图片描述

1)、可变不可变
String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。
StringBuffer:在修改时会改变对象自身,每次操作都是对StringBuffer对象本身进行修改,不是生成新的对象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。
(2)、线程是否安全
String:对象定义后不可变,线程安全。
StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据。
StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
(3)、共同点StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer会在方法上加synchronized关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

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);  //false
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、下面的代码输出什么?

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

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、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

37。Math.round(5.5)、Math.round(-5.5)分别输出多少?

6 ;5

38。

	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中的集合?

在这里插入图片描述

39,ArrayList跟Vector的区别?

1.vector 是线程同步的,所以它也是线程安全的,而 arraylist 是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用 arraylist 效率比较高。
2. 如果集合中的元素的数目大于目前集合数组的长度时, vector 增长率为目前数组长度的 100%, 而 arraylist 增长率为目前数组长度的 50%. 如果在集合中使用数据量比较大的数据,用 vector 有一定的优势。
3.如果查找一个指定位置的数据, vector 和 arraylist 使用的时间是相同的,都是 0(1), 这个时候使用 vector 和 arraylist 都可以。而如果移动一个指定位置的数据花费的时间为 0(n-i)n 为总长度,这个时候就应该考虑到使用 linklist, 因为它移动一个指定位置的数据所花费的时间为 0(1), 而查询一个指定位置的数据时花费的时间为 0(i) 。

40,List Set Map的区别?

结构特点:
1)List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;
2)List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,
3)Set中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的hashcode决定,位置是固定的(Set集合根据hashcode来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)

区别:
1)list集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
2) Map中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
3)Set集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如TreeSet类,可以按照默认顺序,也可以通过实现Java.util.Comparator接口来自定义排序方式

41,说下HashTable HashMap的区别?

HashMap是线程不安全的,HashMap是一个接口,是Map的一个子接口,是将键映射到值得对象,不允许键值重复, 允许空键和空值;由于非线程安 全,HashMap的效率要较HashTable的效率高一些.
HashTable 是线程安全的一个集合,不允许null值作为一个key值或者Value值;
HashTable是sychronize,多个线程访问时不需要自己为它的方法实现同步,而HashMap在被多个线程访问的时候需要自己为它的方法实现同步;

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

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

都需要
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)

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

数组静态分配内存,链表动态分配内存;
数组在内存中连续,链表不连续;
数组元素在栈区,链表元素在堆区;
数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。

45,throw跟throws区别?

throw:
1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。2)throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:
1)throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
2)throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
3)throws表示出现异常的一种可能性,并不一定会发生这种异常。

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

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

47,where跟having的区别?

用的地方不一样:
where可以用于select、update、delete和insert into values(select * from table where …)语句中。 having只能用于select语句中
执行的顺序不一样
where的搜索条件是在执行语句进行分组之前应用
having的搜索条件是在分组条件后执行的
即如果where和having一起用时,where会先执行,having后执行

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

"==”与”===”是不同的,一个是判断值是否相等
,一个是判断值及类型是否完全相等。

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

二者区别:
它们都是一种数据交换格式。
1,xml是重量级的,json是轻量级的。
2,xml在传输过程中比较占带宽,json占带宽少,易于压缩。
3,xml和json都用在项目交互下,xml多用于做配置文件,json用于数据交互。
4,json可用jackson,gson等方法解析,xml可用dom,sax,demo4j等方式解析。

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

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

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

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

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

从表面现像上面看GET和POST的区别:

  1. GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=zhagnsan&password=123456。POST把提交的数据则放置在是HTTP包的包体中。
  2. GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据。其实这样说是错误的,不准确的:
    “GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
    3.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上, 因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。
    Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",实质上,GET和POST只是发送机制不同,并不是一个取一个发!

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

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

57,jsp的本质是一个servlet

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

59,JSP的9大内置对象?

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值