摘要:
javabean是一种java语言编写的可重用组件。javabean的类必须是具体的和公开的,并且具有无参数构造器,javabean通过提供符合一致性设计模式(这和通常的设计模式不同,只是一种理念)的公共方法暴露内部域成员变量,通常是get/set方法 JavaBean 和 Server Bean(通常称为 Enterprise JavaBean (EJB))有一些基本相同之处。它们都是用一组特性... 阅读全文
摘要:
1. HTTP请求格式: <request line> <headers> <blank line> [<request body>] 在HTTP请求中,第一行是一个请求行,用来说请求的方式,要访问的资源,HTTP版本。然后是首部小节header,用来说明服务器要使用的附加信息。首部之后是一个空行,然后是请求主体。2. GET和POST HTTP定义了与服务器交互的不同方法,最基本的方法是POST和GET。HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,如果请求成功则返回应答。URL字符串中如 阅读全文
摘要:
⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。⑵深复制(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。2.Java的clone()方法⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象②对任何 阅读全文
摘要:
各种加密实现http://www.blogjava.net/stone2083/archive/2012/09/02/168113.html java->类加载器->文件校验器->安全管理器简述:校验器的作用:校验类文件是否完整安全管理器: 负责控制某个操作是否被允许用户认证数字签名加密数字签名更多是用来校验信息有没有被修改过,而加密可以彻底杜绝防止别人看到信息内容 1. 语言层次安全性最初的Ja... 阅读全文
摘要:
原文地址:坚持写博客的好处作者:Cain之前我博客的风格并不是像现在这样着力于介绍一些关乎个人成长方面的内容。事实上,坚持写博客能帮助个人得到成长。我现在总喜欢把自己的所见所想所学,以字面的形式记录下来,可以使现在,更是以后的自己有机会审视到自己的成长,从而从中取得更为长足的进步。虽然眼下个人的生活变的比以前忙碌了许多,但是博客在我的生活中,总是占有那么一席之地的。以下是我个人认为的,坚持写博客能赋予自己的好处:1.使自己变得更善于观察。一旦你养成了记博客的习惯,与此同时你也赋予了一个更好的机会给自己,让自己去更细致地观察生活。一个人的生活经历本就是价值连城的,从中学习到的知识,教训更是异常珍 阅读全文
摘要:
由于cache命中率的原因,哈希表的性能通常好于红黑树。即使只有32个元素,也要进行5次随机内存访问。随机内存访问对cpu cache是不友好的。hash表最大的缺陷是当数据量难以估计时,没法设置合适的bucket,元素可能是10个也可能是10000个这里有几种思路:1. 设置缺省bucket值为100左右,然后让hash表自动扩容,缺点是扩容的时候性能要受到影响。2. 结合业务,每次给10000的bucket,缺点是浪费内存,而且无法处理100W这样的极端情况。3. 把hash表的list变成哈希表,缺点是结构复杂,多次哈希速度慢。综合来看方案一是比较好的这种。 阅读全文
摘要:
如果输入在磁带机上, 你的机器只有一个磁带机驱动器和几十字的内存,如何找第K小的数1. 遍历一遍磁带,随即选择一个数M2. 再遍历一遍磁带, 计算大于和小于M的个数,这样就可以获得数M在总序列中的排名,这里考虑到可能有重复元素所以要统计大于和小于的个数3. 如果M的排名正好为所求,则结束;否则如果M的排名大于K,则下次遍历磁带时随即选择一个小于M的数,统计它的排名;如果M的排名小于K,下次遍历磁带的时候随即选择一个大于M的数,统计排名4. 经过步骤3,所选数的范围缩小,最后就能找到所要求的数5. 最多遍历磁带2logN次, 每次遍历时间O(n),总时间复杂度为O(nlogn)目前求第K小的数, 阅读全文
摘要:
问题描述:有一串数字,可正可负也可为0,连续两个或多个数字组成了一个子序列,每个子序列都有一个和,求出所有子序列中和最大的一个。例如输入的数组为3 6 -7 -1 4 3 -2 -5 10 -3,则和最大的子序列为3 6 -7 -14 3 -2 -5 10,最大和为11分析: 这个问题容易想到的方法是计算出任意两点之间的序列和,取出它们中的最大值,时间复杂度为O(n^2)程序员编程艺术上提到一种二分的方法,将序列分成左右两个部分,分别计算出左右两个部分的连续最长子序列,再求出端点分别在左右两边的连续最长子序列,它们三个中的最大值就是整个序列上的最长连续子序列,时间复杂度是O(nlogn)#in 阅读全文
摘要:
给定正整数N和M,要求随机生成M个不炒作N的正整数,并且这M个正整数中不能有重复元素一种想法是,随机生成一个不超过N的元素,然后在已经生成的元素中查找是否已经存在,如果不存在就加入,直到生成M个合格数据为止。如果使用集合来操作,由于集合有自动去重功能,省去了查找元素是否已经存在的操作,最后判断集合大小是否等于M。这种方法的缺点非常明显,生成过程中会有很多重复元素。这里使用了一种简便的方法,使用一个大小为N的数组,对应下标为i的位置赋值为i,下标i从0到M-1,对于每一个下标值,产生一个大小为i到M-1的随机数,然后交换它们对应位置的值。时间复杂度为O(M),空间复杂度为O(N),这里使用了空间 阅读全文
摘要:
一个含有n个不重复正整数的磁盘文件,每个数都不超过10^7,将这些数从小到大输出条件:只有1M可用内存空间,磁盘空间足够大归并排序:但是题目限制只有1M可用内存空间位图:由于题目的特殊性每个数都不超过10^7,并且没有重复整数,可以用10^7位来表示每个整数,如果存在这个整数就把改为置为1,否则置为0,然后再顺序遍历数组,检测每一位是否存在,如果存在就打印输出,这样最后所有数都有序。但是使用的内存空间为10^7/32,大概是1.25MB,因此需要分两次读取数据,第一次读取小于10^7/2的整数,有序输出,第二次再读取大于10^7的整数,内存也够用,如果可用内存比较小,可以分k次遍历,所需内存为 阅读全文
摘要:
UNIX环境高级编程(第二版)/ APUE 源码编译与使用为了用APUE的源码折腾了一下,网上很多方法都不能用,或者有小问题,特此记录。注意,不同环境的编译提示有所不同,如果你的环境和我的相似,那么应该没问题。环境Linux mypad 2.6.38-ARCH #1 SMP PREEMPT Tue May 3 06:04:40 UTC 2011 i686 Intel(R) Core(TM)2 Duo CPU T6570 @ 2.10GHz GenuineIntel GNU/Linux确保你已经安装了gcc和gawk。步骤到www.apuebook.com下载源码tar解包,cd apue.2e 阅读全文
摘要:
在进程的执行过程中会打开一系列文件,那么进程又是如何记录文件的状态呢?内核使用三种数据结构来表示一个记录项,弄清它们间的关系对于了解文件共享方面的知识很有帮助1. 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述表,每个描述符占有一项。与每个文件描述符相关联的是:+ 文件描述符标志+ 指向一个文件表的指针2. 内核为所有打开文件维持一张文件表,每个文件表项包含:+ 文件状态标志+ 当前文件偏移量+ 指向该文件V节点表项的指针3. 每个打开文件都有一个v节点结构(Linux中使用i节点),v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件 阅读全文
摘要:
所有操作系统都需要向它们运行的程序提供各种服务.包括执行新程序,打开文件,读文件,分配存储区等.在严格意义上,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。一般而言我们称这种软件为内核,它相对较小,位于环境的中心。UNIX的体系结构从内到外是内核、系统调用、shell 库函数、应用软件。内核的接口被称为系统调用,公用函数库建立在系统调用之上,应用软件可以使用库函数也可以使用系统调用。shell是一种特殊的应用程序,它为运行其它软件提供了一种接口。 阅读全文
摘要:
在linux系统中把设备和普通文件也都看做是文件,要对文件进行操作就必须先打开文件,打开文件后会得到一个文件描述符,它是一个很小的正整数,是一个索引值。内核会为每一个运行中的进程在进程控制块pcb中维护一个打开文件的记录表,每一个表项都有一个指针指向打开的文件,上边的索引值是记录表的索引值。文件描述符的优点:兼容POSIX标准,许多系统调用都依赖于它;缺点是不能移植到unix之外的系统上去。文件指针:c语言中使用的是文件指针而不是文件描述符来作为I/O的句柄,文件指针指向进程的用户空间中一个FILE结构的数据结构,FILE结构里主要包括一个I/O缓冲区和一个文件描述符,而文件描述符值是文件描述 阅读全文
摘要:
函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分,不管是java还是python的I/O最后都是通过read和write这样的系统调用来完成的系统调用是用户程序和内核交互的接口| 函数库调用 | 系统调用 ||---------------------------------------------+----------------------------------------------|| 在所有的ansi c编译器版本中,c库函数是相同的 | 各个操作系统的系统调用时不同的 || 它调用函数库中的一个程序 | 它调用系统内核的服务 || 与用户程序相联系 importa 阅读全文
摘要:
+ 内核编程时不能访问C库,也不能访问标准的C头文件+ 内核编程时必须使用GNU C+ 内核编程时缺少像用户空间那样的内存保护机制内核中的内存都是不分页的,每用掉一个字节,物理内存就减少一个字节。+ 内核编程时难以执行浮点运算不要轻易在内核中使用浮点数+ 内核给每个进程只有一个很小的定长堆栈内核栈的大小是两页,32位机的内核栈是8KB,而64位机是16KB,固定不变,每个处理器都有自己的栈。用户空间的栈比较大,而且通常可以动态增长,DOS不可以。+ 内核支持异步终端,抢占和SMP,因此必须时刻注意同步和并发同步和并发内核很容易产生竞争。和单线程的用户空间程序不同,内核的许多特性都要求能够并发地 阅读全文
摘要:
UNIX文件系统是UNIX系统的心脏部分,提供了层次结构的目录和文件。文件系统将磁盘空间划分为每1024个字节一组,称为块(block)(也有用512字节为一块的,如:SCO XENIX)。编号从0到整个磁盘的最大块数。一个磁盘分成一个或多个分区,每个分区可以包含一个文件系统一个分区分为三部分:+ 超级块, 文件系统中第一块被称为超级块。这个块存放文件系统本身的结构信息,比如每个区域的大小,未被使用的磁盘块的信息。+ i节点, 超级块的下一个部分就是i节点表,文件系统中的每个文件在该表中都对应一个i节点。i节点是固定长度的记录项,它包含有关文件的大部分信息。Linux文件系统使用 索引节点i 阅读全文
摘要:
客户端和服务器端使用tcp协议进行通信的时候需要三次握手操作,而断开连接则需要四次握手连接建立:三次握手1. 客户端发送tcp报文syn j到服务器2. 服务器发送对syn j的确认报文ack j+1,同时发送报文syn k3. 客户端发送对报文syn k的确认报文ack k+1连接建立,服务器处于ESTABLISHED状态连接释放:四次挥手由于tcp连接时全双工的,因此每个方形都必须单独进行关闭,当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接,这样它就不再发送数据了,但是仍然呢可以接收数据,首先进行关闭的一方将进行主动关闭,而另一方执行被动关闭1. tcp客户端发送一个F 阅读全文
摘要:
一般来说,java虚拟机使用一个类的方式如下:java源程序在经过java编译器编译之后就被转换成java字节码文件.class,虚拟机加载字节码文件被转换为java.lang.Class的一个实例,每个这样的实例代表一个java类,然后通过这个实例的newInstance()方法生成一个对象。基本上所有类加载器都是java.lang.ClassLoader的实例。java.lang.ClassLoader的主要作用是根据一个给定类的名字,查找该类的字节码文件,并生成一个class实例,它同时也加载java类所需要的一些资源如图像和配置文件。java.lang.ClassLoader类介绍ja 阅读全文
摘要:
redis是一个带持久化的高速key-value存储系统。特点是:热数据放在内存里面实现高速访问,支持可配置的数据持久化,支持主从同步,不依赖任何第三方库(包括通讯层),自己实现了类似virtual memory的机制,代码量不大。和mysql相比,redis的读写速度要快很多。和memcached相比,redis带有持久化和主从机制,不过redis重启比较慢。和bdb相比,redis的读写速度快一些、扩展性也相对好一些。和mongodb相比,redis要简单得多。mongodb没有行级锁,性能特征很不相同;其实主要是是scheme less的数据库,和redis没有多少可比性。redis是一 阅读全文