牛客网专项练习java错题(一)

牛客网专项练习java错题(一)

2018/ 5 /12

这里写图片描述

解析:

绘图函数,java.awt中的paint方法 。**public void paint(Graphics g)**。Graphicslei类是所有图形的抽象基类

2

解析:

 1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用 

 2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。 

 3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。 

     作用域       当前类    同一package   子孙类     其他package 

       public        √         √             √           √ 

      protected     √          √             √           × 

      defailt       √          √             ×           × 
      (不写默认就是defailt)

      private       √          ×             ×           ×

补充:
default和protected的区别是:
前者只要是外部包,就不允许访问。
后者只要是子类就允许访问,即使子类位于外部包。
总结:default拒绝一切包外访问;protected接受包外的子类访问

解析:

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
(简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)
中间件特点的描述:
1. 中间件应支持标准的协议和接口
2. 中间件可运行于多种硬件和操作系统平台上
3. 跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互

这里写图片描述

解析:


int占4个字节,32位
byte占1个字节,8位

所以强转时会截断。前24位

在内存中表示形式( 注意java中是以补码表示一个数,所以表示形式是补码,不是原码! ):
int a = 3 00000000 00000000 00000000 00000011 (强转byte时前面24个0被截断)
byte b = 3 00000011
int a = -3 11111111 11111111 11111111 11111101 (强转byte时前面24个1被截断)

byte b = -3 11111101

1、Java中用补码形式表示
2、第一位正负位,1表示负,0表示正。
3、原码:一个数的二进制表示。
3的原码00000011 -3的 原码 10000011
4、反码:负数原码按位取反(符号位不变)。正数原码本身。
3的反码00000011 -3的反码11111100
5、补码:正数是原码本身。负数反码加1。

3的补码是00000011 -3的补码是11111101

已知负数的补码,求负数:
补码-1=反码,反码按位取反=该负数绝对值
已知负数,求负数的补码:
1、负数原码除了符号位,按位取反(不含符号位),加1。
2、负数绝对值的补码(也就是原码),按位取反(含符号位),加1
java int 128转为byte,值:

128为正数,补码为10000000(前面24个0省略),变成byte,只剩下10000000(byte为1个字节),因为开头是1,所以为负数。即1个负数的补码是10000000。反码是01111111,原码是1000000。是128.因为是负数,所以是-128。

这里写图片描述

解析:

ArrayList的长度是10个,所以如果你要往list里添加20个元素肯定要扩充一次(扩充为原来的1.5倍)。
但是这里显示指明了需要多少空间,所以就一次性为你分配这么多空间,也就是不需要扩充了。
ArrayList list=new ArrayList();   这种是默认创建大小为10的数组,每次扩容大小为1.5倍
ArrayList list=new ArrayList(20);  这种是指定数组大小的创建,没有扩充

这里写图片描述

解析:

ServerSocket (int port)
Creates a server socket, bound to the specified port.

Socket(InetAddress address, int port)
Creates a stream socket and connects it to the specified port number at the specified IP address.

ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket。
Socket(InetAddress address , int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口。

socket和servletSocket的交互如下图所示:
这里写图片描述

详细了解,大家可以看此博客:传送门

这里写图片描述

解析:

包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱
包装类的equals()方法不处理数据转型
同类型的进行比较,如Integer 与int,Long与long进行==比较时,会自动拆箱; 
不同类型之间进行比较,如果有一方为非包类,则会自动拆箱。如果两方都为包装类,则不会拆箱,且不能比较,编译会报错

同类型的进行比较,如Integer 与int,Long与long进行==比较时,会自动拆箱;不同类型之间进行比较,如果有一方为非包装类,则会自动拆箱。如果两方都为包装类,则不会拆箱,且不能比较,编译会报错

ABC3 个选项很明显,不同类型引用的 == 比较,会出现编译错误,不能比较。
DEF 调用 equals 方法,因为此方法先是比较类型,而 i , d , l 是不同的类型,所以返回假。
选项 G ,会自动装箱,将 42L 装箱成 Long 类型,所以调用 equals 方法时,类型相同,且值也相同,因此返回真
这里写图片描述

解析:

本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上)
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自
动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。
nt a=257;
Integer b=257;
Integer c=257;
Integer b2=57;
Integer c2=57;
System.out.println(a==b);
//System.out.println(a.equals(b));  编译出错,基本型不能调用equals()
System.out.println(b.equals(257.0));
System.out.println(b==c);
System.out.println(b2==c2);
因此上面的代码的结果因此为 true, false, false, true

这里写图片描述

解析:

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对象)

这里写图片描述

解析:

从Java语言的定义,ABCD都是错误的,4个都不是正确的字符常量。可以查阅《JLS8》中的描述:
A character literal is expressed as a character or an escape sequence,enclosed in ASCII single
quotes.一个字符常量表示为一个字符或一个转义序列,被一对ASCII单引号关闭。  
CharacterLiteral:
' SingleCharacter '
' EscapeSequence '
SingleCharacter:
InputCharacter but not ' or \

而转义序列包括:

EscapeSequence:
\ b (backspace BS, Unicode \u0008)
\ t (horizontal tab HT, Unicode \u0009)
\ n (linefeed LF, Unicode \u000a)
\ f (form feed FF, Unicode \u000c)
\ r (carriage return CR, Unicode \u000d)
\ " (double quote ", Unicode \u0022)
\ ' (single quote ', Unicode \u0027)
\ \ (backslash \, Unicode \u005c)
OctalEscape (octal value, Unicode \u0000 to \u00ff)
...

四个答案都采用的是双引号关闭,所以是字符串常量而不是字符常量。
忽略这个错误,那么这题就没有答案,因为无论是采用特殊字符的转移序列’\n’还是采用八进制转义’\101’,都是满足Java语言规范中规定的字符常量格式。

这里写图片描述

解析:

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;

}
所以D对。

这里写图片描述

解析:

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

A:一个InterruptedException 异常被捕获 大家都知道的嘛 (一般通过interrupt方法 中断线程) 如果抓到一个线程 都会关紧catch里面 然后中断当前操作,A正确。
B:线程执行了wait()方法。 线程使用了wait方法,会强行打断当前操作,(暂停状态,不会中断线程) 进入阻塞(暂停)状态,然后需要notify方法或notifyAll方法才能进入就绪状态。 B 正确。
C:当前线程创建了一个新的线程。 新创建的线程不会抢占时间片,只有等当前线程把时间片用完,其他线程才有资格拿到时间片去执行。
D:一个高优先级别的线程就绪。 如C相同,你优先级别再高 也待等我现在弄完才会给你。(就像我们玩游戏,会员虽然有排队优先权,但是还是要等正在登陆的用户进去游戏之后才能抢到他原来那个位置,不能说我在过关卡的过程中你一脚把我踢开,然后霸占我的位置吧,我原来的那些数据咋办!!!)
E:线程在MediaTracker上执行了waitforID()调用。
这个应该大家也不太熟悉。这个类是awt里面的,我查API才知道。
然后他的功能是加载图像,直到完成之前,该方法一直等待!这个方法是必须要抛出A选项的InterruptedException 异常的 说明这玩意会让其他线程 wait他完成! 所以会暂停当前线程~~大概是这样吧哈哈哈! E选项我没选对! 这还是真的!。!

猜你喜欢

转载自blog.csdn.net/weixin_38916872/article/details/80290625