hash为什么对求给定正整数m以内的素数之和求余,而不像HashMap中

在看数据结构和算法分析这本书的时候,哈希表建议大小为素数,但里面并没有详细说明为什么,只说了因为它在哈希表最小化集群,这又是为什么,我通过百度,外加自己的理解说明一下为什么哈希表的大小最好为素数,感觉并没有很大的答案,只能说略作总结。这里贴上一篇比较好的帖子
我也是总结了这篇帖子的主要内容。
首先在说明为什么哈希表的大小最好为素数之前,先说一下若大小取2的整数幂的问题,对于x mod M这样的函数,M即为哈希表的大小,其中的好坏应该取决于x的生成法师和M的值。比如一个字符串“ABC”,如果把字符串当成一个128进制的整数,写成“ABC” = 128 * 128 * 65 + 128 * 66 + 67,这种形式中,若M = 128,那么只要根据最后一个字符是否相同就可以判断是否会冲突,也就是说结果取决于最后一个字符,便会造成不均匀。
对于哈希表最好为素数这个问题也是有争议的。这里也只能说按照x mod M这种最普遍的哈希函数来解释,如果想让哈希做好冲突小,效率高的效果,还是要从哈希函数来分离数据的特征的。
恰好等于或接近2的整数幂都只是暴露原值。素数才能用来避免冲突,如果种子用合数,那么很可能对合数的某个因数取余,所得到的余数仍然是一样的。帖子中举例说:对4取余如果余1,那么对2取余仍然余1.开始觉得还挺对的,后来想想对4取余跟对2取余啥关系,当哈希表大小为4时,谁会再对2取余呢?
自我感觉如果还是x mod M这种哈希函数,想要让冲突小,那就只有让哈希表的大小越大越好,冲突自然就小了,至于素数的问题发现还是无果。如果有朋友对这方面有高见,还请跟我交流(邮箱)
为什么哈希表长度须要是质数?
http://bbs.csdn.net/topics/
coldwindtang:
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%).
而分析发...
从十七年蝉谈起——hashtable的表格大小为什么要选择质数
十七年蝉,同翅目。北美洲一种穴居十七年才能化羽而出的蝉。它们在地底蛰伏17年始出,尔后附上树枝蜕皮,然后交配。雄蝉交配后即死去,母蝉亦于产卵后死。科学家解释,十七年蝉的这种奇特生活方式,为的是避免天敌...
一般采用哈希算法的时候,哈希表的长度设为多大?有什么依据?
hashMap的初始化的长度,
这里使用的策略是循环查出一个大于initialCapacity的2的次方的数,例如 initialCapacity的值是10,那么大于10的数是2的4次方,也就是16...
算法分析:哈希表的大小为何是素数
2 选取数列
1、问题分析
最近看到了哈希表的问题,网上也看到了一些解释,不过并没有讲的很清楚,正好顺便来探讨一下,如有不...
什么是 哈希表
HashMap 中数组的 size 为什么必须是 2 的整数次幂
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,
pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就...
redis源码分析,字典的设计与实现
1.先来了解一下Hash的基本思路:
设要存储对象的个数为num, 那么我们就用len个内存单元来存储它们(len&=num); 以每个对象ki的关键字为自变量,用一个函数h(ki)来映...
哈希表定义
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做...
最近我在做一个项目,其中要用到一个数据结构——Hash Table(哈希表),以前只有理论知识,现在实却发现很不简单,所以写下来和大家共分享。我们知道,哈希表是一个固定大小的数组,数组的每个元素是一个...
1. HashMap的数据结构
http://blog.csdn.net/gaopu12345/article/details/
??看一下
数据结构中有数组和链表来实现对数据...
没有更多推荐了,&&&&&&&&&&&&&
& & & 这两天在看HashMap的时候,被负载因子float loadFactor搞得很晕,经过一天的研究,最后理出了自己的一点个人见解。
& & & 在HashMap的底层存在着一个名字为table的Entry数组,在实例化HashMap的时候,会输入两个参数,一个是 int initCapacity(初始化数组大小,默认值是16),一个是float loadFactor(负载因子,默认值是0.75),首先会根据initCapacity计算出一个大于或者等于initCapacity且为2的幂的值capacity,例如initCapacity为15,那么capacity就会为16,还会算出一个临界值threshold,也就是capacity * loadFactor,贴出源代码
* Constructs an empty &tt&HashMap&/tt& with the specified initial
* capacity and load factor.
initialCapacity the initial capacity
loadFactor
the load factor
* @throws IllegalArgumentException if the initial capacity is negative
or the load factor is nonpositive
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity & 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity & MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor &= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
// Find a power of 2 &= initialCapacity
int capacity = 1;
while (capacity & initialCapacity)
capacity &&= 1;
this.loadFactor = loadF
threshold = (int)(capacity * loadFactor);
table = new Entry[capacity];
    创建完HashMap之后,下面来看put方法,首先会根据key值计算出其HashCode值,然后在通过一个indexFor方法计算出此元素该存放于table数组的哪个数组之中(我猜想可能是通过对table.length的值取余的操作计算出来的),再检测此table的此坐标位置的entry链是否存在此key或者此key值,若存在,则更新此元素的value值。源代码如下:
* Associates the specified value with the specified key in this map.
* If the map previously contained a mapping for the key, the old
* value is replaced.
* @param key key with which the specified value is to be associated
* @param value value to be associated with the specified key
* @return the previous value associated with &tt&key&/tt&, or
&tt&null&/tt& if there was no mapping for &tt&key&/tt&.
(A &tt&null&/tt& return can also indicate that the map
previously associated &tt&null&/tt& with &tt&key&/tt&.)
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry&K,V& e = table[i]; e != e = e.next) {
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.
e.recordAccess(this);
return oldV
modCount++;
addEntry(hash, key, value, i);
    下面来看看addEntry方法,参数bucketIndex就是当前元素应该插入到entry数组的下标,先取出放在此位置的entry,然后把当前元素放入该数组中,当前元素的next指向之前取出元素,形成entry链表。(描述的不是很清楚,大概就是把新加入的entry当成头放入到数组当中,然后指向之前的链表),放入之后就去判断当前的size是否达到了threshold极限值,若达到了,将会进行扩容。源代码如下:
* Adds a new entry with the specified key, value and hash code to
* the specified bucket.
It is the responsibility of this
* method to resize the table if appropriate.
* Subclass overrides this to alter the behavior of put method.
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry&K,V& e = table[bucketIndex];
table[bucketIndex] = new Entry&K,V&(hash, key, value, e);
if (size++ &= threshold)
resize(2 * table.length);
    下面来看resize方法,方法比较简单就是生成一个新的table数组(entry数组),然后根据新的Capacity和负载因子去生成新的临界值。重点是里面有个transfer方法。源代码如下:
* Rehashes the contents of this map into a new array with a
* larger capacity.
This method is called automatically when the
* number of keys in this map reaches its threshold.
* If current capacity is MAXIMUM_CAPACITY, this method does not
* resize the map, but sets threshold to Integer.MAX_VALUE.
* This has the effect of preventing future calls.
* @param newCapacity the new capacity, MUST
must be greater than current capacity unless current
capacity is MAXIMUM_CAPACITY (in which case value
is irrelevant).
void resize(int newCapacity) {
Entry[] oldTable =
int oldCapacity = oldTable.
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
Entry[] newTable = new Entry[newCapacity];
transfer(newTable);
table = newT
threshold = (int)(newCapacity * loadFactor);
    因为table数组的容量增加了,那么相应的table的length也增加了,那么之前存储的元素的位置也就不一样了,比如之前的length是16,现在的length是32,那么hashCode模16和HashCode模32的结果很有可能会不一样,所以就只有重新去计算新的位置,方法是遍历数组,在遍历数组上的entry链。(此时就是所谓的rehash??)
* Transfers all entries from current table to newTable.
void transfer(Entry[] newTable) {
Entry[] src =
int newCapacity = newTable.
for (int j = 0; j & src. j++) {
Entry&K,V& e = src[j];
if (e != null) {
Entry&K,V& next = e.
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] =
} while (e != null);
    总结:当负载因子较大时,去给table数组扩容的可能性就会少,所以相对占用内存较少(空间上较少),但是每条entry链上的元素会相对较多,查询的时间也会增长(时间上较多)。反之就是,负载因子较少的时候,给table数组扩容的可能性就高,那么内存空间占用就多,但是entry链上的元素就会相对较少,查出的时间也会减少。所以才有了负载因子是时间和空间上的一种折中的说法。所以设置负载因子的时候要考虑自己追求的是时间还是空间上的少。
& & & & & &注意:设置initCapacity的时候,尽量设置为2的幂,这样会去掉计算比initCapactity大,且为2的幂的数的运算。
    疑问:感觉transfer方法会相当的耗时,是不是不去扩容会比较好?
&posted on
阅读(...) 评论()JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等
Java为数据结构中的映射定义了一个接口java.util.Map
HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度。
HashMap最多只允许一条记录的键为null,允许多条记录的值为null。非线程安全。
如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类。线程安全。并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。
LinkedHashMap:LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
TreeMap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。
(1) 存储结构-字段
(2) 功能实现-方法
存储结构-字段
HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。
这里需要讲明白两个问题:数据底层具体存储的是什么?这样的存储方式有什么优点呢?
HashMap类中有一个非常重要的字段,就是 Node[] table,即哈希桶数组
static class Node&K,V& implements Map.Entry&K,V& {
//用来定位数组索引位置
//链表的下一个node
Node(int hash, K key, V value, Node&K,V& next) { ... }
public final K getKey(){ ... }
public final V getValue() { ... }
public final String toString() { ... }
public final int hashCode() { ... }
public final V setValue(V newValue) { ... }
public final boolean equals(Object o) { ... }
Node是HashMap的一个内部类,实现了Map.Entry接口,本质是就是一个映射(键值对)。上图中的每个黑色圆点就是一个Node对象。
HashMap就是使用哈希表来存储的。Java中HashMap采用了拉链法解决冲突。
例如程序执行下面代码:
map.put("美团","小美");
系统将调用"美团"这个key的hashCode()方法得到其hashCode 值(该方法适用于每个Java对象),然后再通过Hash算法的后两步运算(高位运算和取模运算,下文有介绍)来定位该键值对的存储位置。
哈希桶数组需要在空间成本和时间成本之间权衡。那么通过什么方式来控制map使得Hash碰撞的概率又小,哈希桶数组(Node[] table)占用空间又少呢?答案就是好的Hash算法和扩容机制。
HashMap的默认构造函数就是对下面几个字段进行初始化
// 所能容纳的key-value对极限
final float loadF
// 负载因子
// 用来记录HashMap内部结构发生变化的次数
Node[] table的初始化长度length(默认值是16),Load factor为负载因子(默认值是0.75),threshold是HashMap所能容纳的最大数据量的Node(键值对)个数。
threshold就是在此Load factor和length(数组长度)对应下允许的最大元素数目,超过这个数目就重新resize(扩容),扩容后的HashMap容量是之前容量的两倍。
在HashMap中,哈希桶数组table的长度length大小必须为2的n次方(一定是合数),这是一种非常规的设计,常规的设计是把桶的大小设计为素数。相对来说素数导致冲突的概率要小于合数[2].
HashMap采用这种非常规设计,主要是为了在取模和扩容时做优化,同时为了减少冲突,HashMap定位哈希桶索引位置时,也加入了高位参与运算的过程。
当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能。
功能实现-方法
HashMap的内部功能实现很多,本文主要讲述:
根据key获取哈希桶数组索引位置
put方法的详细执行
确定哈希桶数组索引位置
先看看源码的实现(方法一+方法二):
static final int hash(Object key) {
//jdk1.8 & jdk1.7
// h = key.hashCode() 为第一步 取hashCode值
// h ^ (h &&& 16)
为第二步 高位参与运算
return (key == null) ? 0 : (h = key.hashCode()) ^ (h &&& 16);
static int indexFor(int h, int length) {
//jdk1.7的源码,jdk1.8没有这个方法,但是实现原理一样的
return h & (length-1);
//第三步 取模运算
这里的Hash算法本质上就是三步:取key的hashCode值、高位运算、取模运算。
只要它的hashCode()返回值相同,那么程序调用方法一所计算得到的Hash码值总是相同的。我们首先想到的就是把hash值对数组长度取模运算,这样一来,元素的分布相对来说是比较均匀的。但是,模运算的消耗还是比较大的,在HashMap中是这样做的:调用方法二来计算该对象应该保存在table数组的哪个索引处。
而HashMap底层数组的长度总是2的n次方,这是HashMap在速度上的优化。当length总是2的n次方时,h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。
分析HashMap的put方法
JDK1.8HashMap的put方法源码如下:
1 public V put(K key, V value) {
// 对key的hashCode()做hash
return putVal(hash(key), key, value, false, true);
6 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node&K,V&[] Node&K,V& int n,
// 步骤①:tab为空则创建
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).
// 步骤②:计算index,并对null做处理
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
Node&K,V& K
// 步骤③:节点key存在,直接覆盖value
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
// 步骤④:判断该链为红黑树
else if (p instanceof TreeNode)
e = ((TreeNode&K,V&)p).putTreeVal(this, tab, hash, key, value);
// 步骤⑤:该链为链表
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key,value,null);
//链表长度大于8转换为红黑树进行处理
if (binCount &= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
// key已经存在直接覆盖value
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
if (e != null) { // existing mapping for key
V oldValue = e.
if (!onlyIfAbsent || oldValue == null)
afterNodeAccess(e);
return oldV
// 步骤⑥:超过最大容量 就扩容
if (++size & threshold)
afterNodeInsertion(evict);
当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组,就像我们用一个小桶装水,如果想装更多的水,就得换大水桶。
鉴于JDK1.8融入了红黑树,较复杂,为了便于理解我们仍然使用JDK1.7的代码,好理解一些,本质上区别不大,具体区别后文再说。
1 void resize(int newCapacity) {
//传入新的容量
Entry[] oldTable =
//引用扩容前的Entry数组
int oldCapacity = oldTable.
if (oldCapacity == MAXIMUM_CAPACITY) {
//扩容前的数组大小如果已经达到最大(2^30)了
threshold = Integer.MAX_VALUE; //修改阈值为int的最大值(2^31-1),这样以后就不会扩容了
Entry[] newTable = new Entry[newCapacity];
//初始化一个新的Entry数组
transfer(newTable);
//!!将数据转移到新的Entry数组里
table = newT
//HashMap的table属性引用新的Entry数组
threshold = (int)(newCapacity * loadFactor);//修改阈值
transfer()方法将原有Entry数组的元素拷贝到新的Entry数组里。
1 void transfer(Entry[] newTable) {
Entry[] src =
//src引用了旧的Entry数组
int newCapacity = newTable.
for (int j = 0; j & src. j++) { //遍历旧的Entry数组
Entry&K,V& e = src[j];
//取得旧Entry数组的每个元素
if (e != null) {
src[j] =//释放旧Entry数组的对象引用(for循环后,旧的Entry数组不再引用任何对象)
Entry&K,V& next = e.
int i = indexFor(e.hash, newCapacity); //!!重新计算每个元素在数组中的位置
e.next = newTable[i]; //标记[1]
newTable[i] =
//将元素放在数组上
//访问下一个Entry链上的元素
} while (e != null);
同一位置上新元素总会被放在链表的头部位置
我们在扩充HashMap的时候,不需要像JDK1.7的实现那样重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了
(这部分并没有完全懂)
HashMap在多线程的情况下可能链结构会受到破坏,导致无限循坏(JDK8 可能已经解决)
(1) 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。
(2) 负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊。
(3) HashMap是线程不安全的,不要在并发的环境中同时操作HashMap,建议使用ConcurrentHashMap。
(4) JDK1.8引入红黑树大程度优化了HashMap的性能。
参考资料:
美团点评技术团队 Java 8系列之重新认识HashMap
为什么一般hashtable的桶数会取一个素数
阅读(...) 评论()在php中使用sockets:从新闻组中获取文章
PHP能打开远程或本地主机上的Socket端口。本文是一个使用Socket的小例子:连接到一个Usenet新闻组服务器,同服务器对话,从新闻组中下载一些文章。
在php中打开一个socket使用fsockopen()打开一个socket.这个函数在php3和php4种都可以使用。函数声明是这样的:
int fsockopen (string hostname, int port _[, int errno [, string errstr [, double timeout]]])
这个函数将打开一个连接到主机hostname的port端口的TCP连接。hostname可以是一个有效的域名,或者是一个ip地址。对于udp连接,你必须指定协议:udp://hostname. 对于unix域,主机名使用到socket的路径,这种情况下,端口port必须置为0。可选的timeout参数用来设定等待打开一个socket的时间,单位为秒。
关于fsockopen()的更多信息,请参考:http://www.php.net/manual/function.fsockopen.php
网络新闻传输协议 && 访问新闻组服务器需要通过称为NNTP(网络新闻传输协议)的协议来进行。这个协议在rfc977中有详细的细节,可以在http://www.w3.org/Protocols/rfc977/rfc977.html得到。这个文档分别描述了怎样连接到NNTP服务器,怎样同服务器对话,以及完成这些任务的不同命令。
连接 && 连接到一个NNTP服务器需要知道它的主机名(或者是ip地址)和它侦听的端口。为了避免一个连接企图失败导致程序挂起,你应该使用timeout参数。 &&& &?php &&&&& $cfgServer&& = "your.news.host"; &&&&& $cfgPort&&&& = 119; &&&&& $cfgTimeOut& = 10;
//open a socket &&&&& if(!$cfgTimeOut) &&&&&&&& // without timeout &&&&&&&& $usenet_handle = fsockopen($cfgServer, $cfgPort); &&&&& else &&&&&&&& // with timeout &&&&&&&& $usenet_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);
if(!$usenet_handle) { &&&&&&&&& echo "Connection failed.\n"; &&&&&&&&& exit(); &&&&& } &&&&& else { &&&&&&&&& echo "Connected.\n"; &&&&&&&&& $tmp = fgets($usenet_handle, 1024); &&&&& }
?& 与服务器对话
现在我们已经连接到了服务器,可以通过前面打开的socket同服务器对话了。比如说我们要从某个新闻组得到最近的10篇文章。RFC977指出,第一步要用GROUP命令选择正确的新闻组: GROUP ggg 参数ggg是要选择的新闻组的名字(比如说是"net.news"),这是必需的。可用的新闻组的列表可以用LIST命令得到。选择新闻组的命令成功后,返回组中第一篇和最后一篇文章的文章编号,以及组中文章的数目。
下面是一个例子: &&& chrome:~$ telnet my.news.host 119 &&& Trying aa.bb.cc.dd... &&& Connected to my.news.host. &&& Escape character is '^]'. &&& 200 my.news.host InterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok). &&& GROUP alt.test &&& 211 232 235 alt.test &&& quit &&& 205 .
接收到命令 GROUP alt.test 后,服务器返回"211 232 235 alt.test". 211是RFC中定义的返回码,指示命令已成功执行。返回信息还指出,现在有232篇文章,最早的文章的编号是222996,最新的文章的编号是223235。我们看到,并不等于223235。丢失的7篇文章因为某种原因被从服务器删除了,可能是因为被它的合法作者取消了(这是可能的,而且很容易做到),或者因为是灌水文章而被删。
需要注意的事,有些服务器在选择新闻组之前可能要求身份认证,这取决于这是一个公共的或者是私用的服务器。也有可能服务器允许任何人读取文章,但发表文章需要身份验证。
//$cfgUser&&& = "xxxxxx"; &&&&& //$cfgPasswd& = "yyyyyy"; &&&&& $cfgNewsGroup = "alt.php";
//identification required on private server &&&&& if($cfgUser) { &&&&&&&&& fputs($usenet_handle, "AUTHINFO USER ".$cfgUser."n"); &&&&&&&&& $tmp = fgets($usenet_handle, 1024); &&&&&&&&& fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n"); &&&&&&&&& $tmp = fgets($usenet_handle, 1024);
//check error
if($tmp != "281 Okrn") { &&&&&&&&&&&&& echo "502 Authentication errorn"; &&&&&&&&&&&&& exit(); &&&&&&&&& } & }
//select newsgroup
fput($usenet_handle, "GROUP ".$cfgNewsGroup."n"); & $tmp = fgets($usenet_handle, 1024);
if($tmp == "480 Authentication required for commandrn") { &&&& echo $ &&&& exit(); & }
$info = split(" ", $tmp); & $first= $info[2]; & $last = $info[3];
printf("First : %sn", $first); & printf("Last : %lastn", $last);
本文实例讲述了PHP实现简单的新闻发布系统.分享给大家供大家参考.具体如下: 本人小白,一直在公司用模板和框架写PHP,发现有时候连基本的sql语句都忘记了,所以有空想把PHP基础复习下,巩固下.分页和搜索,以及排序,还没写,后期继续更新...(代码修改:添加搜索和分页功能) articlePublish.html: &!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3
现在jquery的应用越来越广泛了,在很多网站的新闻板块都实现了 标签分类 + 无刷新分页 的效果. 也自己尝试写了一个,效果图如下(样式可以按用户需求自己去整): 接下来详细介绍实现过程: 我一向是见招拆招的解决思路,这里需要运用到3个东西--标签页效果插件和分页插件,jquery的getJson请求. 因此我使用了jquery-ui插件,jquery-page插件,现提供下载地址: jquery_all.rar 里面包含了3个JS脚本文件和2个样式表:jquery-1.3.2.min.jsj
我们可以用新闻系统来存储新闻,我们可以对新闻进行添加.删除等操作,这样减少了大家的工作量,为什么不实验一下. 首先,建立一个表. create table news ( n_id int(255) not null auto_increment, n_date datetime not null, news text not null, primary key(n_id) ); 第二步,设置你的登陆信息 $database_user_name=&root&;
我们浏览一些网站的时候,往往看到一些新闻是刚刚更新不久的,如果要是人工维护的话,那会是一项非常繁琐的工作.然而,我们可以通过程序来控制实现更新操作,事情就会变得很方便了(我可不是要偷懒). 在这里,我使用PHP来实现这一功能.其原理就是根据新闻发布的时间逆序排列好,然后在一页面显示新闻连接列表,每一个连接都对应一条新闻内容网页.具体操作如下: 一.首先,在你的站点下建立一个目录,将编辑好的新闻页都保存在此目录下,将来所有的新闻页都放入这里,方便维护.新闻页格式为超文本方式(可别说你还不会HTML
简单的php新闻发布系统教程(第一版)第一讲:用 phpmyadmin 建立数据库首先建立一个数据库,名为 yayu .在这个数据库下建立一个数据表,名为 news .下面进入一个重点,那就是在表 news 下建立各个字段. 那么,什么叫字段呢?通俗点,就是一类事物的总称.比如说,所有的新闻发表时间用一个名词来代表(从偶的经验来看,用 phpmyadmin 建立 字段可以用中文,但从习惯来说还是用英文,没办法,计算机美国最牛嘛).偶们用& time &来表示.在字段 time 下可以有
本文实例讲述了php实现修改新闻时删除图片的方法.分享给大家供大家参考.具体实现方法如下: //old_contents:待修改的公告内容; //$content:修改后的公告内容 $oldPic=array(); $nowPic=array(); preg_match_all(&/\&IMG(.*?)src=\&(.*?)\&&/&,$old_contents,$match); if(!empty($match[2])){ foreach($match
show.php源代码: &? if ($action==&cp&){ echo&&div align=center&
&p&滚动菜单资料输入端&/p&
&form method=post action=show.php?action=edit&
&p&文字一:
&input type=text name=t1 maxlength=30&
function CreateShtml()
ob_start(array(&callback_CreateShtml&,&callback_GoToShtml&));
} function callback_CreateShtml($buffer)
$page = intval(@$_REQUEST[&page&]);
$fileName = $_SERVER['DOCUMENT_ROOT'] . dirname($_SER
Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件. 逆向工程 1.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po..) 企业实际开发中,常用的逆向工程方式: 由于数据库的表生成java代码. 2.下载逆向工程 my
大家都知道,生成静态页的方法有两种,第一种是使用C#在后台硬编码,第二种是读取模板文件,使用字符串代替.总体来讲第一种方法代码量比较大,维护起来有点困难.生成静态页的目的是为了提高用户体验度,加快访问速度. 使用静态页面还有如下好处: 1. 安全:使用静态页面,用户访问的使没有任何操作功能的html页面,可以说从安全性方面大大提高了程序及服务器的安全. 2. 快速:用户访问的是提前生成好的静态页面,使用户对页面的请求瓶颈只受IO的限制而不会有其他方面的影响. 3. 降低服务器,数据库负载:因为用
新闻列表: 复制代码 代码如下: &div class=&news_list&& &asp:Repeater ID=&gsxw& runat=&server& DataSourceID=&GetNewsByType&& &ItemTemplate& &ul& &li&&span& &%# Convert.ToDateTime(Eval(&N
Yii2 框架 之所以称之为高效快速开发的一款框架,是因为有一个神奇的工具Gii 用过Yii1框架的Coder都知道,Gii可以为你快速生成代码,也就是说搭建一个可以增删改查的WebApp可能一行代码都不用写. 当然作为Coder,不写代码怎么能实现我们想要的功能呢. 上次介绍了如何安装Yii框架,本次介绍一下如何使用gii工具快速实现CRUD功能. 框架安装完成后可以通过如下链接访问Gii工具 http://localhost/yii2test/backend/web/index.php?r=
为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,ORM 的出现就是为了简化开发.最初的开发方式是业务逻辑和数据库查询逻辑是分开的,或者在程序中编写 sql 语句,或者调用 sql 存储过程.这样导致思维需要在语言逻辑和 sql 逻辑之间切换,导致开发效率低下.所以出现了一系列的 ORM 框架,ORM 框架将数据库表和 Java 对象对应起来,当操作数据库时,只需要操作对象的 Java 对象即可,例如设置几个 and 条件,只需要设置几个属性即可. 为什么要有myba
本文实例为大家分享了新闻列表分页查询的java代码,供大家参考,具体内容如下 package com.ibeifeng. //创建新闻测试类 public class newTest { private S private S private S public newTest() { super(); } public newTest(long id, String titl
例如 我们有如下这么一个对象 复制代码 代码如下: var obj = { a:{ b:&bb& } } 但是我们现在想给 obj 对象增加如下属性 obj.a.b.c.d.f=&ff& ; 我们一般会如下做,obj.a.b.c={},obj.a.b.c.d={} ,obj.a.b.c.d.f=&ff& ;但是如果我的属性很多,这样的方法时不可行的.现在提供一个自动生成对象属性的方法 复制代码 代码如下: function autoCreateO
在android开发过程中,界面布局是及其重要的,但同时也是复杂.有的时候我们急于实际运行查看布局效果.但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下. 尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码. 首先声明:
1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用. 2.只能生成有id标签的view的初
本文实例讲述了JSP实现用于自动生成表单标签html代码的自定义表单标签.分享给大家供大家参考.具体如下: 这个是自己写的一个简单的JSP表单标签,用于自动生成checkbox,select,radio等标签,传入菜单集合生成html代码,自动选中指定值,用于java web项目的jsp页面. 1. Servlet部分代码: Map&String, String& map = new HashMap&String, String&(); map.put(&2&,

我要回帖

更多关于 求素数的c语言程序 的文章

 

随机推荐