博主整理JAVA一般面试题目——第一套(20题)

DBC 2.5K 0

1、装箱、拆箱操作发生在: ()

类与对象之间

对象与对象之间

引用类型与值类型之间

引用类型与引用类型之间

温馨提示

通过 装箱 和 拆箱 操作,能够在值类型和引用类型中架起一做桥梁。换言之,可以轻松的实现值类型与引用类型的互相转换,装箱和拆箱能够统一考察系统,任何类型的值最终都可以按照对象进行处理。
装箱——值类型转换为引用类型;拆箱——引用类型转换为值类型。

通俗的讲,就是基本数据类型和包装类之间的转换。如: int 类型和 Integer 类的转换
基本数据类型转化成包装类是装箱 (如: int --> Integer)。
包装类转化成基本数据类型就是拆箱 (如:Integer --> int)。
包装类就是引用类型,基本数据类型就是值类型。所以选C

2、执行完以下代码 int [ ] x = new int[10] ;后,以下哪项说明是正确的( )

x[9]为0

x[9]未定义

x[10]为0

x[0]为空

温馨提示

数组引用类型的变量的默认值为 null。当数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。
int型的默认值为0
博主整理JAVA一般面试题目——第一套(20题)插图

3、类A1和类A2在同一包中,类A2有个protected的方法testA2,类A1不是类A2的子类(或子类的子类),类A1可以访问类A2的方法testA2。( )

正确

错误

温馨提示

博主整理JAVA一般面试题目——第一套(20题)插图2

4、关于Java的抽象类、接口,以下描述错误的是?

抽象类不一定含有抽象方法,接口中的方法都是抽象方法

一个类只能继承一个抽象类,但可以实现多个接口;一个接口可以继承多个接口

抽象类和接口中的方法都没有方法体

抽象类可以含有私有成员变量,接口不含有私有成员变量

温馨提示

选择C。
A----------抽象类不一定含有抽象方法,接口中的方法都是抽象方法。
接口中的方法默认修饰符有public abstract。
B----------一个类只能继承一个一个抽象类,但可以实现多个接口;一个接口可以继承多个接口。
Java里类是单继承的,接口是可以多继承的,用关键字extends。
C----------抽象类和接口中的方法都没有方法体。
抽象类中的方法是可以有方法体的。JDK1.8之后,接口中的方法也可以有方法体,用default关键字修饰方法。
D----------抽象类可以含有私有成员变量,接口不含有私有成员变量。
接口中的成员变量都是public static final的,一般用作常量。

5、Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述正确的是()

ArrayList和LinkedList均实现了List接口

ArrayList的访问速度比LinkedList快

添加和删除元素时,ArrayList的表现更佳

HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值

温馨提示

可以直接背,具体原因看这篇文章: 立即前往

6、HashSet子类依靠()方法区分重复元素。

toString(),equals()

clone(),equals()

hashCode(),equals()

getClass(),clone()

温馨提示

HashSet的底层还是用HashMap来实现的。将Entry<K,V>的V都变成了同一个Object对象,public static final PRESENT = new Object()。
而HashMap的数据结构是数组+链表+红黑树。

调用K的hashCode方法,然后高低16位进行&运算。得到的hash值,与数组tab[](桶)的长度-1进行&运算,确定插入对象在哪一个桶上。然后调用对象的equals方法,形成链表。当链表长度大于8时,链表转红黑树。

7、下面有关JSP内置对象的描述,说法错误的是?

session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止

request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应

application对象:多个application对象实现了用户间数据的共享,可存放全局变量

response对象:response对象包含了响应客户请求的有关信息

温馨提示

application对象是共享的,多个用户共享一个,以此实现数据共享和通信
JSP内置对象和属性列举如下:
1.request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
4.out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

8、关于Float,下列说法错误的是()

Float是一个类

Float在java.lang包中

Float a=1.0是正确的赋值方法

Float a= new Float(1.0)是正确的赋值方法

温馨提示

1.Float是类,float不是类.
2.查看JDK源码就可以发现Byte,Character,Short,Integer,Long,Float,Double,Boolean都在java.lang包中.
3.Float正确复制方式是Float f=1.0f,若不加f会被识别成double型,double无法向float隐式转换.
4.Float a= new Float(1.0)是正确的赋值方法,但是在1.5及以上版本引入自动装箱拆箱后,会提示这是不必要的装箱的警告,通常直接使用Float f=1.0f.

9、ArrayList list = new ArrayList(20);中的list扩充几次

0

1

2

3

温馨提示

Arraylist默认数组大小是10,扩容后的大小是扩容前的1.5倍,最大值小于Integer 的最大值减8,如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容

10、给定以下JAVA代码,这段代码运行后输出的结果是()

public class Test
{  
    public static int aMethod(int i)throws Exception
    {
        try{
            return i/10;
        }
        catch (Exception ex)
        {
            throw new Exception("exception in a aMethod");
        }finally{
      System.out.printf("finally");
        }
} 
    public static void main(String[] args){
        try
        {
            aMethod(0);
        }
        catch (Exception ex)
        {
            System.out.printf("exception in main");
        }
        System.out.printf("finished");
    }
}

exception in main finished

finally finished

exception in main finally

finally exception in main finally

温馨提示

本题考的不仅仅是审题,而且是try......catch......finally块的关系,以及return与finally的执行关系。
具体执行过程:
1、先进入main函数,进入try块调用aMethod(0)方法;
2、执行aMethod()方法的try块,i/10可以正确执行,故并未抛出异常,catch块不执行,而需要执行finally(该块任何时候都要执行),故打印finally;
3、回到main函数,由于aMethod()调用成功,因此main函数的catch块同样不执行,顺序执行finally块,打印finished
因此,最终的输出结果就是:finally finished

哈哈,其实最主要的还是0是分子其实是不报错的,千万要注意看了,不要以为这个是常用的抛异常操作,直接秒选!!!

11、下面有关forward和redirect的描述,正确的是() ?

forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求

执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址

执行redirect时,服务器端告诉浏览器重新去请求地址

forward是内部重定向,redirect是外部重定向

redirect默认将产生301 Permanently moved的HTTP响应

温馨提示

1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说
forward:高.
redirect:低.

12、在Java中下面Class的声明哪些是错误的?

public abstract final class Test {
abstract void method();
}

public abstract class Test {
abstract final void method();
}

public abstract class Test {
abstract void method() {
}
}

public class Test {
final void method() {

}
}

温馨提示

A、final修饰的类为终态类,不能被继承,而 抽象类是必须被继承的才有其意义的,因此,final是不能用来修饰抽象类的。
B、 final修饰的方法为终态方法,不能被重写。而继承抽象类,必须重写其方法。
C、抽象方法是仅声明,并不做实现的方法。

我相信这里只有C选项会有点模糊,其实就是C选项多了大括号,似乎有方法的意思,你可以这样理解!

13、在Java语言中,下列关于字符集编码(Character set encoding)和国际化(i18n)的问题,哪些是正确的?

每个中文字符占用2个字节,每个英文字符占用1个字节

假设数据库中的字符是以GBK编码的,那么显示数据库数据的网页也必须是GBK编码的。

Java的char类型,通常以UTF-16 Big Endian的方式保存一个字符。

实现国际化应用常用的手段是利用ResourceBundle类

温馨提示

A 显然是错误的,Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。
B 也是不正确的,不同的编码之间是可以转换的,通常流程如下:
将字符串S以其自身编码方式分解为字节数组,再将字节数组以你想要输出的编码方式重新编码为字符串。
例:String newUTF8Str = new String(oldGBKStr.getBytes("GBK"), "UTF8");
C 是正确的。Java虚拟机中通常使用UTF-16的方式保存一个字符
D 也是正确的。ResourceBundle能够依据Local的不同,选择性的读取与Local对应后缀的properties文件,以达到国际化的目的。

14、关于ThreadLocal类 以下说法正确的是

ThreadLocal继承自Thread

ThreadLocal实现了Runnable接口

ThreadLocal重要作用在于多线程间的数据共享

ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本

ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏

解析

1、ThreadLocal的类声明:
public class ThreadLocal
可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。所以AB都不对。
2、ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。
所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。
由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,
变量被彻底封闭在每个访问的线程中。所以E对。
3、ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本:

 static class ThreadLocalMap {

        static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }

        /**
         * The table, resized as necessary.
         * table.length MUST always be a power of two.
         */
        private Entry[] table;
}

15、下面关于hibernate核心接口说明错误的是?

Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象

SessionFactory 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存

Query 和Criteria 接口:执行数据库的查询

Transaction 接口:管理事务

温馨提示

B选项中应该是Session接口而不是SessionFactory接口\

1,Configuration接口:配置Hibernate,根据其启动Hibernate,创建SessionFactory对象;

2,SessionFactory接口:初始化Hibernate,充当数据存储源的***,创建session对象,SessionFactory是
线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级二级缓存;

3,session接口:负责保存、更新、删除、加载和查询对象,是一个非线程安全的,避免多个线程共享一个session,是轻量级,一级缓存。

4,Transaction接口:管理事务。可以对事务进行提交和回滚;

5,Query和Criteria接口:执行数据库的查询。

16、判断对错。在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。


温馨提示

java多态有两种情况:重载和覆写
在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;
在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法

17、下面有关JAVA异常类的描述,说法错误的是?

异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception

非RuntimeException一般是外部错误(非Error),其一般被 try{}catch语句块所捕获

Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉

RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须被 try{}catch语句块所捕获

温馨提示

运行时异常故名思议就是程序在运行的时候出现异常,隐含的一个前提就是程序在编译时是检测不到异常的存在,作者本人也并不知道是否自己的代码中含有运行时异常,所以根本也不可能提前使用try{}catch{}捕获.

18、以下代码执行的结果显示是多少( )?

[aru_42] 这题很有意思,看不明白可以仔细看解析!

    public static void main(String[] args) {

        Integer i1 = 128;
        Integer i2 = 128;
        System.out.print((i1 == i2) + ",");
        String i3 = "100";
        String i4 = "1" + new String("00");
        System.out.print((i3 == i4) + ",");
        Integer i5 = 100;
        Integer i6 = 100;
        System.out.print((i5 == i6));


    }

true,false,true

false,true,false

true,true,false

false,false,true

解析

代码片段
public class Test03 {
 
     
    public static void main(String[] args) {
        
        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
 
          
        System. out.println( f1 == f2); //true
        System. out.println( f3 == f4); //false
    }
}

当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf
Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
Integer f3 = Integer.valueOf(150);
Integer f4 = Integer.valueOf(150);
思考:那么Integer.valueOf()返回的Integer是不是是重新new Integer(num);来创建的呢?如果是这样的话,那么== 比较返回都是false,因为他们引用的堆地址不一样。

具体来看看Integer.valueOf的源码
public static Integer valueOf(int i) {
         
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.***[i + (-IntegerCache.low)];
        return new Integer(i);
}

在IntegerCache中***数组初始化如下,存入了-128 - 127的值

*** = new Integer[(high - low) + 1];
int j = low;
for( int k = 0; k < ***.length ; k ++)
    ***[k] =
    ***[k] = new Integer(j ++);

从上面我们可以知道给Interger 赋予的int数值在-128 - 127的时候,直接从***中获取,这些***引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,不可能一样的.

结论:所以,Integer I = 128, 因为128超过了-128~127,i不会引用内存中的对象,会new一个新的对象。

19、下面哪些接口直接继承自Collection接口()

List

Map

Set

Iterator

温馨提示

博主整理JAVA一般面试题目——第一套(20题)插图4

20、下面哪几个语句正确的声明一个整型的二维数组()

int a[][]=new int[][]

int b[10][10]=new int[][]

int c[][]=new int[10][10]

int []d[]=new int[10][10]

温馨提示

博主整理JAVA一般面试题目——第一套(20题)插图6

21、下面关于面向对象的一些理解哪些是错误的( )(多补一题[aru_41])

面向对象的最重要的特性是支持继承、封装和多态

系统设计应该遵循开闭原则,系统应该稳定不不可修改,但应支持通过继承、组合等方式进行扩展

函数式的语言必然是面向对象的语言

面向对象设计时,每个类的职责应该单一,不要再一个类中引入过多的接口

过程式语言和面向对象的语言各有其优势,过程式语言更加灵活,面向对象语言更加强调抽象和封装

Java和C++都是静态类型的面向对象编程语言

温馨提示

动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

发表评论 取消回复
表情 图片 链接 代码

分享