面试题整理(答案从网上找到后整理的)

1、 java中如何把String型转化成double型的

String s = "123.345";
double num = Double.parseDouble(s);

当string里的数字比较大时:

例如:
字符串“1467000000”通过Double.parseDouble以后转化为double类型,然后我用它除以100000000。结果得到的值变成14.669999999999998。再转化成字符串与“14.67”比较,结果是不相等。

精 度的问题!用基本类型的double类型进行运算可能会丢失精度。而且特别大的数又没法处理。所以如果用BigDecimal这个类问题就解决了。这个类 在java.Math包下。它可以处理任意精度的数据。对于楼主出现的问题,我从新写了段代码,供楼主参考。但是主要是还得查看API!代码如下:

import java.math.*;

public class oopp

{

 public static void main(String[] args)

 {

  String a="1467000000";

  double aa=Double.parseDouble(a);

  BigDecimal beichushu=new BigDecimal(aa);

  BigDecimal chushu=new BigDecimal(100000000);

  BigDecimal result=beichushu.divide(chushu,new MathContext(4));//MathConText(4)表示结果精确4位!

  boolean isTrue=String.valueOf(result).equals("14.67");

  System.out.println("1467000000除以100000000="+result);

  System.out.println(result+"与14.67比较的结果是"+isTrue);

 }

}

2、 Java double转String  

把 一个double类型的值转成string,网上有很多的方法,包括用String.valueOf(Double d),或者 String str = "" + d, 或者用DecimalFormat df = new DecimalFormat("#.00"), 以及用NumberFormat类等。但是,当double的值特别大的时候,这些方法都是没有用的,因为double类型被转化成科学计数法了,对于小 数点后面的值就没有保存。后来发现用BigDecimal bd = new BigDecimal(d),然后调用bd.setScale(arg0, arg1)这个方法特别有效。

3、 JNDI是java访问名字和目录服务的接口 

4、 写出sql查询数据库中的第5-10条记录

sql server 方案1:

select top 6 * 
from Table 
where table_Id not in (select top 4 tableId from Table)

===============================

通用公式:查询sql server数据库中的第m到n条记录

select top (n-m+1) *  from t where id in (select top (m-1) id from t order by id) order

by id desc

================================

查询Sql Server数据库中后10条记录

SELECT TOP 10 FROM 表名 ORDER BY 排序列 DESC

 

mysql 方案:

select * from t order by id limit 5,6

==============================

select * from t order by id limit m,(n-m+1)

mysql 中limit的用法:

select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。

===============================

查询Mysql数据库中后10条记录

select * from t order by id  desc limit 10

 

oracle 方案:

select * from (select  rownum r,* where r<=10) where r > 4

===========================================

select * from (select rownum r,* from t where r<=n)  where r>m-1

===========================================

查询Oracle数据库中后10条记录

select * from t where rownum <=10 order by id desc

其中rownum为oracle的关键字

5、 写出学生信息的xml文件

写一个XML文件,文件里的内容有姓名,年龄,注册时间(要Date格式的),大概写三四个成员就可以了

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <studetns>
    <student>
      <name>saa</name>
      <age>14</age>
      <CreateDate>2010-11-11</CreateDate>
    </student>
    <student>
      <name>sa</name>
      <age>14</age>
      <CreateDate>2010-11-11</CreateDate>
    </student>
    <student>
      <name>saaa</name>
      <age>14</age>
      <CreateDate>2010-11-11</CreateDate>
    </student>
  </studetns>
</root>

6、 查询班级中的男生人数,女生人数

学生表(所在班级,性别)
现要得出一张表,(班级,男数,女数)

select 所在班级,男生人数=sum(case when 性别=

'男' then 1 else 0 end),
    女生人数=sum(case when 性别='女' then 1 else 0 end) 
from 学生表
group by 所在班级

7、 tcp和udp的区别

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
  UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。

tcp协议和udp协议的差别
TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
应用场合 传输大量数据 少量数据
速度 慢 快

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它 们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

8、 linux下进程间通信(IPC)的几种主要手段简介:

  1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
  2. 信 号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了 支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了 实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
  3. 报文(Message)队列(消息队 列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。
  4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
  6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

9、 程序 进程 线程的区别

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 

简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 

线程的划分尺度小于进程,使得多线程程序的并发性高。 

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 

10、    JDBC 连接Mysql

 Class.forName(“com.mysql.jdbc.Driver”)

 Connection connectMySQL  =  DriverManager.geiConnection(“jdbc:mysql://localhost:3306/myuser","root" ,"root" );

Statement statamentMySQL =connectMySQL.createStatement();

 statement.excuteUpdate( "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ; 

ResultSet resultSel = statement.executeQuery( "select * from staff" );

11、    数据库三范式是什么

第一范式(1NF):字段具有原子性,不可再分。

第二范式就是非主属性非部分依赖于主关键字

第三范式(3NF)要求一个

数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:

1,每一列只有一个值

2,每一行都能区分。

3,每一个表都不包含其他表已经包含的非主关键字信息。

12、      SAX与DOM解析XML的区别

解析xml有四种方法:DOM,SAX,DOM4j,JDOM.
   我们主要学了两种:DOM和SAX.
     DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。

SAX是基于事件流的解析,DOM是基于XML文档树结构的解析
     DOM和SAX的不同:
     1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。
     2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。
     3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不行。SAX是从文档开始执行遍历的。并且只能遍历一次。也就是说我们不能随机的访问XML文件,只能从头到尾的将XML文件遍历一次(当然也可以中间截断遍历)。

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。

13、    多线程

 Java线程的创建和启动:
可以有两种方式创建新的线程:
第一种:
1.定义线程类实现Runnable接口
2.Thread myThread = new Thread(target);   //target为Runnable接口类型
3.Runnable中只有一个方法:public void run();用以定义线程运行体
4.使用Runnable接口可以为多个线程提供共享的数据
5.在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用

第二种:
1.可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thread {   
public void run() {...}
}   
2.然后生成该类的对象:
MyThread myThread = new MyThread();

14、    Java是Unicode编码,unicode码是2个字节

15、    非常有用的Java程序片段

http://developer.51cto.com/art/201306/398347_1.htm

16、    在Hashtable上下文中同步是什么意思?

同步意味着在一个时间点只能有一个线程可以修改哈希表,任何线程在执行hashtable的更新操作前需要获取对象锁,其他线程等待锁的释放。

17、    HashMap不是同步的,而Hashtable是同步的。

18、    Hibernate中load()和get()的区别:

load加载方法:

Java代码

Users user = (Users)session.load(Users.class, userId);    

Users user = (Users)session.load(Users.class, userId);

这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

get加载方法:

Java代码

Users user = (Users)session.get(Users.class, userId);  

Users user = (Users)session.get(Users.class, userId);

则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

两加载方法区别:

区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如 果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异 常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

19、    Struts 2框架组成

本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。

核心控制器 FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。

业务控制器Action和业务逻辑组件是需要用户来自己实现的。

用户在开发Action和业务逻辑组 件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。

 Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。

20、    Struts2基本简要流程如下:

1、  客户端浏览器发出HTTP请求。

2、根据web.xml配置,该请求被 FilterDispatcher接收。

3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。

4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。

5、Action执行完毕,根据 struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。

21、Ajax的优点 
    Ajax的给我们带来的好处大家基本上都深有体会,在这里我只简单的讲几点: 
1、最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。 
2、使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。 
3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。

 

 

原文地址:https://www.cnblogs.com/sophine/p/3083921.html