牛客刷题日记(2021-10-25)

  • Post author:
  • Post category:其他




牛客刷题日记(2021-10-25)




题目1:

下列叙述错误的是( )
java程序的输入输出功能是通过流来实现的
java中的流按照处理单位可分成两种:字节流和字符流
InputStream是一个基本的输出流类。
通过调用相应的close()方法关闭输入输出流


解析:

大家相对纠结的应该是C选项吧,

C.InputStream是一个基本的输出流类

这里”基本的”,其实就是将流分为

节点流和处理流

,而“基本的”是表示节点流

所以C选项可以看成:InputStream是属于节点输出流;

所以我们就要判断InputStream是节点流还是处理流,是输出流还是输入流

这就涉及到哪些是节点流,哪些是处理流了,而且很明显,他是一个输入流

节点流:


FileInputStream,FileOutputStrean,FileReader,FileWriter

StringReader,StringWriter

ByteArrayInputStream ,ByteArrayOutputStream ,CharArrayReader

PipedInputStream PipedOutputStream PipedReaderPipedWriter


处理流:


BufferedInputStrean,BufferedOutputStream,BufferedReader,BufferedWriter

InputStreamReader,OutputStreamReader

DataInputStream,DataOutputStream

PrintWriter

不知道大家发现没有,节点流的前缀都是名词,如

File,String,Char

等;处理流的前缀都是动词,如input,print,bufferd等等

所以大家别烦分不清一个流到底是节点流还是处理流,看他前缀是名词还是动词就行了



题目2:

一个抽象类并不需要其中所有的方法都是抽象的。(   )
正确
错误


解析:

1)抽象类可以包括抽象方法和非抽象方法

2)如果类里面有抽象方法的话,那么类一定要声明为抽象的!



题目3:

ArrayListLinkList的描述,下面说法错误的是?
A.LinkedeListArrayList都实现了List接口
B.ArrayList是可改变大小的数组,而LinkedList是双向链接串列
C.LinkedList不支持高效的随机元素访问
D.LinkedList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在ArrayList的中间插入或删除一个元素的开销是固定的


解析:

LinkedList是基于双链表的,增加是在尾部增加,增加和删除都只需要修改指针,不需要移动元素。ArrayList插入或删除一个元素的开销不是固定的。在插入时,如果索引正确,容量够,则直接插入,插入位置之后的都需要移动,如果容易不够,还得扩充容量,开销当然不一样。删除操作同理。所以,D错误,相当于说反了。



题目:

class Foo {
    final int i;
    int j;
    public void doSomething() {
        System.out.println(++j + i);
    }
}   的输出?

0
1
2
不能执行,因为编译有错


解析:

D。final类型的变量一定要初始化,因为final的变量不可更改。



题目4:

public class Test{ 
    private static int i=1;
    public int getNext(){ 
         return i++;
    } 
    public static void main(String [] args){ 
        Test test=new Test(); 
        Test testObject=new Test(); 
        test.getNext(); 
        testObject.getNext(); 
        System.out.println(testObject.getNext()); 
    } 
}
请问最后打印出来的是什么?()
2
3
4
5


解析:

return i++, 先返回i,然后i+1;

第一次调用getNext()方法时,返回的是1,但此时i=2;

第二次调用 getNext()方法时,返回的是2,但此时i=3;

第三次调用 getNext()方法时,返回的是3,但此时i=4;



题目5:

下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。
java
javadoc
jdb
javaprof


解析:

C
java,exe是java虚拟机
javadoc.exe用来制作java文档
jdb.exe是java的调试器
javaprof,exe是剖析工具


题目6:

看以下代码:
文件名称:forward.jsp
<html>  
     <head><title> 跳转  </title> </head> 
     <body>  
         <jsp:forward page="index.htm"/>     
     </body>
 </html> 
如果运行以上jsp文件,地址栏的内容为

http://127.0.0.1:8080/myjsp/forward.jsp
http://127.0.0.1:8080/myjsp/index.jsp
http://127.0.0.1:8080/myjsp/index.htm
http://127.0.0.1:8080/myjsp/forward.htm



解析:

redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去***局办(index.html)临时身份证,这时你就会走出银行,自己前往***局,地址栏变为index.html.

forward:请求转发:服务器行为,地址栏不变。举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包落在某某公司的出租车上(index.html),这时你不用亲自去找某某公司的出租车,警察局让出租车自己给你送来,你只要在警察局等就行。所以地址栏不变,依然为forward.jsp



题目7:

假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是()


boolean isOdd = false;

for(int i=1;i<=2;++i)
{
if(i%2==1)isOdd = trueelse isOdd = false;
a+=i*(isOdd?1:-1)}

-1
-2
0
1


解析:

不管怎样线程对a的操作就是+1后-2

1.线程1执行完再线程2执行,1-2+1-2=-2

2.线程1和2同时+1,再-2不同时,1-2-2=-3

3.线程1和2不同时+1,同时-2,1+1-2=0

4.线程1和2既同时+1又同时-2,1-2=-1

没有结果为1的情况



题目8:


java8中,下面哪个类用到了解决哈希冲突的开放定址法  D
LinkedHashSet
HashMap
ThreadLocal
TreeMap


解析:

threadlocalmap使用开放定址法解决haah冲突,hashmap使用链地址法解决hash冲突



题目9:

对于JVM内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和Survivor区总大小分别是()
 5120m,1024m
5120m,2048m
10240m,1024m
10240m,2048m


解析:

D

-Xmx:最大堆大小

-Xms:初始堆大小

-Xmn:年轻代大小

-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值

年轻代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。

-Xms初始堆大小即最小内存值为10240m



题目10:

对于线程局部存储TLS(thread local storage),以下表述正确的是
解决多线程中的对同一变量的访问冲突的一种技术
TLS会为每一个线程维护一个和该线程绑定的变量的副本
每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了
Java平台的java.lang.ThreadLocal是TLS技术的一种实现


解析:

ABD

ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制.



题目:

下面哪几个语句正确的声明一个整型的二维数组()
int a[][]=new int[][]
int b[10][10]=new int[][]
int c[][]=new int[10][10]
int []d[]=new int[10][10]


解析:

  1. 定义一维数组时,必须显式指明数组的长度;
  2. 定义***数组时,其一维数组的长度必须首先指明,其他维数组长度可以稍后指定;
  3. 采用给定值初始化数组时,不必指明长度;
  4. “[]” 是数组运算符的意思,在声明一个数组时,数组运算符可以放在数据类型与变量之间,也可以放在变量之后。


题目:

下列描述正确的是( )?
类不可以多继承而接口可以多实现
抽象类自身可以定义成员而接口不可以
抽象类和接口都不能被实例化
一个类可以有多个基类和多个基接口


解析:

1.java支持单继承,却可以实现多个接口。a对d错

2.接口没有构造方法,所以不能实例化,抽象类有构造方法,但是不是用来实例化的,是用来初始化的。c对

3.抽象类可以定义普通成员变量而接口不可以,但是抽象类和接口都可以定义静态成员变量,只是接口的静态成员变量要用static final public 来修饰。

b错



题目:

关于下面一段代码,以下说法正确的是: ()
public class Test {
    private synchronized void a() {
    }
    private void b() {
        synchronized (this) {
        }
    }
    private synchronized static void c() {
    }
    private void d() {
        synchronized (Test.class) {
        }
    }
}
同一个对象,分别调用方法a和b,锁住的是同一个对象
同一个对象,分别调用方法a和c,锁住的是同一个对象
同一个对象,分别调用方法b和c,锁住的不是同一个对象
同一个对象,分别调用方法a、b、c,锁住的不是同一个对象


解析:

修饰非静态方法 锁的是this 对象

修饰静态方法 锁的是class对象