面试题目-1

1.有关会话跟踪技术描述正确的是
a.Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端
b.关闭浏览器意味着会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期
c.在禁用Cookie时可以使用URL重写技术跟踪会话

答案:a,b,c

2.下面代码的输出结果是什么?

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}
答案: 构造块 构造块 静态块 构造块

静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
静态块按照申明顺序执行,所以先执行publicstaticB t1 = newB();该语句创建对象,则又会调用构造块,输出构造块
接着执行public static B t1 = new B();输出构造块
再执行
static
{
System.out.println("静态块");
}输出静态块
最后main方法执行,创建对象,输出构造块。


3.下面不属于HttpServletRequest接口完成功能的是?
a.读取cookie
b.读取HTTP头
c.设定响应的content类型
d.读取路径信息
答案:c
A: request.getCookies();
B: request.getHeader(String s);
C: response.setContentType("text/html;charset=utf-8");
C: request.getContextPath();/request.getServletPath();

答案:c

4.以下关于对象序列化描述正确的是
a.使用FileOutputStream可以将对象进行传输
b.使用PrintWriter可以将对象进行传输
c.使用transient修饰的变量不会被序列化
d.对象序列化的所属类需要实现Serializable接口

答案:c d

只有以Object开头的stream才可以传输对象,C和D transient这个单词本身的意思就是瞬时的意思 transient是变量修饰符 变量定义为transient的,序列化时会忽略此字段,所以C是对的, 只有实现了Serializable接口的,才可以被序列化


5.下面哪种情况会导致持久区jvm.

a.循环上万次的字符串处理
b.在一段代码内申请上百M甚至上G的内存
c.使用CGLib技术直接操作字节码运行,生成大量的动态类
d.不断创建对象

答案:c

简单的来说 java的堆内存分为两块:permantspace(持久带) 和 heap space。
持久带中主要存放用于存放静态类型数据,如 Java Class, Method 等, 与垃圾收集器要收集的Java对象关系不大。
而heapspace分为年轻带和年老带 
年轻代的垃圾回收叫 Young GC, 年老代的垃圾回收叫 Full GC。
在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象
年老代溢出原因有 循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存,既A B D选项
持久代溢出原因 动态加载了大量Java类而导致溢出

a,b,d导致堆内存溢出,而c导致permantspace区域溢出,堆区域和permantspace区域不是一个区域,permantspace包括方法区,方法区主要包括类加载信息、字面量和常量等。


6.在 myjsp.jsp 中,关于下面的代码说法错误的是: ( ) 
<%@ page language="java" import="java.util.*" errorPage="error.jsp" isErrorPage="false" %>

a.该页面可以使用 exception 对象
b.该页面发生异常会转向 error.jsp
c.存在 errorPage 属性时,isErrorPage 是默认为 false
d.error.jsp 页面一定要有isErrorPage 属性且值为 true

答案:a

页面有isErrorPage属性且值为false,不可以使用 exception 对象


7.面向对象5大基本原则

单一职责原则(SRP)
开放封闭原则(OCP) 
里氏替换原则(LSP) 
依赖倒置原则(DIP) 
接口隔离原则(ISP)

单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 
开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。 
Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。 
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。 
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口


8.下面哪项技术可以用在WEB开发中实现会话跟踪实现?

a.session
b.Cookie
c.地址重写
d.隐藏域

答案:a.b.c.d

HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web 服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息。即使那些支持持续性 HTTP 连接的服务器,尽管多个客户请求连续发生且间隔很短时它们会保持 socket 打开,但是,它们也没有提供维护上下文信息的内建支持。上下文的缺失引起许多困难。例如,在线商店的客户向他们的购物车中加入商品时,服务器如何知道购物车中己有何种物品呢?类似地,在客户决定结账时,服务器如何能确定之前创建的购物车中哪个属于此客户呢?这些问题虽然看起来十分简单,但是由于 HTTP 的不足,解答它们却异常复杂困难。对于这个问题,存在 3 种典型的解决方案:
Cookie(结合session使用)
可以使用 cookie 存储购物会话的 ID;在后续连接中,取出当前的会话 ID,并使用这个 ID 从服务器上的查找表(lookup table)中提取出会话的相关信息。 以这种方式使用 cookie 是一种绝佳的解决方案,也是在处理会话时最常使用的方式。但是,sevlet 中最好有一种高级的 API 来处理所有这些任务,以及下面这些冗长乏味的任务:从众多的其他cookie中(毕竟可能会存在许多cookie)提取出存储会话标识符的 cookie;确定空闲会话什么时候过期,并回收它们;将散列表与每个请求关联起来;生成惟一的会话标识符。
URL 重写
采用这种方式时,客户程序在每个URL的尾部添加一些额外数据。这些数据标识当前的会话,服务器将这个标识符与它存储的用户相关数据关联起来。 URL重写是比较不错的会话跟踪解决方案,即使浏览器不支持 cookie 或在用户禁用 cookie 的情况下,这种方案也能够工作。URL 重写具有 cookie 所具有的同样缺点,也就是说,服务器端程序要做许多简单但是冗长乏味的处理任务。即使有高层的 API 可以处理大部分的细节,仍须十分小心每个引用你的站点的 URL ,以及那些返回给用户的 URL。即使通过间接手段,比如服务器重定向中的 Location 字段,都要添加额外的信息。这种限制意味着,在你的站点上不能有任何静态 HTML 页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用 servlet 或 JSP 动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息也会丢失,因为存储下来的链接含有错误的标识信息。
隐藏的表单域
HTML 表单中可以含有如下的条目:<input type="hidden" name="session" value="a1234">
这个条目的意思是:在提交表单时,要将指定的名称和值自动包括在 GET 或 POST 数据中。这个隐藏域可以用来存储有关会话的信息,但它的主要缺点是:仅当每个页面都是由表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程。


9.String和StringBuffer的区别?

a.String是不可变的对象,StringBuffer是可以再编辑的
b.String是常量,StringBuffer是变量

c.String是可变的对象,StringBuffer是不可以再编辑的

d.以上说法都不正确

答案:a.b


10.已知如下类定义:

class Base { 
public Base (){ 
//... 
} 
public Base ( int m ){ 
//... 
} 
public void fun( int n ){ 
//... 
} 
} 
public class Child extends Base{ 
// member methods 
} 


如下哪句可以正确地加入子类中?

a.private void fun( int n ){ //...}
b.void fun ( int n ){ //... }
c.protected void fun ( int n ) { //... }
d.public void fun ( int n ) { //... }

答案:d

子类继承至少要权限满足父类即可 父类是public 子类只能是public了


11.下面描述属于java虚拟机功能的是?

a.通过 ClassLoader 寻找和装载 class 文件
b.解释字节码成为指令并执行,提供 class 文件的运行环境
c.进行运行期间垃圾回收
d.提供与硬件交互的平台

答案:a.b.c


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

a.对
b.错

答案:b

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


12.下面有关java classloader说法错误的是?

a.Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
b.ClassLoader使用的是双亲委托模型来搜索类的
c.JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
d.ClassLoader就是用来动态加载class文件到内存当中用的

答案:c

由于类加载器的双亲委托机制,不同类加载器加载的类必定不是同一个类


13.下面有关java的一些细节问题,描述错误的是?

a.构造方法不需要同步化
b.一个子类不可以覆盖掉父类的同步方法
c.定义在接口中的方法默认是public的
d,容器保存的是对象的引用

答案:b

构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步

子类对父类的方法都可以覆盖


14.What will be printed when you execute the following code?

class C {
    C() {
        System.out.print("C");
    }
}
 
class A {
    C c = new C();
 
    A() {
        this("A");
        System.out.print("A");
    }
 
    A(String s) {
        System.out.print(s);
    }
}
 
class Test extends A {
    Test() {
        super("B");
        System.out.print("B");
    }
 
    public static void main(String[] args) {
        new Test();
    }
}
a.BB
b.CBB
c.BAB
d.None of the above

答案:b,super("B") 直接调用父类的有参构造方法,而会忽略父类的无参构造方法


15.下面有关文件系统元数据的描述,说法错误的是?

a.元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息等等
b.我们可以使用stat命令来查看文件更多的元数据信息
c.Unix/Linux系统允许,多个文件名指向同一个inode号码
d.文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B,这是文件A就称为文件B的"硬链接"

答案:c只有软链接才会指向同一个innode号码


16.Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()

a.".*?(?=\\()"
b.".*?(?=\()"
c.".*(?=\\()"
d.".*(?=\()"

答案:a

没什么道理的


16.以下哪些类是线程安全的()

a.Vector

b.ArrayList
c.StringBuffer
d.Properties

答案:a,c,d

Vector相当于一个线程安全的List
Arraylist是非线程安全的,其对应的线程安全类是Vector
StringBuffer是线程安全的,相当于一个线程安全的StringBuilder
Properties实现了Map接口,是线程安全的


17. 问这个程序的输出结果。

package Wangyi;
class Base
{
    public void method()
    {
        System.out.println("Base");
    } 
}
class Son extends Base
{
    public void method()
    {
        System.out.println("Son");
    }
     
    public void methodB()
    {
        System.out.println("SonB");
    }
}
public class Test01
{
    public static void main(String[] args)
    {
        Base base = new Son();
        base.method();
        base.methodB();
    }
}
 
a.Base SonB
b.Son SonB
c.Base Son SonB
d.编译不通过

答案:编译不通过

有关对象的上转型对象 Base base = newSon();--》
** base.method();//等同于son调用重写的method()方法
** base.methodB(); //非法,因为methodB()(是子类新加的方法 子类新加的属性也是不可访问的)--》 报错-》D
**插入Son son=new (Son)base //把上转型对象强制转化为子类对象即刻通过编译--》B


18.电影院排队问题

有2n个人排队进电影院,票价是50美分。在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子)。愚蠢的电影院开始卖票时1分钱也没有。
问: 有多少种排队方法 使得 每当一个拥有1美元买票时,电影院都有50美分找钱
注:
1美元=100美分
拥有1美元的人,拥有的是纸币,没法破成2个50美分

a.(2n)!/[n!n!]
b.(2n)!/[n!(n+1)!]
c.(2n)!/[n!(n-1)!]
d.(2n + 1)!/[n!(n-1)!]

正确答案:b


19:下面关于Spring的说法中错误的是()

a.Spring是一系列轻量级Java EE框架的集合
b.Spring中包含一个“依赖注入”模式的实现
c.使用Spring可以实现声明式事务
d.Spring提供了AOP方式的日志系统

答案:d

Spring提供了AOP方式的日志系统
Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。


20.下面有关forward和redirect的描述,正确的是?

a.执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址
b.执行redirect时,服务器端告诉浏览器重新去请求地址
c.forward是内部重定向,redirect是外部重定向

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

答案:a,b,c

request的forward和response的redirect
1.redirect地址栏变化,forward发生在服务器端内部从而导致浏览器不知道响应资源来自哪里
2.redirect可以重定向到同一个站点上的其他应用程序中的资源,forward 只能将请求 转发给同一个WEB应用中的组件
3.redirect默认是302码,包含两次请求和两次响应
4.redirect效率较低

你可能感兴趣的:(面试题目-1)