目录
在 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的生命周期一般可以用三个方法来表示:
- init():仅执行一次,负责在装载Servlet时初始化Servlet对象
- service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。
- 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的语句,此语句会将被赋值的变量自动强制转化为相对应的类型。