7月24日

本文详细介绍了Java中的类加载器,包括启动类加载器、扩展类加载器、应用程序类加载器和自定义类加载器,以及双亲委派模型的工作原理。接着,对比了HashMap和ConcurrentHashMap在并发安全、性能和扩展性上的差异。此外,还提供了创建表的SQL语句,并给出了四个关于图书和作者信息的查询示例,涉及时间条件、数量统计、字符串匹配和不存在性判断等查询操作。
摘要由CSDN通过智能技术生成

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%'))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YMurmansk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值