目录
5. 对于线程局部存储TLS(thread local storage),以下表述正确的是
7.程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。关于变量的叙述,正确的是()
9.JDK1.8版本之前,抽象类和接口的区别,以下说法错误的是
10、下面有关servlet中init,service,destroy方法描述错误的是?
1.在这里帮大家总结一下hashMap和hashtable方面的知识点吧:
4.Statement、PreparedStatement和CallableStatement
1.有了Reader、Writer为什么还需要InputStream、OutputStream
题目:
1.下面有关java hashmap的说法错误的是?
A HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。
B HashMap 的实现不是同步的,意味着它不是线程安全的
C HashMap通过开放地址法解决哈希冲突
D HashMap中的key-value都是存储在Entry数组中的
正确答案:C
使用的是链地址法。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
HashMap底层就是一个数组结构,数组中的每一项又是一个链表。
2.下面程序的输出结果是什么?
//看注释这种快排的思路就很清晰了,这是只从一个方向遍历的快排
public class A2 {
public static void main(String[] args) {
int[] a = { 2, 4, 6, 8, 3, 6, 9, 12 };
quickSort(a, 0, a.length - 1);
for (int i = 0; i <= a.length - 1; i++)
System.out.print(a[i] + " ");
}
private static void quickSort(int[] a, int start, int end) {
if (start < end) {
int p = core(a, start, end);
quickSort(a, start, p - 1);
quickSort(a, p + 1, end);
}
}
private static int core(int[] a, int start, int end) {
int x = a[end];
int i = start; //记录遍历完后最后一个数应该放在的位置,初始就是start,
因为如果前面没有数比最后一个数大,那么下面遍历完后最后一个数就应该放在start的位置
for (int j = start; j <= end - 1; j++) { //遍历的目的是把参与排序的这
轮数中比最后一个数大的数都放到最后一个数前面
if (a[j] >= x) {
swap(a, i, j);
i++; //每遇到一个比最后一个数大的数,最后一个数应该放的位置就+1
}
}
swap(a, i, end); //这里一交换后就把最后一个数放在了正确的位置,
这样左边的数都比最后一个数大,右边的数都比最后一个数小
return i;
}
private static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
A 找到最大值 B 找到最小值
C 从大到小的排序 D 从小到大的排序
3.下面有关SPRING的事务传播特性,说法错误的是?
A PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
B PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
C PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
D PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚
正确答案:B
PROPAGATION_REQUIRED:表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务
4.如何获取ServletContext设置的参数值?
A context.getParameter()
B context.getInitParameter()
C context.getAttribute()
D context.getRequestDispatcher()
getParameter()是获取POST/GET传递的参数值;
getInitParameter获取Tomcat的server.xml中设置Context的初始化参数
getAttribute()是获取对象容器中的数据值;
getRequestDispatcher是请求转发
5. 对于线程局部存储TLS(thread local storage),以下表述正确的是
A 解决多线程中的对同一变量的访问冲突的一种技术
B TLS会为每一个线程维护一个和该线程绑定的变量的副本
C 每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了
D Java平台的java.lang.ThreadLocal是TLS技术的一种实现
正确答案:ABD
你的答案:ABCD
参考答案:ABD C:同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其它线程的副本冲突。
6.Statement和PreparedStatement
A Statement sta=con.createStatement(); ResultSet rst=sta.executeQuery("select * from book");
B Statement sta=con.createStatement("select * from book"); ResultSet rst=sta.executeQuery();
C PreparedStatement pst=con.prepareStatement(); ResultSet rst=pst.executeQuery("select * from book");
D PreparedStatement pst=con.prepareStatement("select * from book"); ResultSet rst=pst.executeQuery();
正确答案:AD
你的答案:BC
参考答案:A,D是正确的;创建Statement是不传参的,PreparedStatement是需要传入sql语句
说一下preparedStatement和statement的区别与联系:在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。 PreparedStatement 接口继承 Statement , PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句
select colume from table where colume=1;select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行计划,可以重用
7.程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。关于变量的叙述,正确的是()
A 根据作用域规则,在函数中定义的变量只能在函数中引用
B 在函数中定义的变量,其生存期为整个程序执行期间
C 在函数中定义的变量不能与其所在函数的形参同名
D 在函数中定义的变量,其存储单元在内存的栈区
正确答案:AB 你的答案:ABD
这里主要说明D为什么是对的
首先说明栈内存和堆内存里存放的是什么
- 栈内存中存放函数中定义的一些基本类型的变量和对象的引用变量;
- 堆内存中存放new创建的对象和数组。
简单的来说,堆主要是用来存放对象的,栈主要是用来执行程序的
这么做是因为
- 栈的存取速度快,栈数据可以共享,但是栈中的数据大小和生存期必须确定,缺乏灵活性中存放一些基本类型的对象和对象句柄
- 堆是操作系统分配给自己内存,由于从操作系统管理的内存分配,所以再分配和销毁时都需要占用时间,因此用堆的效率非常低,但是优点在于编译器不需要指导从堆里分配多少存储控件,也不需要知道存储的数据要再堆里停留多长事件,因此用堆保存数据时会得到更大的灵活性
参考链接:https://blog.csdn.net/wangbo1998/article/details/80379016
8.下面哪些赋值语句是正确的()
A long test=012
B float f=-412
C int other =(int)true
D double d=0x12345678
E byte b=128
正确答案:ABD 你的答案:BD
参考答案:选ABD A和B中long和float,正常定义需要加l和f,但是long和float属于基本类型,会进行转化,所以不会报出异常。AB正确 boolean类型不能和任何类型进行转换,会报出类型异常错误。所以C错。 D选项可以这样定义,D正确。 E选项中,byte的取值范围是-128—127。报出异常: cannot convert from int to byte.所以E选项错误。
9.JDK1.8版本之前,抽象类和接口的区别,以下说法错误的是
A 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。
B abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。
C 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是 public abstract 类型的。
D abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"has-a"关系,interface表示的是"is-a"关系。
正确答案:D
D项: abstract class表示的是"is-a"关系,interface表示的是"like-a"关系
is-a:继承关系 has-a:从属关系 like-a:组合关系 参考9/30 第八题
10、下面有关servlet中init,service,destroy方法描述错误的是?
A.init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
service()方法处理客户机发出的所有请求
destroy()方法标志servlet生命周期的结束
servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的
正确答案: D
题解:
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
11..下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader()
A Thread
B Number
C Double
D Math
E ClassLoader
正确答案: A B E 你的答案:A B E (正确)
题解:
A:Thread可以被继承,用于创建新的线程
B:Number类可以被继承,Integer,Float,Double等都继承自Number类
C:Double类的声明为 public final class Doubleextends Numberimplements Comparable<Double> final声明的类不能被继承
D:Math类的声明为 public final class Mathextends Object 不能被继承
E:ClassLoader可以被继承,用户可以自定义类加载器
知识总结:
1.在这里帮大家总结一下hashMap和hashtable方面的知识点吧:
1. 关于HashMap的一些说法:
a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。
b) HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。
c) HashMap实现不同步,线程不安全。 HashTable线程安全 d) HashMap中的key-value都是存储在Entry中的。
e) HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
f) 解决冲突主要有三种方法:定址法,拉链法,再散列法。HashMap是采用拉链法解决哈希冲突的。 注: 链表法是将相同hash值的对象组成一个链表放在hash值对应的槽位; 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。 拉链法解决冲突的做法是: 将所有关键字为同义词的结点链接在同一个单链表中 。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。拉链法适合未规定元素的大小。
2. Hashtable和HashMap的区别:
a) 继承不同。 public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
b) Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
c) Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键, 而应该用 containsKey() 方法来判断。
d) 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
e) 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
f) Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 注: HashSet子类依靠hashCode()和equal()方法来区分重复元素。 HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值的,会去判断当前Map中是否含有该Key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。
3. Spring事务的传播属性是怎么回事?它会影响什么?
a. 七个事传播属性:
1. PROPAGATION_REQUIRED -- ⽀持当前事务,如果当前没有事务,就新建⼀个事务。这是最常⻅的选择。
2. PROPAGATION_SUPPORTS -- ⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。
3. PROPAGATION_MANDATORY -- ⽀持当前事务,如果当前没有事务,就抛出异常。
4. PROPAGATIONREQUIRESNEW -- 新建事务,如果当前存在事务,把当前事务挂起。
5. PROPAGATIONNOTSUPPORTED -- 以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。
6. PROPAGATION_NEVER -- 以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。
7. PROPAGATIONNESTED -- 如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则进⾏与 PROPAGATIONREQUIRED类似的操作。
b. 五个隔离级别:
1. ISOLATION_DEFAULT 这是⼀个PlatfromTransactionManager默认的隔离级别,使⽤数据库默认的事务隔离级别.
2. 另外四个与JDBC的隔离级别相对应:
3. ISOLATIONREADUNCOMMITTED 这是事务最低的隔离级别,它充许别外⼀个事务可以看到这个事务未提交的数 据。这种隔离级别会产⽣脏读,不可重复读和幻读。
4. ISOLATIONREADCOMMITTED 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取 该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。
5. ISOLATIONREPEATABLEREAD 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。它除了保证 ⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免不可重复读。
6. ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏 读,不可重复读外,还避免了幻读。
c. 关键词:
1、幻读:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录;
2、不可重复读:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录;
3、脏读:事务1更新了记录,但没有提交,事务2读取了更新后的⾏,然后事务T1回滚,现在T2读取⽆效。
4.Statement、PreparedStatement和CallableStatement
1.Statement、PreparedStatement和CallableStatement都是接口(interface)。
2.Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
3.
Statement接口提供了执行语句和获取结果的基本方法;
PreparedStatement接口添加了处理 IN 参数的方法;
CallableStatement接口添加了处理 OUT 参数的方法。
4.
a.Statement:
普通的不带参的查询SQL;支持批量更新,批量删除;
b.PreparedStatement:
可变参数的SQL,编译一次,执行多次,效率高;
安全性好,有效防止Sql注入等问题;
支持批量更新,批量删除;
c.CallableStatement:
继承自PreparedStatement,支持带参数的SQL操作;
支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
Statement每次执行sql语句,数据库都要执行sql语句的编译 ,
最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。
PreparedStatement是预编译的,使用PreparedStatement有几个好处
1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
2. 安全性好,有效防止Sql注入等问题。
3. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
4. 代码的可读性和可维护性
每日一记:
1.有了Reader、Writer为什么还需要InputStream、OutputStream
Reader和Writer是用于处理字符数据的输入输出,而InputStream和OutputStream是用于处理字节数据的输入输出。 //字符流 字节流
虽然在许多情况下,我们常使用Reader和Writer来处理文本文件的输入输出,但是在某些情况下,我们可能需要直接处理字节数据。以下是一些使用InputStream和OutputStream的场景:
- 处理二进制数据:当我们需要读取或写入二进制文件,如图像、音频或视频文件时,可以使用InputStream和OutputStream来处理字节数据。
- 网络通信:在网络通信中,数据以字节流的形式传输。InputStream和OutputStream提供了读取和写入字节数据的方法,可以用于处理网络套接字或网络协议。
- 处理压缩文件:压缩文件通常以字节流的形式进行读写,例如常见的ZIP、GZIP和TAR格式。使用InputStream和OutputStream可以读取和写入压缩文件的字节数据。
- 低级别操作:在某些情况下,我们可能需要对底层的字节数据进行更底层的操作,例如读取特定数量的字节、跳过指定数量的字节等。InputStream和OutputStream提供了更灵活的字节级别的操作方法。
故尽管Reader和Writer方便地处理了字符数据的输入输出,但在处理字节数据、网络通信、压缩文件等方面,InputStream和OutputStream是特别设计用于处理字节数据的输入输出类,提供了更灵活、更底层的方法和功能。
2.HashMap 和 Hashtable 有什么区别?
(1)线程安全性不同 HashMap是线程不安全的,HashTable是线程安全,在多线程并发的情况下,可以直接使用HashTabl,但是使用HashMap时必须自己增加同步处理。 (2)是否提供contains方法 HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。
(3)key和value是否允许null值 Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的value为null。
(4)数组初始化和扩容机制 HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。 Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。