Java错题集(十五)

目录

下列叙述错误的是( )

在java7中,下列不能做switch()的参数类型是?

volatile关键字的说法错误的是

有如下一段代码,请选择其运行结果()

在 hibernate 开发中,关于 POJO 类对象的状态说法正确的是()。

以下哪种JAVA得变量声明方式可以避免程序在多线程竞争情况下读到不正确的值(  )

Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是()。

以下多线程对int型变量x的操作,哪几个不需要进行同步(    )

下述说法正确的是()

由3 个“1”和 5 个“0”组成的 8 位二进制补码,能表示的最小整数()

面向对象程序设计方法的优点包含:

以下那些代码段能正确执行


下列叙述错误的是( )

正确答案: C   你的答案: C (正确)

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

来源:https://www.nowcoder.com/questionTerminal/1bb5f20d8b004560a2dfc27ef8116b0c

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等等

 

在java7中,下列不能做switch()的参数类型是?

正确答案: D   你的答案: D (正确)

int型
枚举类型
字符串
浮点型

来源:https://www.nowcoder.com/questionTerminal/8be1ad1273b944128d04cf9e831cce16

switch支持 int及以下(char, short, byte),String, Enum

 

volatile关键字的说法错误的是

正确答案: A   你的答案: A (正确)

能保证线程安全
volatile关键字用在多线程同步中,可保证读取的可见性
JVM保证从主内存加载到线程工作内存的值是最新的
volatile能禁止进行指令重排序

来源:https://www.nowcoder.com/questionTerminal/521a37038afc4dd49f3d92a12b9a5907

1.java的内存模型

java 内存模型规定了所有的变量都存储在主内存中,但是每个线程会有自己的工作内存,线程的工作内存保存了该线程中使用了的变量(从主内存中拷贝的)线程对变量的操作都必须在工作内存中进行,不同线程之间无法直接访问对方工作内存中的变量,线程间变量值传递都要经过主内存完成

图片说明

 

2.什么是原子性

一个操作是不可中断的,要么全部执行成功要么全部执行失败,比如银行转账

 

3.什么是可见性

当多个线程访问同一变量时,一个线程修改了这个变量的值,其他线程就能够立即看到修改的值

 

4.什么是有序性

程序执行的顺序按照代码的先后顺序执行

1

2

int a = 0; //1

int b = 2; //2

像这2句代码1会比2先执行,但是jvm在正真执行时不一定是1在2之前,这里涉及一个概念叫做指令重排,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。比如上面的代码语句1和语句2谁先执行对最终的程序结果并没有影响,那么就有可能在执行过程中,语句2先执行而语句1后执行。
在指令重排时会考虑指令之间的数据依赖性,比如2依赖了1的数值,那么处理器会保证1在2之前执行。
但是在多线程的情况下,指令重排就会有影响了。

 

5.volatile到底做了什么

  • 禁止了指令重排
  • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的
  • 不保证原子性(线程不安全)

 

有如下一段代码,请选择其运行结果()

public class StringDemo{
  private static final String MESSAGE="taobao";
  public static void main(String [] args) {
    String a ="tao"+"bao";
    String b="tao";
    String c="bao";
    System.out.println(a==MESSAGE);
    System.out.println((b+c)==MESSAGE);
  }
}

正确答案: C   你的答案: D (错误)

true true
false false
true false
false true

来源:https://www.nowcoder.com/questionTerminal/10afeae4a5c24a35898c0771fb5995b1

public static void main(String[] args) {

    String a = "tao" + "bao";

    String b = "tao";

    String c = "bao";

    //true, taobao在字符串常量池已经存在,因此String a = "tao" + "bao";执行后,a也指向常量池中该字符串,因此引用相同

    System.out.println(a == MESSAGE);

    /*

     * false

     * 1. Java对String的相加是通过StringBuffer实现的,先构造一个StringBuffer里面存放"tao",然后调用append()方法追加"bao",然后将值为"taobao"的StringBuffer转化成String对象。

     * 2. 很明显新返回的对象和MESSAGE不是指向同一个地方,返回的对象指向堆中String对象,MESSAGE指向常量区中字符串,即两者引用不同

     */

    System.out.println((b + c) == MESSAGE);

}


这题是在考编译器的优化,hotspot中 编译时"tao"+"bao"将直接变成"taobao"b+c则不会优化,因为不知道在之前的步骤中bc会不会发生改变,而针对b+c则是用语法糖,新建一个StringBuilder来处理

 

在 hibernate 开发中,关于 POJO 类对象的状态说法正确的是()。

正确答案: A B C   你的答案: A B C D (错误)

自由状态(Transient):实体在内存中自由存在,与数据库中的记录无关
持久状态(Persistent):实体处于由Hibernate框架所管理的状态,对应了数据库中的一条记录,同时与某个session实例发生了关联
游离状态(Detached):在session 关闭之后,可以使对象从持久状态转换到游离状态。
不能将对象从游离状态转换成持久态

来源:https://www.nowcoder.com/questionTerminal/569d3a78e488437d95c160ce644e0673

Hibernate Pojo的三态分别为transient(瞬时态),persistent(持久态),detached(游离态)

 

1、官方给出的三态与Session的关系如下:

短暂的: 从来没有执着,没有关联的任何会话
持久性: 具有唯一的会话相关的
分离: 以前执着,不与任何Session关联

 

2、三种状态间相互转换关系,及他们在数据库、session中的状态如下:

a.当我们new一个pojo时,它处于瞬时态,此时与session、数据库均无任何关联。

b.此后,我们获得session并开启hibernate事务,调用save(),persist(),saveOrUpdate()方法,将pojo转变为持久态,此时session中存有这个pojo,但直到transaction.commit()被调用时,sql语句才会执行,此后数据库中也才有此条数据

c.但当commit()并且session.close()执行过后,pojo就变为了游离态,也就是说,数据库中有该记录,但session中不再有。

d.持久化状态的实例,也可以重新变成瞬时态,那就是调用delete()方法。

e.通过get()或load()方法得到的pojo是持久态的。

f.游离态的pojo可以通过update(),saveOrUpdate(),lock()和replicate()方法重新成为持久态。

g.调用merge()方法后,pojo维持原态,但内容会被更新到数据库

 

以下哪种JAVA得变量声明方式可以避免程序在多线程竞争情况下读到不正确的值(  )

正确答案: A B   你的答案: A C (错误)

volatile
static volatile
synchronized
static

来源:https://www.nowcoder.com/questionTerminal/5a9e81d22a6a491aac1b6bac5d4d6036

synchronized不是修饰变量的 它修饰方法代码块对象

 

Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是()。

正确答案: A C D   你的答案: A B C D (错误)

加载Servlet类及.class对应的数据
创建servletRequest和servletResponse对象
创建ServletConfig对象
创建Servlet对象

来源:https://www.nowcoder.com/questionTerminal/3dfd72f89070415185f09aebecd0e3f7
Servlet的生命周期一般可以用三个方法来表示:

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

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

 

以下多线程对int型变量x的操作,哪几个不需要进行同步(    )

正确答案: D   你的答案: D (正确)

x=y;
x++;
++x;
x=1;

来源:https://www.nowcoder.com/questionTerminal/11a7d8d366d54ff9a07c1fa054d6541b

A.由于y的值不确定,所以要加锁;

B,C 两个在多线程情况下是必须要加锁的,因为他们是先被读入寄存器,然后再进行+1操作,如果没有加锁,那么可能会出现数据异常;

D 原子操作,所以不需要加锁

    原子性:指该操作不能再继续划分为更小的操作。

    Java中的原子操作包括:     

        1、除long和double之外的基本类型的赋值操作

        2、所有引用reference的赋值操作

        3、java.concurrent.Atomic.* 包中所有类的一切操作

 

设有下面两个赋值语句:

a = Integer.parseInt("1024");

b = Integer.valueOf("1024").intValue();

下述说法正确的是()

正确答案: D   你的答案: A (错误)

a是整数类型变量,b是整数类对象。
a是整数类对象,b是整数类型变量。
a和b都是整数类对象并且它们的值相等。
a和b都是整数类型变量并且它们的值相等。

来源:https://www.nowcoder.com/questionTerminal/049f3c3b41024630887a7f596e7b450f

Integer对象的方法

Integer.parseInt("");是将字符串类型转换为int的基础数据类型

Integer.valueOf("")是将字符串类型数据转换为Integer对象

Integer.intValue();是将Integer对象中的数据取出,返回一个基础数据类型int

 

由3 个“1”和 5 个“0”组成的 8 位二进制补码,能表示的最小整数()

正确答案: B   你的答案: D (错误)

-126
-125
-32
-3

来源:https://www.nowcoder.com/questionTerminal/12d5a40a4456400fad8d3f400bc5e5cc

既然求最小整数,那肯定先想到负数,则最高位(符号位)一定为1

原码中肯定是1所在的位数越高,值越小

补码是由原码取反加1得到的

则在补码中1所在的位数一定要越低

即补码为1000 0011;

由补码求得原码:1111 1101=-(64+32+16+8+4+1)=-125;

 

面向对象程序设计方法的优点包含:

正确答案: A B C   你的答案: A B (错误)

可重用性
可扩展性
易于管理和维护
简单易懂

 

以下那些代码段能正确执行

正确答案: C D   你的答案: A C (错误)

public static void main(String args[]) {byte a = 3;byte b = 2;b = a + b;System.out.println(b);}
public static void main(String args[]) {byte a = 127;byte b = 126;b = a + b;System.out.println(b);}
public static void main(String args[]) {byte a = 3;byte b = 2;a+=b;System.out.println(b);}
public static void main(String args[]) {byte a = 127;byte b = 127;a+=b;System.out.println(b);}

来源:https://www.nowcoder.com/questionTerminal/72bdefc94545490eaad894ad89817580

byte类型的变量在做运算时被会转换为int类型的值

故A、B左为byte,右为int,会报错;

而C、D语句中用的是a+=b的语句,此语句会将被赋值的变量自动强制转化为相对应的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值