java程序员面试宝典(3)

1.      Runnable接口与Thread类的区别之一:实现Runnable接口的线程类的多个线程,可以方便地访问同一变量,而Thread类则需要内部类进行替代

2.      线程池最重要的特征也就是最大程度利用线程,其次java线程池的编程模型相对于原有的多线程编程模式来说,一大改进就是线程代码和业务代码分离。

3.      

反射机制

4.      反射的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后实现动态要求。

5.      类被加载到JVM中条件:(1)需要使用该类创建对象。如Student stu = new Student();(2)访问该类的静态成员(staticfinal则不会)。(3)使用Class类的静态forName()方法,动态地加载一个指定类名的类。JDBC导入驱动类就是Class.forName()的一个常用例子。

6.      开发者通过3种途径取得Class对象:(1)Class类的forName方法的返回值。(2)访问所有类都会拥有的静态的class属性。(3)调用所有对象都会有的getClass方法。

7.      Field类,代表的是类的属性(字段),也称为成员变量。如:Field field = 对象引用.getClass().getDeclaredField(“成员变量名”); intvalue = (Integer)field.get(对象引用);(其中所得的value就是成员变量的值。)

8.      Method类,代表的是类的方法(静态或非静态)。Class<类名> clazz = 类名.class; Method m = class.getDeclaredMethod(“方法名”); 类名 obj =clazz.newInstance(); m.invoke(obj);//调用obj对象指定的方法。Method类最常用的方法是invoke方法,用其实现方法的动态调用。

9.      反射的动态性可以减少许多的代码冗余度。

10.  如何利用反射实例化一个类:需要java.lang.reflect.Constructor类:

//使用无参数的构造方法

Class<Student> clazz = Student.class; //获取Class对象

Student obj = clazz.newInstance();//即产生对象

//使用带参数的构造方法

Constructor<Student> con = clazz.getConstructor(String.class,int.class);//getConstructor里的参数是有参构造函数的参数类型。

obj = con.newInstance(“zhangsan”,30);//其实也完全可以使用无参构造,在setters方法设置即可。

11.  如何使用反射机制来访问一个类的私有成员:Field f = clazz.getDeclaredField(“成员变量名”);f.setAccessible(true);//之后就可以调用f.get(类对象引用);

12.  如何利用反射来覆盖数据对象的toString()方法(一种通用的方式):

public String toString(){

              StringBuildersb = new StringBuilder();//定义一个StringBuilder

              //得到所有的成员变量Fields

              Field[]fields = this.getClass().getDeclaredFields();

              //遍历

              for(Field f : fields){

                     sb.append(f.getName());

                     sb.append("=");

                     try {

                            sb.append(f.get(this));//得到变量的名字

                     }catch (IllegalArgumentException e) {

                            e.printStackTrace();

                     }catch (IllegalAccessException e) {

                            e.printStackTrace();

                     }

                     sb.append("\n");//添加一个换行符

              }

              return sb.toString();//返回结果

       }

Java的网络编程

13.  TCP/IP协议的理解:大多数计算机语言的网络通信基本编程模式都采用Socket(套接字)的形式(包括java)。TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议)。TCP/IP是一组包括TCP协议、IP协议、UDP协议、ICMP协议和其他一些协议的协议组。

14.  TCP协议的通信特点是什么:(1)面向连接的传输。(2)端到端的通信。(3)可靠性,不出现丢失或乱序。(4)采用字节流方式。

15.  Java的TCP编程模型(挺简单的,就是建立socket,进行流传输么~):(1)创建一个服务器端的Socket,指定一个端口号(与客户端的区别)。Java提供了java.net.ServerSocket类来实现这一步:ServerSocket ss = new ServerSocket(int型的端口号);//创建ServerSocket(2)开始监听来自客户端的请求。ss.accept()//ServerSocket的accept方法。(3)获取输出流或输入流。Socket socket =ss.accept();//accept获取socket对象

OutputStream os= socket.getOutputStream();//获得输出流

InputStream is =socket.getInputStream();//获得输入流

(4)调用输入流/输出流的read()或write()方法,进行数据的传输。如果是字符数据流,一般还可以用BufferedReader或PrintWriter进行数据的传输:

       OutputStreamos = s.getOutputStream();//获得输出流

              PrintWriter pw = new PrintWriter(os);//创建PrintWriter对象

              pw.print(内容);

              pw.flush();  //清空缓存

              //或者

              InputStream is = s.getInputStream();//获得输入流

              InputStreamReader isr = new InputStreamReader(is);

        BufferedReader br = new BufferedReader(isr); //创建BufferedReader对象

对于数据写出端,需要调用flush()方法,把缓存中的数据发送到对端,否则可能造成数据不能及时送达的后果。

(5)释放资源。关闭输出流/输入流、Socket和Server Socket对象:

        pw.close();//关闭输出流

        s.close();//关闭socket

        ss.close();//关闭server socket

客户端则不必创建ServerSocket对象,步骤如下:

(1)创建Socket对象,建立与服务器端的连接:

    Socket s = new Socket(“IP地址”,端口号); //IP地址和端口号创建Socket对象

(2)获得输入输出流。

(3)调用输入流/输出流的read()或write()方法,进行数据传输。

(4)释放资源,关闭输入流/输出流、socket对象。

16. UDP协议的通信特点是什么:与TCP不同,UDP不提供对IP协议的可靠机制、控制流以及错误恢复功能等,所以它的头部包含了很少的字节,比TCP负载消耗少,速度也相对快。它服务于域名系统(DNS)、简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、某些视频会议程序和影音串流服务。

17. Java的UDO编程模型:(1)创建数据Socket,指定一个端口号。Java提供java.net.DatagramSocket类来支持这一步:DatagramSocket ds = new DatagramSocket(9999);//创建DatagramSocket对象。(2)对于接受消息的一端来说,提供一个byte数组进行数据存储,而对于发送消息一端,除此以外还需要提供对端的IP地址和端口号:

//创建byte数组

Byte[] buff= new byte[1024];

//创建一个数据包对象

DatagramPacketdp = new DatagramPacket(buff,1024);//长度小于等于buff的长度

//或者

String str =“数据”;

//用byte数组,创建数据包对象

DatagramPacketdp = new DatagramPacket(str.getByte(),0,str.length(),InetAddress.getByName(“localhost”),9999);

(3)调用DatagramPacket的receive()或send()方法进行数据的接收或发送:

ds.receive(DatagramPacket对象);//接收消息

//或者

ds.send(DatagramPacket对象);//发送消息

(4)调用DatagramPacket的getData()方法得到byte数组的数据。dp.getData();这边如果缓存的byte数组长度与接收的数据长度不统一,则需要用某些方法进行数据的切分存储。(5)释放资源。关闭DatagramSocket对象:ds.close();

18.  TCP通信的服务端多线程模型中,主线程只负责监听和接收请求,业务代码则放在run方法中如:While((socket=serverSocket.accept())!=null){newMyThread(s).start();}ss.close();业务代码放在Mythread的run方法中。

19.  用TCP通信模型创建一个web服务器中HTTP状态值是200则代表请求成功。

20.  使用java关于网络的API来访问web站点,主要步骤:

(1)       用URL类创建一个资源定位对象;

(2)       调用URL的openConnection()方法得到HttpURLConnection对象。

(3)       调用HttpURLConnection的open方法打开连接。

(4)       用getHeaderFields()方法得到响应结果的头部结果。

(5)       用getInputStream()方法得到输入流对象,得到响应内容。

BufferedReader br = new BufferedReader(newInputStreamReader(conn.getInputStream(), ”UTF-8”));//可以用来转换编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值