- 浏览: 925025 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
第一个程序:
import java.util.ArrayList; import java.util.List; public class TailRecursionTest { public static void main(String[] args) { TailRecursionTest t = new TailRecursionTest(); for (int i = 0; i < 10000; i++) t.a(0); } public void a(int j) { j++; List list = new ArrayList<Integer>(100000); // 对list进行处理 } }
没啥特殊的,仅仅是为了测试,我们将a方法调用10000次,a方法创建一个有100000个元素的list的局部变量。
第二个程序:
import java.util.ArrayList; import java.util.List; public class TailRecursionTest2 { public static void main(String[] args) { TailRecursionTest2 t = new TailRecursionTest2(); t.a(0); } public void a(int j) { System.out.println(j); j++; if (j == 10000) return; List list = new ArrayList<Integer>(100000); // 对list进行处理 a(j); } }
也没啥特殊的,就是将循环换成了递归,a方法做的事情没变。两个都跑一下,程序1顺利结束,程序2出问题了,啥问题?如下:
161 162 163 164 165 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.ArrayList.<init>(Unknown Source) at TailRecursionTest2.a(TailRecursionTest2.java:17) at TailRecursionTest2.a(TailRecursionTest2.java:20) at TailRecursionTest2.a(TailRecursionTest2.java:20) at TailRecursionTest2.a(TailRecursionTest2.java:20) at TailRecursionTest2.a(TailRecursionTest2.java:20)
我倒,才运行166次了,heap就满了。问题在哪呢?oh,yep,你肯定想到了,是不是重复创建list这个大集合引起的呢?它不是局部变量吗?怎么 也会溢出?是的,list是局部变量,在a的方法栈里引用着,指向heap上的大对象,更关键的问题在于,java是没有尾递归优化的,递归方法是不会使 用同一个栈帧,每一次递归调用,都将压入新的栈帧,并且这个栈帧上又new了一个list变量,引用着heap上新的一个大集合。随着栈深度的增加, jvm里维持着一条长长的方法调用轨迹以便你能回来,在方法没有返回之前,这些list变量一直被各自的栈帧引用着,不能被GC,你说,能不OOM吗?
也许,你想到了个补救方法来挽救程序2,就是每次在处理完list后,我把它设置为null,不让栈帧继续引用着它,咱编写对gc友好的代码,这不就行了,试试:
import java.util.ArrayList; import java.util.List; public class TailRecursionTest2 { public static void main(String[] args) { TailRecursionTest2 t = new TailRecursionTest2(); t.a(0); } public void a(int j) { System.out.println(j); j++; if (j == 10000) return; List list = new ArrayList<Integer>(100000); // 对list进行处理 list = null; //gc友好 a(j); } }
得意洋洋,我跑一下看看,这次跑到4000多次,但是:
...... 4289 4290 4291 4292 java.lang.StackOverflowError at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source) at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source) at java.nio.charset.CharsetEncoder.encode(Unknown Source)
没办法啊,人家sun的jdk就是不支持尾递归优化(据说传闻在jdk5的某个版本是有尾递归优化的),很不给你面子的栈溢出了。ibm的jdk据说支持尾递归优化,上面这个程序在ibm的jdk上可能可以正常结束,未经测试。
总结:在java里,递归最好咱还是别用,老老实实地while、for;就算递归了,最好递归方法不要new太大的对象,除非你能确定递归的深度不是那么大,否则OOM和堆栈溢出的阴影将笼罩着你。
评论
java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-237)
Java HotSpot(TM) Client VM (build 1.5.0_13-119, mixed mode, sharing)
用一个while再一个栈来完成, 那也是递归啊!
import java.util.ArrayList; import java.util.List; public class TailRecursionTest { public static void main(String[] args) { TailRecursionTest t = new TailRecursionTest(); t.a(0); } public void a(int j) { System.out.println(j); j++; if (j<10000) //if (j!=10000) 也可以 return; List list = new ArrayList<Integer>(100000); a(j); } }
递归 ,学习,以上我把if条件小改动了下,可以成功,不知道怎么解释:)
无语了,0<10000,一次还没跑完。
^_^ 有意思
无语了,0<10000,一次还没跑完。
我错了,撞墙
import java.util.ArrayList; import java.util.List; public class TailRecursionTest { public static void main(String[] args) { TailRecursionTest t = new TailRecursionTest(); t.a(0); } public void a(int j) { System.out.println(j); j++; if (j<10000) //if (j!=10000) 也可以 return; List list = new ArrayList<Integer>(100000); a(j); } }
递归 ,学习,以上我把if条件小改动了下,可以成功,不知道怎么解释:)
无语了,0<10000,一次还没跑完。
import java.util.ArrayList; import java.util.List; public class TailRecursionTest { public static void main(String[] args) { TailRecursionTest t = new TailRecursionTest(); t.a(0); } public void a(int j) { System.out.println(j); j++; if (j<10000) //if (j!=10000) 也可以 return; List list = new ArrayList<Integer>(100000); a(j); } }
递归 ,学习,以上我把if条件小改动了下,可以成功,不知道怎么解释:)
嗯,这仅仅是对OOM问题的分析做多一种设想。
我以前写的递归基本上没有创建大的对象,所以没有碰到此问题,今天楼主提出来了,以后恐怕得多注意了
你方法里的代码是不是太长了啊~!
呵呵
package byd.biz; import javax.ejb.Stateless; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; /** * * @author ll258583 */ @Stateless(name = "xoServiceBean") public class xoServiceBean implements xoServiceLocal { @PersistenceContext(unitName = "xoServicePU") private EntityManager em; /** * Set JAXB object's value to the EntityBean object * @param jxo * @param eto */ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void x2o(Object jxo, Object eto) { System.out.println("------------------------------------------------------------------"); System.out.println(eto.getClass().getName()); //validate if two papramater are matchable if (eto.getClass().getPackage().getName().equals("byd.entity") && jxo.getClass().getPackage().getName().equals("byd.xoMapping.pip4A3") && eto.getClass().getName().substring(12).equals(jxo.getClass().getName().substring(21))) { Field[] etoDeclaredFields = eto.getClass().getDeclaredFields(); Field[] jxoDeclaredFields = jxo.getClass().getDeclaredFields(); for (int i = 0; i < etoDeclaredFields.length; i++) { for (int j = 0; j < jxoDeclaredFields.length; j++) { Field etoField = etoDeclaredFields[i]; Class etoFieldType = etoField.getType(); String etoFieldName = etoField.getName(); Field jxoField = jxoDeclaredFields[j]; String jxoFieldName = jxoField.getName(); try { if (etoFieldName.toLowerCase().equals(jxoFieldName.toLowerCase())) { if (etoFieldType.getName().equals("java.lang.String")) { //in case of basic type(java.lang.String) filed System.out.println(etoFieldName + " : " + etoFieldType.getName()); Class<?>[] paras = null; Object[] args = null; Method jxoGetMethod = jxo.getClass().getDeclaredMethod("get" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), paras); String value = (String) jxoGetMethod.invoke(jxo, args); if (value != null) { Method etoSetMethod = eto.getClass().getDeclaredMethod("set" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), etoFieldType); etoSetMethod.invoke(eto, value); } else { System.out.println("STRING IS NULL"); } } else if (etoFieldType.getName().equals("java.util.List")) { //in case of java.util.List field System.out.println(etoFieldName + " : " + etoFieldType.getName()); Class<?>[] paras = null; Object[] args = null; Method jxoGetMethod = jxo.getClass().getDeclaredMethod("get" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), paras); Method etoGetMethod = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); List jxoMemberList = (List) jxoGetMethod.invoke(jxo, args); if (jxoMemberList.size() != 0 && jxoMemberList != null) { List etoMemberList = (List) etoGetMethod.invoke(eto, args); etoMemberList = new ArrayList(); for (Object jxm : jxoMemberList) { Class C = Class.forName("byd.entity._" + jxm.getClass().getName().substring(21)); Object etm = C.newInstance(); this.x2o(jxm, etm); etoMemberList.add(etm); } } else { System.out.println("LIST IS EMPTY OR NULL"); } } else if (etoFieldType.getName().equals("java.util.ArrayList")) { //in case of java.util.ArrayList<String>() field System.out.println(etoFieldName + " : " + etoFieldType.getName()); Class<?>[] paras = null; Object[] args = null; Method jxoGetList = jxo.getClass().getDeclaredMethod("get" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), paras); List<String> stringList_1 = (List<String>) jxoGetList.invoke(jxo, args); if (stringList_1 != null && stringList_1.size() != 0) { Method etoGetList = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); ArrayList stringList_2 = (ArrayList) etoGetList.invoke(eto, args); stringList_2 = new ArrayList<String>(); for (String str_1 : stringList_1) { String str_2 = new String(str_1); stringList_2.add(str_2); } } else { System.out.println("ArrayList<String> IS NULL OR EMPTY"); } } else { //in case of other class type field System.out.println(etoFieldName + " : " + etoFieldType.getName()); Class<?>[] paras = null; Object[] args = null; Method jxoGetMethod = jxo.getClass().getDeclaredMethod("get" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), paras); Object nextJxo = jxoGetMethod.invoke(jxo, args); if (nextJxo != null) { // Method etoGetMethod = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); Method etoSetMethod = eto.getClass().getDeclaredMethod("set" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), etoFieldType); Object nextEto = etoFieldType.newInstance(); etoSetMethod.invoke(eto, nextEto); this.x2o(nextJxo, nextEto); } else { System.out.println(jxoFieldName + " IS NULL"); } } } } catch (ClassNotFoundException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (InstantiationException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalArgumentException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (InvocationTargetException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchMethodException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (SecurityException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } } } } else { // throw new UnmatchableException(); System.out.println("UnmatchableException"); } //persist the entityBean object's value System.out.println("Persist : " + eto.getClass().getName()); em.persist(eto); } /** * Set EntityBean's value to the JAXB object * @param eto * @param jxo */ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void o2x(Object eto, Object jxo) { System.out.println("------------------------------------------------------------------"); System.out.println(eto.getClass().getName()); //validate if two papramater are matchable if (eto.getClass().getPackage().getName().equals("byd.entity") && jxo.getClass().getPackage().getName().equals("byd.xoMapping.pip4A3") && eto.getClass().getName().substring(12).equals(jxo.getClass().getName().substring(21))) { Field[] etoDeclaredFields = eto.getClass().getDeclaredFields(); Field[] jxoDeclaredFields = jxo.getClass().getDeclaredFields(); for (int i = 0; i < jxoDeclaredFields.length; i++) { for (int j = 0; j < etoDeclaredFields.length; j++) { Field jxoField = jxoDeclaredFields[i]; String jxoFieldName = jxoField.getName(); Field etoField = jxoDeclaredFields[j]; String etoFieldName = etoField.getName(); try { if (etoFieldName.toLowerCase().equals(jxoFieldName.toLowerCase())) { if (jxoField.getType().getName().equals("java.lang.String")) { //in case of basic type(java.lang.String) filed System.out.println(jxoField.getName() + " : " + jxoField.getType().getName()); Class<?>[] paras = null; Object[] args = null; Method etoGet = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); String value = (String) etoGet.invoke(eto, args); if (value != null) { Method jxoSet = jxo.getClass().getDeclaredMethod("set" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), jxoField.getType()); jxoSet.invoke(jxo, value); } else { System.out.println("STRING IS NULL"); } } else if (jxoField.getType().getName().equals("java.util.List")) { //in case of collection(java.util.List) field System.out.println(jxoField.getName() + " : " + jxoField.getType().getName()); Class<?>[] paras = null; Object[] args = null; Method etoGetList = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); List etoList = (List) etoGetList.invoke(eto, args); if (etoList.size() != 0 && etoList != null) { Method jxoGetList = jxo.getClass().getDeclaredMethod("get" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), paras); List jxoList = (List) jxoGetList.invoke(jxo, args); jxoList = new ArrayList(); for (Object etm : etoList) { Class C = Class.forName("byd.xoMapping.pip4A3." + etm.getClass().getName().substring(12)); Object jxm = C.newInstance(); this.o2x(etm, jxm); jxoList.add(jxm); } } else { System.out.println("LIST IS NULL OR EMPTY"); } } else if (etoField.getType().getName().equals("java.util.ArrayList")) { //in case of ArrayList<String> field System.out.println(jxoField.getName() + " : " + jxoField.getType().getName()); Class<?>[] paras = null; Object[] args = null; Method etoGetList = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); ArrayList<String> stringList_1 = (ArrayList<String>) etoGetList.invoke(jxo, args); if (stringList_1 != null && stringList_1.size() != 0) { Method jxoGetList = jxo.getClass().getDeclaredMethod("get" + jxoFieldName.substring(0, 1).toUpperCase() + jxoFieldName.substring(1), paras); List stringList_2 = (List) jxoGetList.invoke(jxo, args); stringList_2 = new ArrayList<String>(); for (String str_1 : stringList_1) { String str_2 = new String(str_1); stringList_2.add(str_2); } } else { System.out.println("ArrayList<String> IS NULL OR EMPTY"); } } else { //in case of other class type field Class<?>[] paras = null; Object[] args = null; Object arg = null; Method etoGet = eto.getClass().getDeclaredMethod("get" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), paras); Object nextEto = etoGet.invoke(jxo, arg); if (nextEto != null) { Method jxoSet = jxo.getClass().getDeclaredMethod("set" + etoFieldName.substring(0, 1).toUpperCase() + etoFieldName.substring(1), jxoField.getType()); Object nextJxo = jxoField.getType().newInstance(); jxoSet.invoke(jxo, nextJxo); this.o2x(nextEto, nextJxo); } else { System.out.println(etoFieldName + " IS NULL"); } } } } catch (InstantiationException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalArgumentException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (InvocationTargetException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchMethodException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } catch (SecurityException ex) { Logger.getLogger(xoServiceBean.class.getName()).log(Level.SEVERE, null, ex); } } } } else { // throw new UnmatchableException(); System.out.println("UnmatchableException"); } } }
* the security model requires stack frame information
* reflection relies on "stack crawling"
* stack traces would be incomplete
* debugging would be problematic
You have the points.
BTW: It seems FF3 RC1 is not well supported by JavaEye.
* the security model requires stack frame information
* reflection relies on "stack crawling"
* stack traces would be incomplete
* debugging would be problematic
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8418一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3389充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4747翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-BETA版
2009-03-09 15:32 3979xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4129俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 2958yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 73041、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5363yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7531在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1808项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3001过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 1958项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5693阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2079典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 1960这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2742前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8045分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2101HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10758Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28241、如果用java6的ScriptEngineManager ...
相关推荐
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。而且算法已经被广泛的应用到商业、网络安全等各个领域。...完整的Java代码实现。
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
13给定如下所示的Java代码,要使这段代码能够编译成功,横线处应该填入( )。(选择一项) Public______count(int i,double d){ return i*d; } A.void B.int C.char D.double 14在java中,源文件Test.java中...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
Java 比较两个日期的代码,2段代码 1是计算两个日期相差多少天,2是比较两个日期先后
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
本教程特点: 1.更适合零基础学员: ·自Java语言起源始,循序渐进...·Java语言基础阶段:12720行代码,Java语言高级阶段:11684行代码 ·课堂实战项目3套,课后实战项目2套 ·近百道企业面试真题精讲精练、极具实战性
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
从控制台输入两个整数数,输出两个数加、减、乘、除、取余的结果。 2. 从控制台输入任意4位整数,输出该数字的各位数字之...要求:代码规范,有注释,能正确运行出结果,将.java源文件打包后,以自己的名字命名提交。
1 两点画直线段 2 两点画矩形 3 两点画椭圆 4 圆心半径画整圆 5 圆心半径画正三角形 6 圆心半径画正五边形 7 圆心半径画正五角形 二、图形编辑 1 单个图形的属性:颜色, 指定与修改 2 单个图形的删除,移动。 ...
15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
7 匹配身份证 8 匹配邮编代码 9. 不包括特殊字符的匹配 (字符串中不包括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖括号> 左尖括号反斜杠\ 即空格,制表符,回车符等 10 匹配非负整数(正...
由于项目需要,特研究了一段时间关于java爬虫的相关技术,发现一个比较好用的爬虫框架--WebMagic,只需少量代码即可实现一个爬虫,本项目就是基于它的一个简单实现,导入项目即可运行,项目只有两个类,一个用于抓取...
个人整理的一段安卓源代码,实现的功能是传入两个bmp图片,然后对比两个图片,源代码中是从一张大图片中找小图片,例如从一张有一千个各色钮扣的图片中,找里边一共有多少个红色钮扣,并且把这些红色钮扣的坐标值...
2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...