05 2012 档案
摘要:参考文献1.JVM调优总结(二)-一些概念2.Java深度历险(四)——Java垃圾回收机制与引用类型正文在参考文献1中,总结了JVM概念中的Java对象的大小,以及三种引用类型的定义与区分。Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:Object ob = new Object(); 这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java..
阅读全文
摘要:0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如Abstrac
阅读全文
摘要:前言 在数据库连接池分析的代码实例中,看到其中使用Enumeration来遍历Vector集合。后来就找了一些资料查看都有哪些方法可以遍历集合类,在网上找到了如下的使用Enumeration和Iterator遍历集合类的实例。不过这个实例中提到了Enumeration比Iterator的效率更高,其实并不是这样子的,该实例是的时间测试太片面了, 因为数据量太少。随着数据两的增加,两者之间的效率越来越接近,而不会出现倍数的比例。而且现在普遍都使用Iterator来遍历集合类,只有特别明确声明必须使用Enumeration的才会用该类遍历集合。代码实例View Code package edu..
阅读全文
摘要:参考文献文献1:http://help.github.com/win-set-up-git/1.安装与设定SSH 首先按照文献1中的教程安装git,并且生成ssh key。这里需要注意的是:1.在参考文献1中的4.Add your SSH key to GitHub这一点中提到需要打开id_rsa.pub文件。这个文件保存在C:\Users\username\.ssh目录下,在该目录下打开id_rsa.pub文件,文件内容是类似于以下的文本:ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA06gUJIABCS+RHeTr0im75+dM3C2ylYZ2LZ4aCOo8.
阅读全文
摘要:参考文献1.http://www.linuxidc.com/Linux/2012-04/58985.htm2.http://ihower.tw/blog/archives/26203.http://hi.baidu.com/lettoo/blog/item/e2e7f30fec72bdf6ab645789.html正文学习使用git,可以参考文献3,但是在操作的最后一步,也就是想将代码上传到git中去的时候,出现如下错误:Pushing to git@github.com:xwdreamer/FirstRepo_xuwei.gitTo git@github.com:xwdreamer/Firs
阅读全文
摘要:参考文献:1.What is the Halloween Problem in databases?2.Halloween Problem3.Table scans to avoid the Halloween problem4.数据库索引实例正文 今天在看《数据库系统概念》这本书的查询优化章节,在其中的第13.6.3节中提到了万圣节问题(Halloween problem)。这是一个挺有意思的问题,不过现在已经不存在这样的问题了,大多数数据库管理系统都为我们解决了这样的问题。不过我们可以来看看这个万圣节问题到底是什么。 在1976年的万圣节那一天,IBM的两位程序要需要修改数据库库中内容..
阅读全文
摘要:0.参考文献HTTP POST GET 本质区别详解从HTTP GET和POST的区别说起1.分析 一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交。Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。 URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查、改、增、删4个操作。 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的...
阅读全文
摘要:参考文献1.一个效果非常不错的JAVA数据库连接池2.使用 JAVA 中的动态代理实现数据库连接池3.MySql与oracle的JDBC测试程序分析参考文献1是一个用java实现的数据库连接池,可以参考其代码实现,最好也看看java源代码是怎么实现数据库连接池的,两者进行比较。参考文献2中提到了动态代理,之前写过的一片博客:设计模式之代理模式之二(Proxy)中也讲到了动态代理,这里可以参考一下。下面首先给出参考1中的代码示例,具体见ConnectionPool.java,修改了部门代码与注释,并该处了一个测试demo,具体见ConnectionPoolDemo.java:Connection
阅读全文
摘要:0.前言在前面一篇博客设计模式之代理模式(Proxy)中我们已经讲解了一部分代理模式,下面我们继续讲解代理的有关内容,包括代理的分类以及java中的代理。1.代理的分类 事实上代理能够被分为很多种类,大致有如下这些:虚代理、远程代理、copy-on-write代理、保护代理、Cache代理、防火墙代理、同步代理、智能指引。在这里我们会介绍虚代理和保护代理。 在设计模式之代理模式(Proxy)中提到的代理就是一个典型的虚代理的实现。起初每个代理对象只有用户编号和姓名数据,直到需要的时候,才会把整个用户的数据装载到内存中来。也就是说,要根据需要来装载整个UserModel的数据,虽然用户数据对..
阅读全文
摘要:1.前言 之前写过一篇设计模式之简单工厂(Factory method),在这篇文章的“7.可配置的简单工厂实例”中,客户端没有传入参数,这是因为在factory中已经定义了需要读取的配置文件。但是这样有个缺点就是灵活性不够,必须明确指定需要读取配置文件中的某一项,比如上面就定义了必须读取的是配置文件中的ImplClass=edu.sjtu.erplab.yanmo.simplefactory.Impl2这一个条目,假设配置文件中有多个条目,我们想要通过客户端传入一个简单的参数ImplClass来动态调用,那么该实例是不能完成。2.正文2.1利用反射机制在客户端传入具体的"包.类名&
阅读全文
摘要:有过C++开发经验的人会发现,我们可以将0作为false,非零作为true。一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true。代码实例如下: 1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 bool fun()//函数返回类型是bool,但是我们在函数中可以返回int类型。 6 { 7 return 1; 8 } 9 10 void main()11 {12 int a=1;13 if(a)//a是int类型的,但是.
阅读全文
摘要:request的生命周期是request请求域,一个请求结束,则request结束 session的生命周期是session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当session超过时间限制(一般是20分种)后,session注销而失效 或是人为使用session.invalidate();使用session失效; 或是关闭浏览器后,session还存在,但是这里已经无法获取session了,过一会它还是失效。request和session的优点和缺点很明显 request占用资源比较少 安全性也比较高 可是相对来说 缺乏持续性 而session则相对来说 对资源的消
阅读全文
摘要:待补充题目:一个数组中只有0,1,2三种元素,要求对这样的数组进行排序。1.思路:1.1思路1: 第一眼看到这样的题目,会举得非常简单,只需要两次遍历数组就可以完成了。第一次遍历,扫描数组中的元素,每次遇到0则count0++,遇到1则count1++,遇到2则count2++,这样一趟下来就能够统计出数组中0,1,2的个数了。然后第二次遍历的时候,只需要对数组进行重新赋值就可以了,从头开始赋值count0个0,count1个1,count2个2。最终完成对数组的排序。1.2思路2: 既然是面试题,那么肯定不会让你这么简单就解决出来了的。面试官说,加入只能进行一次遍历怎么办,然后你就不知道..
阅读全文
摘要:0.参考文献:http://jacki6.iteye.com/blog/774866http://baike.baidu.com/view/402020.htm1.范式说明1.1第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能同时有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。 在任何一个关系数据库中,第一范式(1NF)是对..
阅读全文
摘要:题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大树问题。这道题目有以下几点需要注意:0的0次方是无意义的,非法输入0的负数次方相当于0作为除数,也是无意义的,非法输入base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数判断double类型的base是否等于0不能使用==号。因为计算机表述小树(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个dou
阅读全文
摘要:题目1:写一个函数,输入n,其斐波那契数列的第n项。斐波那契数列的定义如下:方法1:使用递归解,时间复杂度是n的指数级别斐波那契数列的定义就是递归的,我们根据定义可以很简单的写出代码。代码如下:View Code #include<iostream>#include<stdlib.h>using namespace std;//f(n)={0,1,1,2,3...} n>=0int Fibonacci(int n){ if(n<=0) return 0; if(n==1) return 1; return Fibonacci(n-1)+Fibona...
阅读全文
摘要:题目:创建一个类,类中的数据成员时一棵二叉搜索树,对外提供的接口有添加结点和删除结点这两种方法。用户不关注二叉树的情况。要求我们给出这个类的结构以及实现类中的方法。思路添加结点:添加结点其实很容易,我们只需要找到结点所行对应的位置就可以了,而且没有要求是平衡的二叉搜索树,因此每次添加结点都是在叶子结点上操作,不需要修改二叉搜索树整体的结构。要找出添加节点在二叉搜索树中的位置,可以用一个循环解决。判断插入结点与当前头结点的大小,如果大于头结点则继续搜索右子树,如果小于头结点则继续搜索左子树。直到搜索到叶子结点,此时进行插入结点操作。如果插入的结点等于二叉搜索树中当前某一结点的值,那么退出插入操作
阅读全文
摘要:题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char *pData=NULL);//构造函数CMyString(const CMyString& str);//拷贝构造函数~CMyString();//析构函数private:char* m_pData;//数据域,字符指针};介绍重载赋值 重载操作符是一些函数,其名字为关键字operator后紧跟需要重载的运算符,比如"operator="表示需要重载"="。像任何其他函数一样,操作符函数有一个返回值和
阅读全文
摘要:0.参考文献:hash算法 (hashmap 实现原理)Java实现的散列表1.HashMap的数据结构 数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图: 从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%..
阅读全文
摘要:关于volatile我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需要像在本程序中
阅读全文
摘要:参考文献:Java:重写equals()和hashCode()为什么重写equals方法,一定要重写HashCode方法?重写equals和hashCode《CoreJava I 8》第5.2节——Object:所有类的超类。正文代码示例View Code package v1ch05.EqualsTest;import java.util.*;/** * This program demonstrates the equals method. * @version 1.11 2004-02-21 * @author Cay Horstmann */public class EqualsTes
阅读全文
摘要:参考文献:object.wait()和object.notify()和object.notifyall()正文wait、notify和notifyAll方法是Object类的final native方法。所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序中有以下三种形式调用wait等方法。wait();//方式1:this.wait();//方式2:super.wait();//方式3void notifyAll()解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonito
阅读全文
摘要:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前一个日志文件中有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。1000万条记录,每条记录最大为255Byte,那么日志文件最大有2.5G左右,大于1G内存。但是题目中又提到这样的1000万条记录中有许多是重复的,出去重复的话只有300万条记录,存储这样的300万条记录需要0.75G左右的内存,小于1G内存。那么我们可以考虑将这
阅读全文
摘要:前言这道题目网上到处都是,但是好多都没有讲清楚,然后大家又相互转载,错误泛滥,现在我来完善这道题目。题目:每一个ip访问百度,其ip地址都会被记录到后台日志文件中,假设一天的访问日志有100G,求出一天中访问百度次数最多的ip地址,可以使用的内存大小是1G。分析首先解决大文件问题,也就是如何处理100G的一个大文件,这个通常的解决方法就是将大文件分解成许多小文件。我们可以通过对IP地址求hash然后对1024取模将一个100G的大文件分解成1024个小文件(file0,file1......file1023),注意这里的1024个文件并不是平均分的,也就是每个文件大小并不是(100G/1204
阅读全文
摘要:题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。分析代码实例:View Code #include<iostream>#include<stdlib.h>#include<stack>using namespace std;void MergeSort(int arry[],int len){ int left=0; int mid=len/2; int
阅读全文
摘要:1.替换空格题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。1.1分析将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。如果从前往后替换字符串,那么保存在空格后面的字符串肯定会
阅读全文
摘要:题目:输入n个整数,找出其中最小的k个数。例如输入{4,5,1,6,2,7,3,8}这8个数字,则最小的4个数字是1,2,3,4。分析这道题目跟上一道:面试题29:数组中出现次数超过一半的数字类似,都是通过Partition()的思路来解题。通过Partition()获得index,判断index==k,如果等于k,那么表明在index左边的k个数都小于index所指向的数,并且也小于index右边的数。那么就找出了本题所要求的最小的k个数。如果index>k,则第k小的数在[start,index-1]之间,如果index<k,则第k小的数在[index+1,end]之间。知道最
阅读全文
摘要:题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。分析:如果一个数字才数组中出现的次数超过了数组长度的一半,那么对这个数组进行排序,位于数组中间位置的那个数就是出现次数超过一半的那个数。对数组排序的时间复杂度是O(nlog(n)),但是对于这道题目,还有更好的算法,能够在时间复杂度O(n)内求出。我们写过快速排序算法,其中的Partition()方法是一个最重要的方法,该方法返回一个index,能够保证index位置的数是已排序完成的,在index左
阅读全文
摘要:题目:一个数组是由一个递增数列右移若干位形成的,比如{4,5,1,2,3}是由{1,2,3,4,5}左移两位形成的,在这种数组中查找某一个数。这道题其实是前面介绍的一道题目:面试题8:旋转数组的最小数字的一个变种。解题思路如下:首先通过“面试题8:旋转数组的最小数字”这道题目中获取元素分裂点,时间复杂度为O(log(n))因为旋转数组是由递增数组右移得到,因此旋转数组中的第一个元素是整个数组的中间元素,比较待查找元素与第一个元素,如果待查找元素大于等于第一个元素,表明待查找元素在前半段有序数组中;如果不是这待查找元素在后半段数组中。判断待查找元素所在的有序数组以后,我们通过一个简单的二分查找就
阅读全文
摘要:题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1。分析最直观的想法就是顺序遍历一次数组,就能够找出最小的数字,这样的时间复杂度是O(n),当时我也是这么跟面试官说的,我说遍历一次不就OK了吗?面试官说“如果你觉得遍历一次是你觉得最好的,那就跟我说!”我立马说不是的,让我想想,应该还有其他更有的方法。是的,既然叫做旋转数组,那么我们就需要利用好旋转数组的特性。看到这样的旋转数组查找最小数,我们会不会潜意识里面就想到了二分查找呢。确
阅读全文
摘要:参考文献:http://blog.minidx.com/2008/02/03/468.html正文在面试的时候二分查找是用的比较多一种查找算法,如何在面试官面前快速准确得的写出代码决定你是否能够被录取。以前一直以为二分查找很简单,所以就没怎么重视,但是真要在面试官面前对着黑板手写出来,还是漏洞百出。今天自己在电脑面前敲出了二分查找的代码,也花了将近半个小时。对于这种基础排序查找算法,还是得好好重视。二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。二分查找的主要思路就是设定两个指针start和end
阅读全文
摘要:微软数据库索引知识聚集索引与非聚集索引的区别主键与外键的作用数据库三范式数据库ACID的概念为什么使用B树作为索引结构程序设计旋转数组的查找搜索二叉树的插入与删除B树与B+树的概念O(1)空间复杂度的归并排序百度多线程java内存机制,堆栈内存Synchronized怎么用单例工厂反射GCFinal三种数据库中sql语句的不同点,tipsTop,limit,rownum连接 a.id(+)=b.id,left on,right onVolatile关键字Object.waitObject.notifyJava Lock用法Java Proxy用法Hash算法实现hashtable、Hashma
阅读全文
摘要:参考文献:http://blog.csdn.net/bocaicbl/article/details/5319915Java深度历险(四)——Java垃圾回收机制与引用类型JVM概念之Java对象的大小与引用类型1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。 垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用..
阅读全文
摘要:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不能解决问题。看到O(n)时间复杂度,我们就应该能够想到我们只能对整个数组进行一次扫描,在扫描过程中求出最大连续子序列和以及子序列的起点和终点位置。假如输入数组为{1,-2,3,10,-4,7,2,-5},我们尝试从头到尾累加其中的正
阅读全文
摘要:题目:有两个相同的栈A和B,在栈A中存放着从大到小的数:1,2,3,4,5,栈顶为最小数1,另外一个栈B为空的。现在要求不使用其他的数据结构,将栈A中的数字顺序倒过来,使其栈顶的数为最大值5。解题思路:这道题目有一个非常直观的思路。首先栈A中存放着1,2,3,4,5这样5个数字,栈顶元素为1,我们需要将其倒序为5,4,3,2,1。我们首先需要将栈顶的最小值1取出来存放在临时变量temp中,然后将剩下的四个数字2,3,4,5转移到栈B中去,再将刚才存放在临时变量中的1插入到栈A中,最后将栈B中的数字转移回到栈A,此时栈A中有一个书是排序好的,就是栈底的1。重复上面的思路,这回我们取出栈顶的最小值
阅读全文
摘要:题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template <typename T>class CQueue{public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead();private: stack<T> stack1; stack<T> stack2;};解题思路:插入操作在stack1中进行,删除操作在stack2中进行,如
阅读全文
摘要:参考文献:[1].漫谈数据库索引1.创建表并插入数据在Sql Server2008中创建测试数据库Test,接着创建数据库表并插入数据,sql代码如下:USE TestIF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'emp_pay') DROP TABLE emp_payGOUSE TestIF EXISTS (SELECT name FROM sys.indexes WHERE name = 'employeeID_ind') DROP INDEX emp_pay.e
阅读全文
摘要:msdn关于order by的解释ORDER BY 子句按一列或多列(最多 8,060 个字节)对查询结果进行排序。有关 ORDER BY 子句最大大小的详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。Microsoft SQL Server 2005 允许在 FROM 子句中指定对 SELECT 列表中未指定的表中的列进行排序。ORDER BY 子句中引用的列名必须明确地对应于 SELECT 列表中的列或 FROM 子句中的表中的列。如果列名已在 SELECT 列表中有了别名,则 ORDER BY 子句中只能使用别名。同样,如果表名已在 FROM 子句中有了别名,则
阅读全文