作为一个小白,整理一下java面试题,之后还会有框架部分和高级部分,大神请自动飘过,有错误请及时指正,谢谢!

更多开发技术请访问 https://www.zhaochao.top

 

1. 常用词汇

JVM Java Virtual Machine Java虚拟机

GC Garbage Collection 垃圾回收

JDK Java Development Kit Java开发工具包 JRE+工具

JRE Java Runtime Environment Java运行环境 JVM+类库

SDK Software Development Kit 软件开发工具包

AJAX Asynchronous JavaScript And XML 异步JavaScript及XML

XML eXtensible Markup Language 可扩展标记语言

 

2. 数据类型

基本数据类型:4类8种;引用数据类型:类,接口,数组。

A: 整数 占用字节数

byte 1

short 2

int 4

long 8

B:浮点数

float 4

double 8

C:字符

char 2

D:布尔

boolean 1

面试拓展

(1)字符参与运算

是查找ASCII里面的值

'a' 97

'A' 65

'0' 48

System.out.println('a'); // 97

System.out.println('a' + 1); // 98

(2)字符串参与运算

这里其实是字符串的连接

System.out.println("hello"+'a'+1); // helloa1

System.out.println('a'+1+"hello"); // 98hello

System.out.println("5+5="+5+5); // 5+5=55

System.out.println(5+5+"=5+5"); // 10=5+5

 

3. 交换两个数据的三种方式:

(1)中间量

int c = a;

a = b;

b = c;

(2)位异或运算

交换两个数据的最高效方式:

a = a ^ b;

b = a ^ b; // a ^ b ^ b = a

a = a ^ b; // a ^ b ^ a = b

(3)用变量相加的方法

a = a + b;

b = a - b;

a = a - b;

(4)最简单

b = ( a + b ) - ( a = b );

 

4. while() 和 do ... while()的区别:

两者都是循环作用,前者只有满足括号中条件才会执行,后者不论是否满足条件都至少会执行一次。

 

5. 方法重载和方法重写(overload和override)

方法重载:在同一个类中,方法名相同,参数列表不同的现象,同名不同参,与返回值无关;

方法重写:子类中出现与父类方法声明相同的现象,不可以改变返回值类型。

 

6. this和super的区别

this代表当前类中的对象引用;super代表父类存储空间的表识,可以理解为对父类的引用,可以通过super访问父类成员。

 

7. Get和Post的区别

(1)get是从服务器上获取数据,post是向服务器传送数据,

       (2)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。

       (3)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

       (4)在进行文件上传时只能使用post而不能是get。

 

8. Java多态的具体体现

面向对象编程有四个特征:抽象,封装,继承,多态。

多态有四种体现形式:

(1)接口和接口的继承。

(2)类和类的继承。

(3)重载。

(4)重写。

其中重载和重写为核心。

 

9. StringBuffer 、StringBuilder 和 String 区别

String 字符串常量   不可变  使用字符串拼接时是不同的2个空间

StringBuffer 字符串变量   可变   线程安全  字符串拼接直接在字符串后追加

StringBuilder 字符串变量   可变   非线程安全  字符串拼接直接在字符串后追加

(1)StringBuilder执行效率高于StringBuffer高于String.

(2)String是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,        StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方法,在原来的基础上进行追加,所以性能比String要高,又因为StringBuffer是线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于StringBuffer.

(3)对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder.

 

10. HashTable与HashMap的区别

Map是映射接口,通常也算作集合,但那时Map不属于Collection

Map以键值对形式储存元素,实现类有HashMap、TreeMap和LinkedHashMap等元素不可以重复、value可以重复

HashMap线程不安全,效率高,允许key值为null,HashTable线程安全,效率低,不允许key值位null

 

11. 九大隐式对象 

输入/输出对象:  request   response   out

作用域通信对象: session  application  pageContext

Servlet 对象:   page   config

错误对象:      exception

 

九大隐式对象中四个作用域从大到小:appliaction>session>request>pageContext

application:全局作用范围,整个应用程序共享,生命周期为:应用程序启动到停止。

session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。

request:请求作用域,就是客户端的一次请求。

page:一个JSP页面。

以上作用范围越来越小, request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward)。

 

12. Forword(请求转发)与Redirect(重定向)  

(1)从数据共享上

Forword是一个请求的延续,可以共享request的数据

Redirect开启一个新的请求,不可以共享request的数据

(2)从地址栏

Forword转发地址栏不发生变化

Redirect转发地址栏发生变化

 

13. JavaScript 和 Java 的区别

(1)Java代码必须编译才能执行(编译语言),而JavaScript不需编译(脚本语言),只需由浏览器解释执行;

(2)JavaScript使用的是松散的数据类型(弱类型),而Java使用的是严谨的数据类型。

(3)Java和JavaScript虽然都可以在服务器与客户端执行,但Java多运行于服务器,而JavaScript多用于客户端;

 

14. 线程和进程的区别 

(1)线程(Thread)与进程(Process)

进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应的应用程序。不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间。

(2)一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。

(3)实现线程的两种方式:继承Thread类,实现Runable接口(第三种,实现Callable接口重写call方法再通过线程池创建)

 

15. 解析xml的几种技术

dom4j sax jaxb jdom dom

dom4j 与 sax 之间的对比:

(1)dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,有可能出现内存溢出

(2)sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml

         也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性

         所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j

 

16. final、finally 和 finalize 三者区别

(1)final是一个修饰符:

当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值

当final修饰的变量为静态变量(即由static修饰)时,必须在声明这个变量的时候给它赋值

当final修饰方法时,该方法不能被重写,可以被重载

当final修饰类时,该类不能被继承

final不能修饰抽象类,因为抽象类中会有需要子类实现的抽象方法

final不能修饰接口,因为接口中有需要其实现类来实现的方法

(2)finally:

finally只能与try/catch语句结合使用,finally语句块中的语句一定会执行,并且会在return,

continue,break关键字之前执行

(3)finalize:

finalize是一个方法,属于java.lang.Object类,finalize()方法是GC(garbage collector垃圾回收)运行机制的一部分,finalize()方法是在GC清理它所从属的对象时被调用的

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

 

17. JavaSE、JavaEE 和 JavME 的区别

Java SE=Java Standard Edition = j2se = java 标准版

Java EE=Java Enterprise Edition = j2ee = java 企业版

Java ME=Java Mobile Edition = j2me = java 移动版

 

18. switch默认接受的几种数据类型

short, int, byte, char 之后增加了 String

 

19. 抽象类与接口的区别

(1)一个类只能进行单继承,但可以实现多个接口。

(2)有抽象方法的类一定是抽象类,但是抽象类里面不一定有抽象方法;

(3)接口里面所有的方法的默认修饰符为public abstract,接口里的成员变量默认的修饰符为pulbic static final,Java8之前,接口中的所有方法都不能有方法体。

各种(类与类、接口与接口、类与接口)关系:

接口和接口      继承

接口和抽象类    抽象类实现接口

类和抽象类      类继承抽象类

类和类          继承

 

20. 修饰符的作用范围

private  default  protected public

同一个类中      可以    可以     可以      可以

同一个包的类中          可以      可以     可以

不同包的子类中                  可以       可以

不同包的类中                                  可以

 

21. servlet的生命周期

先实例化一个servlet,再初始化,然后调用服务,之后销毁和垃圾回收。

 

22. Preparedstatement和statement的区别    

     Prepared statement是预编译的,而statement不是,在每次执行sql语句的增删改时,如果是一条数据两者没差距,但如果数据量大于1,那么每次执行sql语句statement都要重新编译一次,而Prepared statement不用,Prepared statement的运行效率大于statement;从代码的可维护性和可读性来说,虽然用Prepared statement来代替statement会使代码多出几行,但这样的代码无论从可读性还是可维护性来说,都比直接使用statement的代码高很多档次;最重要的一点,从安全角度来说,使用Prepared statement可以大大提高程序的安全性因为Prepared statement是用‘?’传参,可以防止sql注入,具有安全性,而statement用的是‘+’字符串拼接,安全性较低。    

 

23. String a = "abc" 和 String a = new String("abc") 有什么区别?

前者:先查看常量池里面是否存在“abc这个对象,存在就直接指向它,不存在就会创建;

后者:无论对象是否存在,都会先在栈内存里面创建String a,之后在堆内存里面创建出新

的实例,并初始化为“abc”;

也就是说,前者只会创建一个对象,后者则会创建两个对象。

 

24. short t = 1; t = t + 1; 有什么错吗?

类型不一致,此处必须强转为short类型,因为t是short类型,1是int类型,相加之后的类型

为int 改为 t = (short) (t + 1); 或 t += 1;因为此句代码表示在原有变量值的基础上加上1,这

个加上去的1仍然和原变量同种类型。

 

25. 在System.out.println()里面,System, out, println分别是什么?

System是系统提供的预定义的final类,

out是一个PrintStream对象,

println是out对象里面一个重载的方法。

 

26. ArrayList、Vector 和 LinkedList 的区别:

List是列表,是Collection的子接口,实现内类有ArrayList、Vector、LinkedList等,元素有

序可重复

ArrayList 的底层结构是数组,特点是:查询快、增删慢、线程不安全、效率高

Vector 的底层结构是数组,特点是:查询快、增删慢、使用了synchronized方法(线程安

全)、性能(效率)比 ArrayList 低

LinkedList 的底层结构是链表,特点是:查询慢、增删快、线程安全,效率低

LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前

一个元素,一个指向后一个元素。

 

27. Enumeration(列举)接口和Iterator(迭代器)接口的区别有哪些?

Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比

Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,

Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

 

28. Comparable和Comparator接口是干什么的?列出它们的区别。

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象

排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给

两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。

equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入

参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法

才返回true。

 

29. Collection 和 Collections的区别:

  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

  Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排

序、线程安全化等操作。

 

30. Java类中变量和代码块的加载时顺序为:

1> 静态变量

2> 静态代码块

3> 成员属性

4> 成员代码块

5> 构造代码块

 

31. Java创建对象有几种方式?

1> 第种常用方式 CreateObj s1 = new CreateObj(); System.out.println(s1); 2> 第种方式 静态方式 java.lang.InstantiationException CreateObj s2 = (CreateObj) Class.forName( "com.newland.commons.collectionutil.CreateObj").newInstance(); System.out.println(s2); 3> 第种方式 用对象流来实现 前提是对象必须实现 Serializable ObjectOutputStream objectOutputStream = new ObjectOutputStream( new FileOutputStream(filename)); objectOutputStream.writeObject(s2); ObjectInput input=new ObjectInputStream(new FileInputStream(filename)); CreateObj s3 = (CreateObj) input.readObject(); System.out.println(s3); 4> 第种 clone 必须 实现Cloneable接口 否则抛出CloneNotSupportedException CreateObj obj=new CreateObj(); CreateObj s4= (CreateObj) obj.clone(); System.out.println(s4);

 

32. Java中float和double分别占多少位?哪个存储的数据最大?

32、64、float (具体原因请百度)

 

33. Sleep和wait的区别:

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

 

34. HashMap的工作原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

 

35. Session和cookie的异同

    1. cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的

会话方式

    1. cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器

端,Session的安全性较高。

 

36. 会话跟踪的四种方式:

a. 隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话

应用。

b. URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为

名字/值对。 见http://blog.csdn.net/xh16319/article/details/8464055

c. Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-

Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie

值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技

术比较,Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它

仍可以保留其值。 见:http://blog.csdn.net/xh16319/article/details/8464319

d. Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一

个会话

 

37. static关键字的用法

a. 静态方法

通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法

声明为static的方法有以下几条限制:

1> 它们仅能调用其他的static 方法。

2> 它们只能访问static数据。

3> 它们不能以任何方式引用this 或super。

b. 静态变量声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间

c. 静态类通常一个普通类不允许声明为静态的,只有一个内部类才可以。

 

 

更多技术资源请访问 http://www.zhaochao.top

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐