整理了一些在牛客网做错的题:

链接:https://www.nowcoder.com/questionTerminal/e35f449be29548c68352ef302965a44e
来源:牛客网

有如下4条语句:() 
1
2
3
4
Integer i01=59;
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);
以下输出结果为false的是: 
  • System.out.println(i01==i02);
  • System.out.println(i01==i03);
  • System.out.println(i03==i04);
  • System.out.println(i02==i04);

解析:==比较的是地址,比较基本类型时比较的是值,如果有包装类型(不管是不是new出来的)integer自动拆箱为int去跟int比所以A,D正确;

          首先常量池这个概念,原来以为只要是一个整型,都会放进到常量池,比如,0,1,12222222等。查找后发现,Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127并且大于等于-128时才可使用常量池,因为他们至占用一个字节(-128~127);再者Integer.valueOf方法中也有判断,如果传递的整型变量>= -128并且小于127时会返回IntegerCache类中一个静态数组中的某一个对象否则会返回一个新的Integer对象,代码如下

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

2,有如下代码,输出结果是:

public class Test

{
    public static void main(String[] args)
    {
        int x = 0;
        int y = 0;
        int k = 0;
        for (int z = 0; z < 5; z++) { 
            if ((++x > 2) && (++y > 2) && (k++ > 2))
            {
                x++;
                ++y;
                k++;
            }
        }
        System.out.println(x + ”” +y + ”” +k);
    }
}

z=0时候,执行++x > 2,不成立,&&后面就不执行了,此时 x=1,y=0,k=0; 
z=1时候,执行++x > 2,还不成立 ,&&后面就不执行了,此时 x=2,y=0,k=0;
z=2时候, 执行++x > 2,成立,继续执行 ++y > 2, 不成立  , &&后面就不执行了, 此时 x=3,y=1,k=0;
z=3时候,执行++x > 2,成立,继续执行++y > 2,不成立  , &&后面就不执行了, 此时 x=4,y=2,k=0;
z=4 时候,执行++x > 2,成立,继续执行 ++y > 2, 成立  , 继续执行k++>2 ,不成立,此时仍没有进入for循环的语句中, 但此时 x=5,y=3,k=1;
z=5时候,不满足条件了,整个循环结束,所以最好打印时候: x=5,y=3,k=1;
&&短路运算

 3,关于sleep()和wait(),以下描述错误的一项是( ) 

sleep是线程类(Thread)的方法,wait是Object类的方法;
sleep不释放对象锁,wait放弃对象锁
sleep暂停线程、但监控状态仍然保持,结束后会自动恢复
wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态

解析:选D,进入的是就绪态,不是运行态。

4,下面有关JVM内存,说法错误的是?

程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
方法区用于存储JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程隔离的
原则上讲,所有的对象都在堆区上分配内存,是线程之间共享

解析:选C,方法区是线程共享的。       

运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器

虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。

堆区 , JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。

方法区 :所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。

程序计数器 线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。

5,关于JSP生命周期的叙述,下列哪些为真?

  • JSP会先解释成Servlet源文件,然后编译成Servlet类文件
  • 每当用户端运行JSP时,jsp init()方法都会运行一次
  • 每当用户端运行JSP时,jsp service()方法都会运行一次
  • 每当用户端运行JSP时,jsp destroy()方法都会运行一次
牛客网题目整理
解析:选AC
servlet生命周期:init 、service、destory
init()和destroy()方法分别在创建和销毁时执行一次(仅此一次) 
service()方法是接收请求,返回响应的方法。每次请求都执行一次,该方法被HttpServlet封装为doGet和doPost方法
6,下列方法中哪个是线程执行的方法? ()
run()
start()
sleep()
suspend()

解析:选A
run()方法用来执行线程体中具体的内容 
start()方法用来启动线程对象,使其进入就绪状态 
sleep()方法用来使线程进入睡眠状态 
suspend()方法用来使线程挂起,要通过resume()方法使其重新启动
7,以下哪个接口的定义是正确的?(
  • interface  B
    { public abstract void print()  {  } ;}
  • interface  B
    { static void print() ;}
  • abstract  interface  B  extends  A1, A2  //A1、A2为已定义的接口
    {private abstract  void  print();}
  • interface  B
          {  void  print();}

解析:抽象方法不能有方法体,有大括号,所以A错误

          虽然说在Java8可以在接口中定义静态方法了(此处定义指的是含body的实现),但是不能只声明,只声明的会被编译器识别为抽象方法,而抽象方法不能用static修饰 ,所以B错误

          接口里的方法只能用 public 和 abstract 修饰,如果你不写也没关系,默认的也是 public abstract 修饰,C错误

8,执行下列代码后,哪些结论是正确的()? 

      String[] s=new String[10]; 

s[0]为未定义
s[9]为null
s.length为0
s[10]为” “

解析:
默认初始化,基本类型是 0  ,布尔类型是 false ,引用类型为null
所以这里为null选B

9,下面关于构造方法的说法不正确的是 ()

  • 构造方法也属于类的方法,用于创建对象的时候给成员变量赋值
  • 构造方法不可以重载
  • 构造方法没有返回值
  • 构造方法一定要和类名相同

所谓构造方法, 1,使用关键字new实例化一个新对象的时候默认调用的方法; 2,构造方法所完成的主要工作是对新创建对象的数据成员赋初值。 使用构造方法时需注意以下几点 1.构造方法名称和其所属的类名必须保持一致; 2.构造方法没有返回值,也不可以使用void; 3.构造方法也可以像普通方法一样被重载; 4.构造方法不能被static和final修饰; 5.构造方法不能被继承,子类使用父类的构造方法需要使用super关键字

所以选B

10,下面有关servlet service描述错误的是?

  • 不管是post还是get方法提交过来的连接,都会在service中处理
  • doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
  • service()是在javax.servlet.Servlet接口中定义的
  • service判断请求类型,决定是调用doGet还是doPost方法

doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的

11,Java的跨平台特性是指它的源代码可以在多个平台运行。




牛客网题目整理
语言跨平台是编译后的文件跨平台,而不是源程序跨平台。Java源代码首先经过编译器生成字节码,即class文件,该class文件与平台无关,而class文件经过解释执行之后翻译成最终的机器码,这是平台相关的。
java源代码-------字节码文件(class 文件)------机器码(与平台无关)。

12,java语言中,按照一定格式生成程序的文档的工具是?
javac
javah
javadoc
jar
解析:
jar         将许多文件组合成一个jar文件 
javac     编译 
javadoc 它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。
javah 把java代码声明的JNI方法转化成C\C++头文件。 JNI可参考java核心技术卷二第12章
13,关于AOP错误的是?
AOP将散落在系统中的“方面”代码集中实现
AOP有助于提高系统可维护性
AOP已经表现出将要替代面向对象的趋势
AOP是一种设计模式,Spring提供了一种实现

解析:

AOP 和 OOP的区别:

1. 面向方面编程 AOP 偏重业务处理过程的某个步骤或阶段,强调降低模块之间的耦合度使代码拥有更好的移植性
2. 面向对象编程 (oop) 则是对业务分析中抽取的实体进行方法和属性的封装。
也可以说 AOP 是面向业务中的动词领域, OOP 面向名词领域。
AOP 的一个很重要的特点是源代码无关性,也就是说如果我们的系统中引用了 AOP 组件,即使我们把该组件去掉,系统代码也应该能够编译通过。要实现这一点,可以使用动态 proxy 模式。
14,Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是()。
加载Servlet类及.class对应的数据
创建serletRequest和servletResponse对象
创建ServletConfig对象
创建Servlet对象

解析:
Servlet的生命周期一般可以用三个方法来表示:

  1. init():仅执行一次,负责在装载Servlet时初始化Servlet对象
  2. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。
  3. destory():在停止并且卸载Servlet时执行,负责释放资源

初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的。

牛客网题目整理

15,对于JVM内存配置参数: 

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3,其最小内存值和Survivor区总大小分别是() 
  • 5120m,1024m
  • 5120m,2048m
  • 10240m,1024m
  • 10240m,2048
牛客网题目整理
语言跨平台是编译后的文件跨平台,而不是源程序跨平台。Java源代码首先经过编译器生成字节码,即class文件,该class文件与平台无关,而class文件经过解释执行之后翻译成最终的机器码,这是平台相关的。

jar         将许多文件组合成一个jar文件 
javac    编译 
javadoc 它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。
javah 把java代码声明的JNI方法转化成C\C++头文件。 JNI可参考java核心技术卷二第12章

AOP 和 OOP的区别:

1. 面向方面编程 AOP 偏重业务处理过程的某个步骤或阶段,强调降低模块之间的耦合度,使代码拥有更好的移植性。
2. 面向对象编程 (oop) 则是对业务分析中抽取的实体进行方法和属性的封装。
也可以说 AOP 是面向业务中的动词领域, OOP 面向名词领域。
AOP 的一个很重要的特点是源代码无关性,也就是说如果我们的系统中引用了 AOP 组件,即使我们把该组件去掉,系统代码也应该能够编译通过。要实现这一点,可以使用动态 proxy 模式。
Servlet的生命周期一般可以用三个方法来表示:
  1. init():仅执行一次,负责在装载Servlet时初始化Servlet对象
  2. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。
  3. destory():在停止并且卸载Servlet时执行,负责释放资源

初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的

牛客网题目整理
    1. init():仅执行一次,负责在装载Servlet时初始化Servlet对象
    2. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。
    3. destory():在停止并且卸载Servlet时执行,负责释放资源

    初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。所以选ACD。B是在调用service方法时才构造的 

    编辑于 2016-04-27 10:20:37回复(6)
  • 更多回答(31条)
  • 33

解析:

-Xmx:最大堆大小 
-Xms:初始堆大小 
-Xmn:年轻代大小 
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值
jvm中分为堆和方法区
又进一步分为新生代和老年代
方法区为永久代

堆中区分的新生代和老年代是为了垃圾回收,新生代中的对象存活期一般不长,而老年代中的对象存活期较长,所以当垃圾回收器回收内存时,新生代中垃圾回收效果较好,会回收大量的内存,而老年代中回收效果较差,内存回收不会太多。 
基于以上特性,新生代中一般采用复制算法,因为存活下来的对象是少数,所需要复制的对象少,而老年代对象存活多,不适合采用复制算法,一般是标记整理和标记清除算法。 
因为复制算法需要留出一块单独的内存空间来以备垃圾回收时复制对象使用,所以将新生代分为eden区和两个survivor区,每次使用eden和一个survivor区,另一个survivor作为备用的对象复制内存区。 
综上: 
-Xmn设置了新生代的大小为5120m,而-XXSurvivorRatio=3,所有将新生代共分成5分,eden占三份,survivor占两份,每份1/5


牛客网题目整理


相关文章: