java面试题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m569_y/article/details/80220116

1. JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

2. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String?

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

3. 如何利用ServletContext和ServletConfig对象获得初始化参数

String psw = config.getInitParameter("psw");

ServletContext ss = config.getServletContext();

String ppp = ss.getInitParameter("name");

4. 如何用css约束一个层不可见?

  <div style="display:none"> </div>  -----表示不可见

  <div style="display:block"> </div>------表示可见


5. 在表单中存在一组名称为checkbox1的多选框,如何才能取得这些多选框内的值?

在页面中用javaScript方式取值

<script>

      function  sss(){

         var str = document.getElementsByName("checkbox1");   

         var checkValue = new Array();      

         for(var i=0;i<str.length;i++){

            if(str[i].checked){

              alert(str[i].value);

            }

         }      

      }    

</script>

Function sss()

 Var str=document.getElementsByName(checkbox1);

 Var checkValue=new Array()

For(var i=0;i<str.length;i++){

If(str[i].checked){

Alert(str[i].value);

}

}

  Servlet中取值

   String str[] = request.getParameterValues("checkbox1");

6. 说出数据连接池的工作机制是什么?

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

7. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 
同步的实现方面有两种,分别是synchronized,waitnotify

8. 一个页面在打开时,需要处理一些事情(比如弹出一个广告页),需要定义窗口的什么事件?

<script>

        window.οnlοad=function(){…}

</script>

 

或是

<body οnlοad="">

10. 描述forward redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,目标地址可以接收request 请求参数,然后把结果发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求哪个地址,浏览器会重新进行请求,此时不能用request传值,浏览器的地址栏会变成新的地址

 

11. Static变量是什么含义

   static是静态变量,就是变量值不随函数执行结束而消失,下次调用同一函数时,上次所赋予的值仍存在。

12. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

 

13. OverloadOverride的区别。Overloaded的方法是否可以改变返回值的类型?

   方法的重写Overriding和重载OverloadingJava多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)Overloaded的方法是可以改变返回值的类型。

 

14. 说出Servlet的生命周期,并说出ServletCGI的区别

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法service方法自动派遣运行与请求对应的doXXX方法doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet

15.. 请编写一JSP程序,它提供一个征求客户意见的文本区,在客户提交意见后,它能将意见及其他客户以前提交的意见一起显示出来。

 

16. 写一个算法对1852497进行顺序排列

   public class OrderbyArray {

//冒泡排序 Bubble Sort 最简单的排序方法是冒泡排序方法

    public int[] orderArray(int[] array){

     for(int i=0;i<array.length;i++){

     for(int j=i;j<array.length;j++){

     if(array[i]>array[j]){

     int s = array[i];

     array[i] = array[j];

     array[j] = s;

     }

     }

     }

     return array;

    }

public static void main(String[] args) {

int [] array = {1,8,5,2,4,9,7};

OrderbyArray order = new OrderbyArray();

array = order.orderArray(array);          

}

}

17. 写一段Jdbc连接Oracle的程序,并实现数据查询

创建一个连接数据库的工具类

  import java.sql.*;

   public class DbUtil {

   public static Connection getConnection(){

   String driver = "";

   String url = "";

   String name = "scot";

   String psw = "123";

   Connection conn = null;    

try {

Class.forName(driver);

conn = DriverManager.getConnection(url,name,psw);

catch (ClassNotFoundException e) {

e.printStackTrace();

catch (SQLException e) {

e.printStackTrace();

}

return conn;

   }

}

import java.sql.*;

public class SearchInfo {

   public void searchInfo(int id){

   Connection conn = null;

   PreparedStatement pstat = null;

   ResultSet res = null;

   String sql = "select * from users where id=?";

   conn = DbUtil.getConnection();

   try {

pstat = conn.prepareStatement(sql);

pstat.setInt(1, id);

res = pstat.executeQuery();

while(res.next()){

String name = res.getString("name");

}

catch (SQLException e) {

e.printStackTrace();

}

   }

}

18. 请利用JSP编写一简易的购物车程序,它包括一购物界面及往购物车中添加商品与删除商品功能,并能将用户当前已购的所有商品显示出来。

 

 

19. 写一个Singleton(单例模式)出来

public class LazySingleton {

private static LazySingleton instance = null;

 

// 默认的私有的构造方法,保证外界无法直接实例化

private LazySingleton() {

}

 

// 静态方法,返回此类的唯一实例

public  static LazySingleton getInstance() {

if (instance == null) {

instance = new LazySingleton();

}

return instance;

}

public void pp(){

System.out.println("lazy ok");

}

}

20. 用循环控制语句打印输出:1+3+5+…….+99=?结果。

        int sum = 0;

for(int i=1;i<100;i+=2){

sum = sum+i;

}

System.out.println("1+3+5+...+99 = "+sum);

21int 和 Integer 有什么区别 
答案:int是基本类型。Integer是引用类型。Integer可以把String转换成int

22.运行时异常与一般异常有何异同? 
答案:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常


常用的包-java.io,java.util,java.sql,java.javax.naming,java.net
常用接口-Collection,Connection, Cloneable, Comparable, Serializable

23.说出ArrayList,Vector, LinkedList的存储性能和特性.
答案:ArrayListVector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

24设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

注:因为这4个线程共享J,所以线程类要写到内部类中。

加线程:每次对j加一。

减线程:每次对j减一。
public class TestThreads

{

private int j=1;

//加线程

private class Inc implements Runnable

{

public void run()

{

for(int i = 0;i < 10;i++)

{

inc();

}

}

}

//减线程

private class Dec implements Runnable

{

public void run()

{

for(int i = 0;i < 10;i++)

{

dec();

}

}

}

//1

private synchronized void inc()

{

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

}

//1

private synchronized void dec()

{

j--;

System.out.println(Thread.currentThread().getName()+"-dec:"+j);

}

//测试程序

public static void main(String[] args)

{

TestThreads test = new TestThreads();

//创建两个线程类

Thread thread = null;

Inc inc = test.new Inc();

Dec dec = test.new Dec();

//启动4个线程

for(int i = 0;i < 2;i++)

{

thread = new Thread(inc);

thread.start();

thread = new Thread(dec);

thread.start();

}

}

}

25.数组转换问题。

Object[] object  =  new Person[2];

Person [] person  =  new Person [3];

person  =  (Person [])object;//可以转换

int[] i = new int[2];

long[] l = new int[3];

i = (long[])l;//不可以转换

26socket通讯写出客户端和服务器端的通讯,要求客户发送数据后能够回显相同的数据。 
Server.java:源代码

import java.net.*;

import java.io.*;

 

class  Server

{

public Server()

{

BufferedReader br = null;

PrintWriter pw = null;

try

{

ServerSocket server = new ServerSocket(8888);//建立服务器端

Socket socket = server.accept();//监听客户端

//得到该连接的输入流

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//得到该连接的输出流

pw = new PrintWriter(socket.getOutputStream(),true);

//先读后写

String data = br.readLine();

System.out.println(data);//输出到控制台

pw.println(data);//转发给客户端

}catch(Exception e)

{

e.printStackTrace();

}

finally

{

try

{

//关闭读写流

br.close();

pw.close();

}catch(Exception e)

{}

}

}

public static void main(String[] args)

{

Server server = new Server();

}

}

Client.java:源代码

import java.net.*;

import java.io.*;

 

class  Client

{

public Client()

{

BufferedReader br = null;

PrintWriter pw = null;

try

{

  Socket socket = new Socket("localhost",8888);//与服务器建立连接,服务器要先启

  //得到Socket的输入与输出流

  br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

  pw = new PrintWriter(socket.getOutputStream(),true);

  //先写后读

  pw.println("Client:你好!");

  String data = null;

  while(true)

  {

   data = br.readLine();

   if(data!=null) break;

  }

  System.out.println(data);

}catch(Exception e)

{

e.printStackTrace();

}

finally

{

try

{

br.close();

pw.close();

}catch(Exception e)

{}

}

}

public static void main(String[] args)

{

Client c = new Client();

}

}

27谈谈final, finally, finalize的区别。

答案:final 用于声明属性,方法和类,分别表示属性不可变,注意:如果是基本类型说明变

量本身不能改变,如果是引用类型,说明它不能指向其他的对象了。但对象还是可以改变

的。方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示无论是否出现异常总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

28Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 
    答案:可以继承其他类或完成其他接口,在swing编程中常用此方式。
29.Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 
    答案:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例       

被实例化。而通常的内部类需要在外部类实例化后才能实例化。

 


30.&和&&的区别。 
    答案:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).


展开阅读全文

没有更多推荐了,返回首页