面试小记

面试还是很有收获的,知道哪里不足了

 

以下几点需要去补补顺便收集别人的面试题做起来吧,闲着也是闲着,不要放弃。

 

1.一些常用的端口

 

 

知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
 

 

2.网络7层协议

 

OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。下面我简单的介绍一下这7层及其功能。 
OSI的7层从上到下分别是 
7 应用层 
6 表示层 
5 会话层 
4 传输层 
3 网络层 
2 数据链路层 
1 物理层 
(1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。 
(2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。 
(3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。 
(4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。 
(5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。 
(6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。 
(7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。 
OSI分层的优点: 
 

 

 

 

 

 

1.hashmap的内部实现机制,hash是怎样实现的,什么时候rehash 

 

hashmap内部使用了一个Entry的数组 , 每个数组中的元素又是一个链表 。 
对key取hash值 再使用indexFor方法确定它在数组中的位置。

什么时候rehash这个问题,JDK文档里面是这么说的。An instance of HashMap has two parameters that affect its performance: initial capacity and load factor. The capacity is the number of buckets in the hash table, and the initial capacity is simply the capacity at the time the hash table is created. The load factor is a measure of how full the hash table is allowed to get before its capacity is automatically increased. When the number of entries in the hash table exceeds the product of the load factor and the current capacity, the capacity is roughly doubled by calling the rehash method. 

英文不好,感觉就是当Entry数组中的元素个数大于 initial capcaity * load factor的时候, 数组就会自动扩充容量, 然后重新散列rehash
 

 

1.数字怎么格式化,

import java.text.NumberFormat;
 

 

2.Vector怎么迭代查询某个值,

	Vector<String> as = new Vector<String>();
		as.add("a");
		as.add("b");
		as.add("c");
		
		Iterator<String> iter = as.iterator();
		while(iter.hasNext()){
			String s = iter.next();
			if(s.equals("a")){
			System.out.println("find it");
			}
		}
 

 

3.前序遍历二叉树输出树状结构

每个节点的度均不超过2的有序树,称为二叉树binary tree.

二叉树中每个节点的孩子数只能是0、1或2个,并且每个孩子都有左右之分。

满二叉树:每层节点都达到最大数

完全二叉树:若在一棵满二叉树中,在最下层最右侧起去掉相邻的若干叶子结点,得到的二叉树即为满二叉树。

二叉树的储存结构有两种:顺序储存结构和链式储存结构。

顺序存储结构: 对于满二叉树和完全二叉树来说,可以将其数据元素逐层存放到一组连续的存储单元中, 用一维数组来实现

顺序存储结构时,将二叉树中编号为 i 的节点存放到数组中的第 i 个分量中。可以得到 节点i 的父节点、左右孩子节点分别

为[i/2]、2i以及2i+1分量中


public class Tree {
	private int data;
	private Tree left;
	private Tree right;
	
	public Tree(int data){
		this.data = data;
		this.left = null;
		this.right = null;
	}
	
	public static Tree createTree(int[] input){
		Tree root = null;
		Tree temp = null;
		for(int i = 0; i < input.length; i++){
			if(root == null){
				root = temp = new Tree(input[i]);
			}else{
				temp = root;
				while(temp.data != input[i]){
					if(input[i] <= temp.data){
						if(temp.left != null){
							temp = temp.left;
						}else {
							temp.left = new Tree(input[i]);
						}
					}else{
						if(temp.right != null) {
							temp = temp.right;
						}else{
							temp.right = new Tree(input[i]);
						}
					}
				}
			}
		}
		return root;
	}
	
	public static void preOrder(Tree tree){
		if(tree != null){
			System.out.println(tree.data + "");
			preOrder(tree.left);
			preOrder(tree.right);
		}
	}
	
	public static int length(Tree tree){
		int depth1;
		int depth2;
		
		if(tree == null) return 0;
		depth1 = length(tree.left);
		depth2 = length(tree.right);
		if(depth1 > depth2)
			return depth1+1;
		else
			return depth2+1;
	}
	
	public static void main(String[] args) {
		int[] input = {4,2,6,1,3,5,7,8,10};
		Tree tree = createTree(input);
		System.out.println(Tree.length(tree));
		System.out.println("前序遍历");
		preOrder(tree);
	}

}
 

 

 

5.java序列化

 

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。

 
	
  序列化的必要性

      Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。
      这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。

      如何序列化一个对象

      一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。
      有了这个标记的Class就能被序列化机制处理。


Bean Serializable Interface 
的接口让BEAN可以串行化,将其变成一个可保存为以后使用的二进制流。当一个BEAN被系列化到磁盘上或者其他任何地方,其状态被保存起来,其中的属性
值也不会改变。在BEAN的规范中,JSP并没有要求BEAN实现Serializable接口。但是,如果您希望自己控制您所创建的组件的
serialization进程,或者您想serialize并不是标准组件扩展的组件,您必须了解serialization and 
deserialization的细节。

  有几个原因你会把BEAN冷藏起来以备后用。有些服务器通过将所有的SESSION 
数据(包括BEAN)写入磁盘来支持任意长的SESSION生命期,即使服务器停机也不会丢失。当服务器重新启动后,串行化的数据被恢复。同样的理由,在
重负载的站点上支持服务器分簇的环境中,许多服务器通过串行化来复制SESSION。如果你的BEAN不支持串行化,服务器就不能正确地保存和传输类。

 
 通过同样的策略,你可以选择将BEAN保存在磁盘上或者数据库中,以备后用。例如,也许可以将客户的购物车实现为一个BEAN,在访问期间将其保存在数
据库中。




import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class TestSerial implements Serializable {
	
	public byte version = 100;
	public byte count = 0;
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
	
			FileOutputStream fos = new FileOutputStream("d://temp.out");
			ObjectOutputStream oos =  new ObjectOutputStream(fos);
			TestSerial ts = new TestSerial();
			oos.writeObject(ts);
			oos.flush();
			oos.close();
			
			FileInputStream fis = new FileInputStream("d://temp.out");
			ObjectInputStream ois = new ObjectInputStream(fis);
			TestSerial ts2 = (TestSerial) ois.readObject();
			System.out.println("version=" + ts.version);
		
		
	}

}
 

6.对java io的理解

 

7. KMP、最短路径、平衡二叉树的平衡旋转操作

 

4.java的深克隆和浅克隆

 

 

浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。  
    深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。  
    Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点  
    1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。  
    2.在派生类的clone()方法中,调用super.clone()。  
    3.在派生类中实现Cloneable接口。
    Object类里的clone方法是浅复制(浅克隆)



public class CloneTest {
	public static void main(String[] args) throws CloneNotSupportedException {
		Teacher teacher=new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher Zhang");
		
		Student student1=new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);
		
		Student student2=(Student)student1.clone();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());
		System.out.println(student2.getTeacher().getAge());
		System.out.println(student2.getTeacher().getName());
		
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
		
		student2.setAge(18);
		student2.getTeacher().setAge(50);//浅复制针对对象的引用没有重新开辟新的空间
		student2.getTeacher().setName("Teacher Li");	//改变值后相应的都改变
		
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getAge());
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}
class Teacher{
	private int age;
	private String name;
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
}
class Student implements Cloneable{
	private int age;
	private String name;
	private Teacher teacher;
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public Teacher getTeacher() {return teacher;}
	public void setTeacher(Teacher teacher) {this.teacher = teacher;}
	public Object clone()throws CloneNotSupportedException{
		return super.clone();
	}
}

 

 

 

 

 

servlet 除了dopost 与 doget 还有哪些方法

HTTPServlet应用编程接口 
  HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 <FORM> 和 </FORM> 标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。    

(1) init() 方法   在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。   缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。    

(2) service() 方法   service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。   Servlet的响应可以是下列几种类型:   一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。   一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。    

(3)doGet()方法   当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。    

(4)doPost()方法   当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。    

(5) destroy() 方法   destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。   当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。    

(6) GetServletConfig()方法   GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。    

(7) GetServletInfo()方法   GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。   当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要 "请求"和"响应"对象作为参数。"请求"对象提供有关请求的信息,而"响应"对象提供了一个将响应信息返回给浏览器的一个通信途径。   javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用"请求"对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用"响应"对象的方法发送响应,该响应是准备发回客户机的。 

 

 

构造函数与析构函数的理解

 

 把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。

 

 

性能与缓存

 

从数据库中选出重复的条目

 

 

select * from blog where name in (select name from blog group by name having count(*) >1 )

 

 

触发器

 

触发器的概念:“在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。”(Wikipedia)说得简单一些,它是在一个特殊的数据库事件,如INSERT或DELETE发生时,自动激活的一段代码。触发器可方便地用于日志记录、对单个表格到其他链接式表格进行自动的“层叠式”更改、或保证对表格关系进行自动更新。当一个新整数值增加到数据库域中时,自动更新运行的总数的代码段是一个触发器。自动记录对一个特殊数据库表格所作更改的SQL命令块也是一个触发器实例。


CREATE TRIGGER SetUserHome before insert ON users  
FOR EACH ROW   
BEGIN   
set New.homeLocationX = 128;  
set New.homeLocationY = 128;  
set New.homeLocationZ=30;   
END  

DML事件(3种) INSERT 在表或视图中插入数据时触发
 UPDATE 修改表或视图中的数据时触发
 DELETE 在删除表或视图中的数据时触发
DDL事件(3种) CREATE 在创建新对象时触发
 ALTER 修改数据库或数据库对象时触发
 DROP 删除对象时触发
数据库事件(5种) STARTUP 数据打开时触发
 SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发
 LOGON 当用户连接到数据库并建立会话时触发
 LOGOFF 当一个会话从数据库中断开时触发
 SERVERERROR 发生服务器错误时触发

 

数据操纵语言触发器 DML触发器 创建在表上,由DML事件引发的触发器 替代触发器 INSTEAD OF触发器 创建在视图上,用来替换对视图进行的插入、删除和修改操作 数据定义语言触发器 DDL触发器 定义在模式上,触发事件是数据库对象的创建和修改 数据库事件触发器 — 定义在整个数据库或模式上,触发事件是数据库事件

 

 

单例模式改进

public class Singleton {

    private static Singleton uniqueInstance = null;

 

    private Singleton() {

       // Exists only to defeat instantiation.    

    }

 

    public synchronized static Singleton getInstance() {

       if (uniqueInstance == null) {

           uniqueInstance = new Singleton();

       }

       return uniqueInstance;

    }

    //Other methods...

}

 

MongoDb 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值