Java习题
1.类加载器有哪些分类?
①、启动类加载器(Bootstrap ClassLoader)
负责将存放在 <JAVA_HOME>/lib 目录中的,或者被-Xbootclasspath 参数所指定的路径中的,并且是虚拟机按照文件名识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。
启动类加载器无法被Java程序直接引用。
JDK 中的源码类大都是由启动类加载器加载,比如前面说的 java.lang.String,java.util.List等,需要注意的是,启动类 main Class 也是由启动类加载器加载。
②、扩展类加载器(Extension ClassLoader)
这个类加载器由 sun.misc.Launcher$ExtClassLoader 实现,负责加载<JAVA_HOME>/lib/ext 目录中的,或者被 java.ext.dirs 系统变量所指定的路径中的所有类库。
开发者可以直接使用扩展类加载器。
③、应用程序类加载器(Application ClassLoader)
由 sun.misc.Launcher$AppClassLoader 实现。由于这个类加载器是 ClassLoader.getSystemClassLoader() 方法的返回值,所以一般也称它为系统类加载器。
它负责加载用户类路径ClassPath上所指定的类库,开发者可以直接使用这个类加载器。如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
通常项目中自定义的类,都会放在类路径下,由应用程序类加载器加载。
④、自定义类加载器(User ClassLoader)
这是由用户自己定义的类加载器,一般情况下我们不会自定义类加载器,但有些特殊情况,比如JDBC能够通过连接各种不同的数据库就是自定义类加载器来实现的,具体用处会在后文详细介绍。
2.简述双亲委派模型?
双亲委派机制就是如果一个类加载器收到了类加载请求,它首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有父类加载器反馈到无法完成这个加载请求(它的搜索范围没有找到这个类),子加载器才会尝试自己去加载。
3.HashMap和concurrentHashMap的区别?
HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。
ConcurrentHashMap让锁的粒度更精细一些,并发性能更好
就像上面所说他们之间的第一个重要的区别就是ConcurrentHashMap是线程安全的和在并发环境下不需要加额外的同步。虽然它不像Hashtable那样需要同样的同步等级(全表锁),但也有很多实际的用途。
你可以使用Collections.synchronizedMap(HashMap)来包装HashMap作为同步容器,这时它的作用几乎与Hashtable一样,当每次对Map做修改操作的时候都会锁住这个Map对象,而ConcurrentHashMap会基于并发的等级来划分整个Map来达到线程安全,它只会锁操作的那一段数据而不是整个Map都上锁。
ConcurrentHashMap有很好的扩展性,在多线程环境下性能方面比做了同步的HashMap要好,但是在单线程环境下,HashMap会比ConcurrentHashMap好一点。
总结一下以上两者的区别,它们在线程安全、扩展性、同步之间的区别。如果是用于缓存的话,ConcurrentHashMap是一个更好的选择,在Java应用中会经常用到。ConcurrentHashMap在读操作线程数多于写操作线程数的情况下更胜一筹
4.创建表语句:
创建表 book:bookid 整型 主键,name 变长字符 非空约束 ,price 整数位5位,小数2位,pubDate 日期,authorid 外键
创建 author: aid 整型 主键,name 变长字符,非空约束,birthday 日期。
5.根据上表,
1)查询出 一个月前出版的价格高出平均工资的所有的图书信息。
2)查询出出版图书数量超过2本的作者的所有图书的信息。
3)查询出同时编写了Java的图书(书名中包含关键字)的作者编写的其他所有的图书。
4)查询出没有编写过java图书的作者
create table author
(
aid int primary key,
name varchar2(20) not null,
birthday date
);
create table book(
bookid int primary key,
name varchar2(50) not null,
price float(7,2),
authorid int,
foreign key(authorid) references author(aid)
);
insert into book(bookid,name,price,authorid,pubdate)values(1,'java实战',31,1,sysdate-20);
insert into book(bookid,name,price,authorid,pubdate)values(2,'JavaWeb入门和提高',45,1,sysdate-50);
insert into book(bookid,name,price,authorid,pubdate)values(5,'spring实战',35,1,sysdate-20);
insert into book(bookid,name,price,authorid,pubdate)values(3,'我要学Java',40,2,sysdate-40);
insert into book(bookid,name,price,authorid,pubdate)values(4,'springboot技术详解',25,2,sysdate-10);
insert into book(bookid,name,price,authorid,pubdate)values(6,'Hibernate原理',65,3,sysdate-10);
select * from author f or update;
select * from book for update;
-- 1)查询出 一个月前出版的价格高出平均价格的所有的图书信息。
select * from book where pubdate<sysdate-30 and price > (select avg(price) from book)
-- 2)查询出出版图书数量超过2本的作者的所有图书的信息。
select * from book bk where (select count(*) from book where authorid=bk.authorid)>2
-- 3)查询出同时编写了Java的图书(书名中包含关键字)的作者编写的其他所有的图书。
select * from book bk where authorid in
(select authorid from book where upper(name) like upper('%Java%')) and upper(name)not like upper('%Java%')
-- 4)查询出没有编写过java图书的作者
select * from author a
where not exists(select * from book where authorid=a.aid and upper(name) like upper('%Java%'))
select * from author a
where aid not in(select authorid from book where upper(name) like upper('%Java%'))