练习题

Posted You295

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习题相关的知识,希望对你有一定的参考价值。

练习题(四)

1.Statement和PreparedStatement有什么区别?哪个性能更好?

1.statement和PreparedStatement都是主要对sql语句的执行

2.statement每次执行一条sql语句就会生成一条执行计划,如果是执行99条sql语句,同样就会生成99条执行计划。 但是PreparedStatement在执行相同功能的sql语句时,仅仅是参数不同时,他也只需要执行编译一次,适合批量处理。

3.Statement对象会造成 SQL注入漏洞 的问题。PreparedStatement对象中的语句是可以带参数的,可以避免使用字符串拼接sql语句所出现的不安全现象。

4.PreparedStatement更加的安全,执行的效率更高。

2.transient关键字的作用

1.使用transient关键字修饰的属性,在保存该对象时,该属性不会被保存。

2.transient用于修饰不需要被序列化的字段,如果一个引用类型被transient修饰,那么其反序列化的值为null;如果一个基本数据类型被transient修饰那么他反序列化的值为0 ; 如果该字段的引用类型是不可被序列化的类,则也应该使用transient修饰,它在序列化的时候会被直接跳过。

注意:
1)transient只能修饰变量,而不能修饰方法和类。
2)被static关键字修饰的变量不能再被序列化,一个静态变量不管有没有被transient修饰均不能被序列化。
被final关键字修饰的变量不会被transient关键字所影响,是可以正常序列化的,final变量将直接通过值参与序列化。

3.mysql中使用delete和trucate删除表中数据的区别

1.使用delete时删除表中的所有数据,会记录原始数据的id最大值

  1. 使用trucate删除表中所有的数据,先摧毁整个表的结构,然后再重新创建,不会记录原始数据的id最大值,id重新开始从头计算。

4.死锁的四个必要条件

1)不可抢占:进程以及获得的资源,没有外界力量来抢占它,资源是可以自动放弃的。
2)互斥:一个资源同时只能被一个线程使用。
3)请求与保持:进程必须占有资源,再去申请;例如请求第二把锁的时候,必须保持自己的第一把锁不被释放。
4)循环等待:两个线程时,是你等我释放锁,我等你释放锁,多个线程时,是头尾相接的等待–如同一个环形公路一样。

5.解释脏读,不可重复读,幻读,mysql默认使用的隔离策略是什么?

1)脏读:一个事务在处理的过程中读取了另外一个事务还没有提交的的事务的数据。
2)不可重复读:一个事务在运行的期间,两个去查找同一个表中的数据,查到的数据是不同的。
3)幻读:在一个事务中读取到了别的事务插入的数据,导致前后两次查询到的结果不一样。

Mysql的默认使用的隔离策略是:可重复读(Repeatable read)

6.concurrentHashMap是如何实现线程安全的?

1.ConcurrentHashMap则使用了锁分段(减小锁范围)、CAS(乐观锁,减小上下文切换开销,无阻塞)

2.ConcurrentHashMap不允许键对值为空

3.JDK1.7和JDK1.8concurrentHashMap变化比较:

1)结构上:取消了原先的Segment设计,取而代之的是使用与HashMap相同的数据结构,但是内部仍然还是有Segment定义,但是仅仅是为了保证序列化时的兼容性而已,在结构上没有其他的作用。 哈希表+红黑树,引入了懒加载机制。(1.7中一上来就立刻初始化;1.8中在第一次使用put时才开始初始化)
2.线程安全:锁的粒度更细,由原来的锁Segment一片区域到锁桶的头结点。 由原来的ReentrantLock(可重入锁)替换为Sychronized+CAS。
现在版本的Sychronized已经不断地优化,性能上与ReentrantLock基本上没有差别。 并且使用Sychronized还可以节约大量的内存空间。(原来的ReentrantLock下的segment都要加入同步队列,继承AQS下的Node,然而Sychronized知识锁住头结点,头结点下边的节点都不会加入同步队列中,节省了空间)。

7.简述ThreadLocal的工作原理及流程?

ThreadLocal是一个线程内部的数据存储类,通过他可以再指定的线程中存储数据,并且在数据储存之后,也只能在指定的线程中获取到存储的数据。故可以使每个线程都可以独立的改变自己的副本,而不影响其他线程所对应的副本。

void set(T value):设置当前线程的局部变量的值。

T get():返回当前线程所对应的线程局部变量。

void remove():将当前线程局部变量的值删除,目的是减少内存的占用,当线程结束后,对应变量的局部变量将自动被垃圾回收。

T initialValue():返回该线程局部变量的初始值。

8.举例说明内部类,静态内部类,匿名内部类?

内部类:HashMap中的Values,KeySet,EntrySet以及TreeMap中的EntrySet,value

静态内部类:LinkedList中的Node节点就是静态内部类。

匿名内部类:Comparator中的Compare方法在创建的时候,就可以使用匿名内部类的方法来创建实现

9.String str="i"与String str = new String(“i”)一样吗?

不一样,第一种会将其分配到常量池中,第二种java虚拟机会将其分配到堆内存中。
分配到常量池中假如再来一个String str1 = “i” , 这时因为常量池中有 i , 虚拟机会直接将地址值赋给str1,“i”对象不会再重新创建,他们引用的是同一个地址,共享同一个i内存。
分配到堆内存中假设在有一个String str2 = new String(“i”),则会重新创建一个对象,然后将新的对象地址值赋给str2。虽然str和str2的值相同,但是他们的地址值不同。

10.new String(“a”)+new String(“b”)会创建几个对象?

分析:1)若是常量池中有 “a”,“b” 对象,那么两个“new”就会创建两个对象,并且体重说明是将new出的两个对象用“+”连接在一起,那么就需要用StringBuuffer进行拼接,故又需创建一个对象,这就是一共创建3个。
2)若是常量池中没有“a“,“b” 对象,那么就会创建出5个对象。
3)若常量池中存在"a" , “b” 对象中的一个,那么就会创建出4个对象

以上是关于练习题的主要内容,如果未能解决你的问题,请参考以下文章

如何让marquee文字滚动头尾相连?

python3字符串常用操作练习

Python怎么先排序再去头尾再累加?

获取两个日期之间的月份 (具体月份)一个是包含头尾 一个不包含头尾

头尾固定高度中间高度自适应布局

英语学习第12周翻译练习