java题库2文档格式.docx
《java题库2文档格式.docx》由会员分享,可在线阅读,更多相关《java题库2文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。
6.线程和进程的区别?
线程和进程的区别如下:
1)一个进程至少有一个线程。
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
2)线程在执行过程中与进程的区别在于每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
3)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。
但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。
7简述线程的状态及其转换?
线程之间的状态转换如下:
1)New,创建一个线程,但是线程并没有进行任何的操作。
2)Runnable,新线程从New状态,调用start方法转换到Runnable状态。
线程调用start方法向线程调度程序(JVM或者是操作系统)注册一个线程,这个时候一切就绪只等CPU的时间。
3)Running,从Runnable状态到Running状态,线程调度根据调度策略的不同调度不同的线程,被调度执行的线程进入Running状态,执行run方法。
4)Dead状态,从Running状态到Runnable,run方法运行完毕后,线程就会被抛弃,线程就进入Dead状态。
5)Block状态,从Running状态到Block状态,如果线程在运行的状态中因为I/O阻塞、调用了线程的sleep方法以及调用对象的wait方法则线程将进入阻塞状态,直到这些阻塞原因被结束,线程进入到Runnable状态
8.简述线程的两种创建方式以及它们的区别?
创建线程的两种方式:
1)使用Thread创建线程。
Thread类是线程类,其每一个实例表示一个可以并发运行的线程。
我们可以通过继承该类并重写run方法来定义一个具体的线程。
其中重写run方法的目的是定义该线程要执行的逻辑。
启动线程时调用线程的start()方法而非直接调用run()方法。
start()方法会将当前线程纳入线程调度,使当前线程可以开始并发运行。
当线程获取时间片段后会自动开始执行run方法中的逻辑。
2)使用Runnable创建线程。
实现Runnable接口并重写run方法来定义线程体,然后在创建线程的时候将Runnable的实例传入并启动线程。
两种创建线程方式的区别:
使用Thread创建线程,编写简单,可以直接操纵线程,无需使用Thread.currentThread(),但是不能够再继承其他类。
使用Runnable创建线程可以将线程与线程要执行的任务分离开减少耦合,同时Java是单继承的,定义一个类实现Runnable接口,这样该类还可以继承自其他类。
9.简述SAX和DOM解析方式的不同?
DOM:
(DocumentObjectModel,即文档对象模型)是W3C组织推荐的处理XML的一种方式。
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成各个Node对象(节点)。
优点:
把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点:
如果文件比较大,内存有压力,解析的时间会比较长
SAX(simpleAPIforXML)是一种XML解析的替代方法。
相比于DOM,SAX是一种速度更快,更有效的方法。
它逐行扫描文档,一边扫描一边解析。
而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。
优点:
解析可以立即开始,速度快,没有内存压力
不能对节点做修改
10.final,finally,finalize的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
JVM不保证此方法总被调用。
11.简述几种主流的数据库及其厂商?
主流的数据库及其厂商如下:
1)Oracle数据库是著名的Oracle(甲骨文)公司的数据库产品,Oracle数据库是世界上第一个商品化的关系型数据库管理系统;
Oracle数据库采用标准SQL(结构化查询语言),支持多种数
据类型,提供面向对象的数据支持,具有第四代语言开发工具,支持UNIX、WINDOWS、OS/2等多种平台;
Oracle公司的产品丰富,包括Oracle服务器、Oracle开发工具和Oracle应用软件,
其中最著名的就是Oracle数据库。
2)DB2是IBM公司的关系型数据库管理系统。
DB2有很多不同的版本,可以运行在从掌上产品到大型机不同的终端机器上;
DB2UniversalDatabasePersonalEdition和DB2Universal
DatabaseWorkgroupEdition分别是单用户和多用户系统,可以运行在OS/2和Windows上;
DB2是Oracle的主要竞争对手。
3)Sybase是美国Sybase公司的关系型数据库系统。
Sybase是较早采用C/S技术的数据库厂商;
典型的UNIX或WindowsNT平台上客户机/服务器环境下的大型数据库系统;
Sybase通常与
SybaseSQLAnywhere用于客户机/服务器环境,前者作为服务器数据库,后者为客户机数据库,采用该公司研制的PowerBuilder为开发工具,在国内大中型系统中具有广泛的应用;
Sybase公司2010年被SAP收购。
4)MicrosoftSQLServer是微软的产品,运行在WindowsNT服务器上。
MicrosoftSQLServer的最初版本适用于中小企业,但是应用范围不断扩展,已经触及到大型、跨国企业的数据库管理。
5)MySQL是开放源码的小型关系型数据库管理系统。
广泛应用在中小型网站中,成本低、规模较Oracle和DB2小;
2008年1月16日,Sun收购MySQL。
2009年4月20日,SUN被Oracle公司收购,
所以MySQL现在属于Oracle公司。
12.简述索引的原理及创建索引的意义
索引是对表的一列或多列进行排序的结构。
因为绝大多数的搜索方法在搜索排序结构时效率都会大大提高,所以如果表中某一列经常被作为关键字搜索,则建议对此列创建索引。
索引提供指针以指向存储在表中指定列的数据值,根据指定的排序次序排列这些指针。
数据库使用索引的方式与使用书的目录很相似:
通过搜索索引找到特定的值,然后跟随指针到达包含该值的行。
例如“OracleSQLReference”这本书,如果要查找OracleSQL的操作符部分,可以通过以下两种方式。
13.Oracle和Mysql数据库的分页怎么写?
1)oracle数据库分页
select*from(selecta.*,rownumrcfrom表名whererownum<
=endrow)awherea.rc>
=startrow
2)MySQL数据库分页
Select*from表名limitstartrow,pagesize(Pagesize为每页显示的记录条数)
14.主键和唯一索引的区别?
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值+唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
在RBO模式下,主键的执行计划优先级要高于唯一索引。
两者可以提高查询的速度。
15、如何查询时去除重复数据?
并且删除重复记录
比如现在有一人员表(表名:
peosons)
若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来
复制代码代码如下:
selectp1.*
frompersonsp1,personsp2
wherep1.id<
>
p2.id
andp1.cardid=p2.cardidandp1.pname=p2.pnameandp1.address=p2.address
可以实现上述效果.
几个删除重复记录的SQL语句
(1)用rowid方法
(2)用groupby方法
(3)用distinct方法
1)用rowid方法
据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:
查数据:
select*fromtable1awhererowid!
=(selectmax(rowid)
fromtable1bwherea.name1=b.name1anda.name2=b.name2......)
删数据:
deletefromtable1awhererowid!
2)groupby方法
selectcount(num),max(name)fromstudent--列出重复的记录数,并列出他的name属性
groupbynum
havingcount(num)>
1--按num分组后找出表中num列重复,即出现次数大于一次
deletefromstudent
1
这样的话就把所有重复的都删除了。
3)用distinct方法-对于小的表比较有用
createtabletable_newasselectdistinct*fromtable1minux
truncatetabletable1;
insertintotable1select*fromtable_new;
16.什么是内连接和外连接?
内连接:
内联接是用比较运算符比较要联接列的值的联接。
外连接:
包括左向外联接、右向外联接或完整外部联接。
(1)左连接:
leftjoin或leftouterjoin
左向外联接的结果集包括LEFTOUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。
如果左表的某行在右表中没有匹配行,
则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
(2)右连接:
rightjoin或rightouterjoin
右向外联接是左向外联接的反向联接。
将返回右表的所有行。
如果右表的某行在左表中没有匹配行,则将为左表返回空值。
(3)完整外部联接:
fulljoin或fullouterjoin
完整外部联接返回左表和右表中的所有行。
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。
如果表之间有匹配行,则整个结果集行包含基表的数据值。
17.Oracle和Mysql的区别
1)Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高。
2)Oracle支持大并发,大访问量,是OLTP最好的工具。
3)安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
4)Oracle也Mysql操作上的一些区别
①主键
Mysql一般使用自动增长类型,在创建表时只要指定表的主键为autoincrement,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;
Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;
只是ORM框架是只要是native主键生成策略即可。
②单引号的处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。
在插入和修改字符串前必须做单引号的替换:
把所有出现的一个单引号替换成两个单引号。
③翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;
ORACLE处理翻页的SQL语句就比较繁琐了。
每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<
100,不能用ROWNUM>
80
④长字符串的处理
长字符串的处理ORACLE也有它特殊的地方。
INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。
插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
⑤空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。
按MYSQL的NOTNULL来定义ORACLE表结构,导数据的时候会产生错误。
因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
⑥字符串的模糊比较
MYSQL里用字段名like'
%字符串%'
ORACLE里也可以用字段名like'
但这种方法不能使用索引,速度不快。
⑦Oracle实现了ANSIISQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的弱。
18.处理数据库大数据量下的分页解决方法?
答:
最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页数据内容,再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。
总结:
简单就是用sql分页语句进行分页;
再大的数据量可以考虑对大的结果集,通过游标定位方式来获取某页的数据。
扩展:
(说说你对数据库大数据量怎么处理)?
可以用分区功能:
范围分区:
范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
如根据序号分区,根据时间等来进行分区。
Hash分区(散列分区):
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
也就是只命名分区名称,这样均匀进行数据分布。
复合分区:
有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。
复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法。
19.简述where子句中为什么不能写rownum?
ownum是伪列,随着结果集生成,返回的第一行分配的是1,第二行是2等等,生成的结果是依次递加的,没有1就不会有2,不返回的就不算,而且一旦生成,就不会变化。
第一条返回的结果的rownum为1,不支持where做大于查询,只能做<
和<
=,但并不会报错,只是返回的数据为空,这是因为根本不能满足这样的where条件。
如whererownum>
2,取回第1条数据的rownum为1,不满足,就舍弃这条记录。
再看下一条,然后取第2条数据的rownum还是为1,还是不满足,再舍弃。
以此类推,最终舍弃了所有的数据,这就是所谓不支持的原因。
20.简述视图的意义
视图的意义在于两个方面:
1)简化复杂查询。
如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可。
2)限制数据访问。
视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其它列起到安全和保密的作用。
21.列举需要创建索引以及不适合创建索引的场合
适合创建索引的场合为:
1)为经常出现在WHERE子句中的列创建索引。
2)为经常出现在ORDERBY、DISTINCT后面的字段建立索引。
如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致。
3)为经常作为表的连接条件的列上创建索引
不适合创建索引的场合为:
1)不要在经常做DML操作的表上建立索引。
2)不要在小表上建立索引。
3)限制表上的索引数目,索引并不是越多越好。
22.简述主键选取的原则
主键的选取原则如下:
1)主键应是对系统无意义的数据。
2)永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途。
3)主键不应包含动态变化的数据,如时间戳。
4)主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义。
5)主键尽量建立在单列上。
23.数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。
如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。
如果所有操作完成,
事务则提交,其修改将作用于所有其他数据库进程。
如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
24.sql语句优化有哪些?
1)尽量避免非操作符的使用。
2)避免对查询的列的操作。
3)避免不必要的类型转换。
4)增加查询的范围限制。
5)合理使用IN与EXISTS(关系条件只有一个列时,用IN比较合适,否则用EXISTS比较合适)
6)尽量去掉<
避免全表扫描。
7)去掉WHERE子句中ISNULL和ISNOTNULL(不会使用索引而是进行全表搜查)、
8)尽量不要使用前导模糊查询(前面有%的like查询,不能使用索引);
9)SELECT子句中避免使用"
*"
(数据库在解析的过程中,会将"
转化成所有的列名,这是通过查询数据字典完成的,这意味着将耗费更多时间)
10)规范所有的SQL关键字的书写(如SELECT,update...要么都大写,要么都小写)
25.如何通过JDBC链接数据库?
连接数据库的步骤:
1):
加载驱动Class.forName(...)
2):
建立连接DriverManager
3):
创建Statement
4):
执行SQL
5):
若有结果集,遍历结果集ResultSet
6):
通过Statement继续其他数据库操作
7):
与数据库断开连接
26.Statement和PreparedStatementsql语句插入时都分别用了什么方法?
tatement提供了针对不同种类SQL的执行方法
booleanexecute(Stringsql)
可以执行所有类型的SQL,但常用来执行DDL
,返回值为true则表示该SQL执行后有查询结果集
,所以,只有执行DQL后才会返回true
intexecuteUpdate(Stringsql)
专门用来执行DML语句
,返回值为影响了数据库指定表的记录数
ResultSetexecuteQuery(Stringsql)
专门用来执行DQL语句
返回值为查询出来的结果集
PreparedStatement提供了针对不同种类SQL的执行方法
返回值为查询出来