java---牛客网java专项训练知识点集锦

来源:互联网 发布:模拟化学反应的软件 编辑:程序博客网 时间:2024/05/06 05:42

1.关于原码、反码、补码的问题。

经过强制类型转换以后,变量a,b的值分别为多少?
1
2
shorta =128
byteb =(byte) a;



已知负数的补码,求负数:
补码-1=反码,反码按位取反=该负数绝对值
已知负数,求负数的补码:
(1)、负数原码除了符号位,按位取反(不含符号位),加1。
(2)、负数绝对值的补码(也就是原码),按位取反(含符号位),加1
java int 128转为byte,值:
128为正数,补码为10000000(前面24个0省略),变成byte,只剩下10000000(byte为1个字节),因为开头是1,所以为负数。即1个负数的补码是10000000。反码是01111111,原码是1000000。是128.因为是负数,所以是-128。
2、final修饰的变量是常量,必须进行初始化,可以显示初始化,也可以通过构造进行初始化,如果不初始化编译会报错。
final作为对象成员存在时,必须初始化;但是,如果不初始化,也可以在类的构造函数中初始
因为java允许将数据成员声明为final,却不赋初值。但是,final必须在使用之前初始化。如果不初始化,就会出现编译时错误。
3.stack是继承自vector,所以是线程安全的。
4.字符型类型的数据默认值是空。
5.Object类中的方法有:
方法摘要protected  Objectclone()
          创建并返回此对象的一个副本。
 booleanequals(Object obj)
          指示其他某个对象是否与此对象“相等”。
protected  voidfinalize()
          当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
 Class<?>getClass()
          返回此 Object 的运行时类。
 inthashCode()
          返回该对象的哈希码值。
 voidnotify()
          唤醒在此对象监视器上等待的单个线程。
 voidnotifyAll()
          唤醒在此对象监视器上等待的所有线程。
 StringtoString()
          返回该对象的字符串表示。
 voidwait()
          在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
 voidwait(long timeout)
          在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
 voidwait(long timeout, int nanos)
          在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。

6.在jsp文件中,errorPage="error.jsp"和isErrorPage的用法

如果在jsp页面a中声明了errorPage="error.jsp",那么表明a页面如果出现了异常,那么会跳转的错误页面“error.jsp”,并且error.jsp页面中要有isErrorPage=“true”的声明。只有声明了“isErrorPage”的页面才能使用Exception内置对象。

回忆一下jsp的九大内置对象:orrcs appe

7.下列关于Java并发的说法中正确的是(B)

A:CopyOnWriteArrayList适用于写多读少的并发场景--------------<应该是写少读多>
B:ReadWriteLock适用于读多写少的并发场景
C:ConcurrentHashMap的写操作不需要加锁,读操作需要加锁----------------<读写都要加锁>
D:只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了
摘自网友的解析:

A,CopyOnWriteArrayList适用于写少读多的并发场景
B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。在读多写少的情况下可以提高效率
C,ConcurrentHashMap是同步的HashMap,读写都加锁
D,volatile只保证多线程操作的可见性(线程A修改共享数据后,将工作内存的数据副本更新到主内存,主内存将新的共享数据更新到线程B的工作内存中),不保证原子

8.下面函数将返回?(C)

publicstaticintfunc (){
    try{
        return1;
    }catch(Exception e){
        return2;
    }finally{
        return3;
    }
}
A:1
B:2
C:3
D:编译错误
摘自网友的解析:
记住:无论如何finally语句都要执行就会这个题了
finally语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句不能影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。
9.下列哪个说法是正确的:(D)

A:ConcurrentHashMap使用synchronized关键字保证线程安全
B:HashMap实现了Collection接口
C:Arrays.asList方法返回java.uti.ArrayList对象
D:SimpleDateFormat对象是线程不安全的
摘自网友的解析:

A项:ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全;

B项:

public class HashMap<K,V> extends AbstractMap<K,V> implementsMap<K,V>,Cloneable,Serializable

C项:Arrays.asList()

将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!用这个对象对列表进行添加删除更新操作,就会报UnsupportedOperationException异常.
D项:SimpleDateFormal类原文复制:Date formats are not synchronized. It isrecommended to create separate format instances for each thread. Ifmultiple threads access a format concurrently, it must be synchronized externally.
10.如何放掉一个指定占据的内存空间?(D)

A:调用free()方法
B:代用system.gc()方法
C:赋值给该项对象的引用为null
D:程序员无法明确强制垃圾回收器运行
摘自网友的解析:

A,java属于自动内存回收,不能调用free是否内存
B,调用gc()垃圾回收器也只能回收没有任何引用指向的对象
C,赋值该对象引用为null,没有被引用的对象会被垃圾回收器当做垃圾进行回收
D,程序员可以调用System.gc()方法运行垃圾回收器,但是回收的是没有被引用的对象,也并不一定回收的就是程序员想要被回收的对对象,所以无法明确强制回收器必须回收哪个对象。
11.注意构造函数不能有返回值类型关键字生命,void也不行。
12.float x 与“零值”比较的if语句为?(C)

A:if (x == 0)
B:if (x < 0.00001f)
C:if (fabs(x) < 0.00001f)
D:if (x > -0.00001f)
来自网友的解析:

folat类型的还有double类型的,这些小数类型在趋近于0的时候直接等于0的可能性很小,一般都是无限趋近于0.因此不能用==来判断。应该用|x-0|<err来判断,这里|x-0|表示绝对值,err表示限定误差
用程序表示就是fabs(x)<0.00001f
13.在java虚拟机加载类时,先加载类的静态代码块,再加载静态函数,因为静态函数中可能会用到静态代码块中的成员。

14.ArrayList list = new ArrayList(20);中的list扩充几次(A)

A:0
B:1
C:2
D:3
来自网友的解析:

ArrayList的构造函数总共有三个:

(1)ArrayList()构造一个初始容量为 10 的空列表。
(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
调用的是第三个构造函数,直接初始化为大小为20的list,没有扩容,所以选择A
15.下面哪项技术可以用在WEB开发中实现会话跟踪实现?(A、B、C、D)

A:session
B:Cookie
C:地址重写
D:隐藏域

摘自网友的解析:

会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能。
HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。当一个客户在多个页面间切换时,服务器会保存该用户的信息。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
1).隐藏表单域:<input type="hidden">,非常适合不需要大量数据存储的会话应用。
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话

来自另外一位网友的解析:

HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息。即使那些支持持续性 HTTP连接的服务器,尽管多个客户请求连续发生且间隔很短时它们会保持 socket打开,但是,它们也没有提供维护上下文信息的内建支持。上下文的缺失引起许多困难。例如,在线商店的客户向他们的购物车中加入商品时,服务器如何知道购物车中己有何种物品呢?类似地,在客户决定结账时,服务器如何能确定之前创建的购物车中哪个属于此客户呢?这些问题虽然看起来十分简单,但是由于HTTP 的不足,解答它们却异常复杂困难。对于这个问题,存在 3 种典型的解决方案:
Cookie(结合session使用)
可以使用 cookie 存储购物会话的 ID;在后续连接中,取出当前的会话 ID,并使用这个 ID 从服务器上的查找表(lookuptable)中提取出会话的相关信息。 以这种方式使用 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 数据中。这个隐藏域可以用来存储有关会话的信息,但它的主要缺点是:仅当每个页面都是由表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程。

16.PreparedStatement与Statement的区别:

-->创建时的区别: 

    Statement statement = conn.createStatement();
    PreparedStatement preStatement = conn.prepareStatement(sql);
-->执行的时候: 
    ResultSet rSet = statement.executeQuery(sql);
    ResultSet pSet = preStatement.executeQuery();

由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少遍,都不会再去进行编译,

而 statement 不同,如果执行多变,则相应的就要编译多少遍sql,所以从这点看,preStatement 的效率会比 Statement要高一些

17.给出以下代码,请给出结果.()

class Two{    Byte x;}class PassO{    public static void main(String[] args){        PassO p=new Passclass Two{    Byte x;}class PassO{    public static void main(String[] args){        PassO p=new PassO();        p.start();    }    void start(){        Two t=new Two();        System.out.print(t.x+””);        Two t2=fix(t);        System.out.print(t.x+” ” +t2.x);    }    Two fix(Two tt){        tt.x=42;        return tt;    }}O();        p.start();    }    void start(){        Two t=new Two();        System.out.print(t.x+””);        Two t2=fix(t);        System.out.print(t.x+” ” +t2.x);    }    Two fix(Two tt){        tt.x=42;        return tt;    }}

A:null null 42
B:null 42 42
C:0 0 42
D:0 42 42
E:An exception is thrown at runtime
F:Compilation
来自网友的解析:


特别好的解析,一目了然。

18、在Java7及Java7版本以后中,能做Switch参数类型的是int(byte、short、char)、enum、String;

在Java7版本之前,只有int和enum能够作为switch参数(当然也包括能够自动转为int类型的类型,例如:byte、short、char)。

19对于JVM内存配置参数:

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和Survivor区总大小分别是(D)
A:5120m,1024m
B:5120m,2048m
C:10240m,1024m
D:10240m,2048m解析:-Xmx:最大堆大小,10240M-Xms:初始堆大小即最小内存值,10240M-Xmn:年轻代大小,5120M-XXSurvivorRatio=3Eden:Survivor=3:1,总共有两个Survivor区,所以Eden:总的Survivor区=3:2所以,总的Survivor区=5120*2/5=2048M         


20、What results from the following code fragment?(c)

1
2
3
int i = 5;
int j = 10;
System.out.println(i + ~j);
A:Compilation error because”~”doesn’t operate on integers
B:-5
C:-6
D:15
解析:

~10代表对10取反

10的原码:0000 1010

         取反:1111 0101

现在问题转化为了求补码为1111 0101的真值。

补码-1 :1111 0100

再取反:0000 1011

得到真值:11

由于补码首位为1,所以真值为-11.

所以~10=-11.



0 0
原创粉丝点击