首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

guorabbit/ 


共5个网摘 [ 1 ]   |  访问guorabbit的个人空间

关于JAVA内存泄漏问题注意事项-Java频道-中国IT实验室

guorabbit收录,使用标签:java, 内存泄漏,时间:2008-5-7 20:11:54 | 相关网摘我也收藏

关于JAVA内存泄漏问题注意事项
中国IT实验室收集整理 佚名 2007-11-14 保存本文 推荐给好友 收藏本页   Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或 JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。

  在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

  在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此不需要考虑这部分的内存泄露。

  注意事项:

  1.最基本的建议是尽早释放无用对象的引用。如:

  ……

  A a = new A();

  //应用a对象

  a = null; //当使用对象a之后主动将其设置为空

  …。

  注:如果a 是方法的返回值,不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除

  2.尽量少用finalize函数。它会加大GC的工作量。

  3.如果需要使用经常用到的图片,可以使用soft应用类型。它尽可能把图片保存在内存中

  4.注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。

  5.尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费

  6.尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间

  7.尽量避免显式申请数组空间

  8.尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。

  9.尽量在合适的场景下使用对象池技术以提高系统性能。


Java程序员:一刻钟精通正则表达式-Java频道-中国IT实验室

guorabbit收录,使用标签:正则表达式, Java,时间:2008-5-7 20:07:55 | 相关网摘我也收藏

Java程序员:一刻钟精通正则表达式
中国IT实验室收集整理 佚名 2007-11-13 保存本文 推荐给好友 收藏本页
  现在, 用户名的开始和结束都不能是句点。 服务器也是这样。 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:

  ^[_a-zA-Z0-9-]+$

  现在还不能允许句号的存在。 我们把它加上:

  ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$

  上面的意思就是说: "以至少一个规范字符(除了。)开头,后面跟着0个或者多个以点开始的字符串。"

  简单化一点, 我们可以用 eregi()取代 ereg()。eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" ? 只需要指定一个就可以了:

  ^[_a-z0-9-]+(\.[_a-z0-9-]+)*$

  后面的服务器名字也是一样,但要去掉下划线:

  ^[a-z0-9-]+(\.[a-z0-9-]+)*$

  好。 现在只需要用“@”把两部分连接:

  ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$

  这就是完整的email认证匹配模式了,只需要调用

  eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)

  就可以得到是否为email了。

  正则表达式的其他用法

  提取字符串

  ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册)。 比如说,我们想从 path/URL 提取文件名 ? 下面的代码就是你需要:

  ereg("([^\\/]*)$", $pathOrUrl, $regs);

  echo $regs[1];

  高级的代换

  ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号:

  ereg_replace("[ \n\r\t]+", ",", trim($str));

  最后,我把另一串检查EMAIL的正则表达式让看文章的你来分析一下。

  "^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$"

  如果能方便的读懂,那这篇文章的目的就达到了。


比word先进的字数统计

guorabbit收录,使用标签:java, 字数统计,时间:2008-5-6 23:00:02 | 相关网摘我也收藏

比word先进的字数统计
我测试过了,基本接近完美,但是肯定还有BUG 望提出!谢谢

Java code
package taotao.montao.demo;

/**
* 获取文章的字数或则字符数
* @author montao
*/
public class StatWordCount {

private final char[] CHS = {',',';','.','!','?',';','+','。','?','!'}; //符号数组

private final char[] CHN = {'\n','\r'}; //转义符数组

private final char[] SPACE = {' ',' '}; //空格的数组(前半角,后全角)

/**
* 根据指定条件来筛选文章的字数
* @param wordContent 文章内容
* @param compriseInterpunction 是否包含指定字符
* @param compriseSpace 是否包含空格
* @return 返回文章经过指定筛选后的长度
*/
public int getWordCount(String wordContent,boolean compriseInterpunction,boolean compriseSpace)
{
if(wordContent==null){
return 0;
}else if(wordContent.length()==0){
return 0;
}else{
//既要包含符号又要包含空格
if(compriseInterpunction && compriseSpace){
//清除转义符
String regex = "["+new String(CHN)+"]";
wordContent = wordContent.replaceAll(regex," ");
return this.getWordCount(wordContent);
}
//不包含符号包含空格
else if(!compriseInterpunction && compriseSpace){
//使用正则表达式去掉指定的符号和转义符
String regex1 = "["+new String(CHN)+"]";
String regex2 = "["+new String(CHS)+"]";
wordContent = wordContent.replaceAll(regex1," ");
wordContent = wordContent.replaceAll(regex2," ");
return this.getWordCount(wordContent);
}
//包含指定符号不包含空格
else if(compriseInterpunction && !compriseSpace){
//使用正则表达式去掉空格和转义符
String regex1 = "["+new String(CHN)+"]";
String regex2 = "["+new String(SPACE)+"]";
wordContent = wordContent.replaceAll(regex1," ");
wordContent = wordContent.replaceAll(regex2," ");
return this.getWordCount(wordContent);
}
//空格和指定符号都不包含
else{
//使用正则表达式去掉空格,指定符号和转义符
String regex1 = "["+new String(CHN)+"]";
String regex3 = "["+new String(CHS)+"]";
String regex2 = "["+new String(SPACE)+"]";
wordContent = wordContent.replaceAll(regex1," ");
wordContent = wordContent.replaceAll(regex2," ");
wordContent = wordContent.replaceAll(regex3," ");
return this.getWordCount(wordContent);
}
}
}

/**
* 返回文章中的字数
* @param wordCount 文章内容
* @return
*/
@SuppressWarnings("unused")
private int getWordCount(String wordContent){
int count = 0;
if(wordContent==null){ //判断是否为null,如果为null直接返回0
count = 0;
}else if(wordContent.length()==0){ //判断是否为空,如果为空直接返回0
count = 0;
}else{ //判断获取字数
wordContent = wordContent.trim(); //清空空格
//临时变量
String s4 = "";
String s3 = "";
String s1 = "";
boolean bb = false;
if(wordContent.length()>0){
s4 = String.valueOf(wordContent.charAt(wordContent.length()-1));
}
for(int i=0;i s3 = String.valueOf(wordContent.charAt(i));
int num = s3.getBytes().length;
if(s3.hashCode()==32||s3.getBytes().length==2){
bb=true;
}if(num==2){
count++;
}else{
if(i+11)){
s1 = String.valueOf(wordContent.charAt(i+1));
if((s1.hashCode()==32||s1.getBytes().length==2)&&(s3.hashCode()!=32)){
count++;
}
}
}
}
if(!bb){
count++;
}else{
if(s4.getBytes().length==1){
count++;
}
}
}
return count;
}

/**
* 根据条件来获取文章的字符数
* @param wordContent 文章内容
* @param compriseInterpunction 是否包含指定符号
* @param compriseSpace 是否包含空格
* @return 返回字符长度
*/
public int getWordCharacter(String wordContent,boolean compriseInterpunction,boolean compriseSpace)
{
//既要包含符号又要包含空格
if(compriseInterpunction && compriseSpace){
//清除转义符
String regex = "["+new String(CHN)+"]";
wordContent = wordContent.replaceAll(regex," ");
//首部的空格不算
wordContent = wordContent.replaceAll("^\\s+","");
return wordContent.length();
}//不包含符号包含空格
else if(!compriseInterpunction && compriseSpace){
//首部的空格不算
wordContent = wordContent.replaceAll("^\\s+","");
//使用正则表达式去掉指定的符号和转义符
String regex1 = "["+new String(CHN)+"]";
String regex2 = "["+new String(CHS)+"]";
wordContent = wordContent.replaceAll(regex1," ");
wordContent = wordContent.replaceAll(regex2," ");
return wordContent.length();
}//包含指定符号不包含空格
else if(compriseInterpunction && !compriseSpace){
//使用正则表达式去掉空格和转义符
return this.getNoSpaceCount(wordContent);
}//空格和指定符号都不包含
else{
//使用正则表达式去掉指定符号
String regex1 = "["+new String(CHS)+"]";
wordContent = wordContent.replaceAll(regex1," ");
return this.getNoSpaceCount(wordContent);
}
}

/**
* 获取文章中非空格的字符总数
* @param wordContent 文章内容
* @return
*/
private int getNoSpaceCount(String wordContent) {
int spaceCount = 0;
if(wordContent==null)
{
spaceCount = 0;
}else if(wordContent.length()==0)
{
spaceCount = 0;
}else
{
//替换首部的
wordContent = wordContent.replaceAll("^\\s+","");
wordContent = wordContent.replaceAll(" ","");
//使用正则替换转义符
String regex = "["+new String(CHN)+"]";
wordContent = wordContent.replaceAll(regex,"");
spaceCount = wordContent.length();
}
return spaceCount;
}
}


Java连接SQL Server 2000_雪落无声

guorabbit收录,使用标签:java, sql, 连接,时间:2008-5-6 22:58:59 | 相关网摘我也收藏

Java连接SQL Server 2000 http://tech.163.com/school · 2005-08-30 15:57:50 · 来源: CSDN
数据库操作现在是项目开发的根本,学习Java首先应该学会怎么样连接数据库,用Java连接数据库可不像用Delphi这类工具那样设几个属性就OK,说简单也简单,说复杂,其实也挺复杂的,而且很麻烦,如果是初学,根本不能保证第一次就连接成功,下面以SQL Server 2000为例,说说Java连接数据库的基本方法,也记录一下心得。

1、下载SQL Server 2000 driver for JDBC
SQL Server 2000 Driver For JDBC Downloads
该驱动截止目前有四个版本,建议下载最新的SP3版。
该驱动安装成功后,请将安装目录下的lib目录下的三个.jar文件加到CLASSPATH中;如果你使用的是JBuilder或Eclipse,将这三个文件根据IDE的提示加到工程中也可。

2、升级你的SQL Server 2000,为其打上最新的补丁。
这一步可能不是必需的,因操作系统环境而定,在不打补丁的情况,有时可以正常连接,有时却不能,所以建议还是安装最新的SQL Server 2000补丁(SP4)和JDBC驱动(SP3)。
如果你的程序在运行时提示:Error establishing socket,一般情况下,打上SQL Server 2000的补丁就可解决。

3、驱动的加载方法
在建立连接之前,要先加载SQL Server 2000 JDBC的驱动,代码形式如下:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
在此注意,forName方法的参数字符串必须完全相同于以上内容,大小写是区分的,其实这个串就是驱动类的完整名称:包名+类名。

4、获得一个连接
在操作数据库之前,要先获得与数据库的一个连接,使用如下代码格式:
DriverManager.getConnection(连接字符串, 登录用户名, 登录密码);
例:
DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs", "sa", "");
在此处关键的是连接字符串的内容,localhost部分即服务器的名字,可以更改;1433部分为SQL Server使用的端口号,根据实际情况修改即可;DatabaseName即为要连接的数据库的名字,在此注意DatabaseName之前的是分号,而不是冒号。

5、代码实例

// 导入Java SQL包,连接数据库必需;
import java.sql.*;

public class TestDB {
public static void main(String[] args) {
String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String dbURL = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs";
String userName = "sa";
String userPwd = "";
Connection dbConn

try {
Class.forName(driverName);
dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
System.out.println("Connection Successful!");
}
Catch (Exception e) {
e.printStackTrace();
}
}
}


6、可能出现的问题
如果以上的代码运行后,输出"Connection Successful!",那就代表一切正常,连接数据库成功,你可以进行Statement、ResultSet的操作了;反之的话,一定是出现了相应的异常。
如果提示错误"Error establishing socket",请根据之前的说明安装相应的SQL Server 2000补丁即可。
如果提示"ClassNotFoundException",那一定是 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 该段代码拼写有误,或者是SQL Server 2000 Driver For JDBC Lib目录下的三个.jar文件未加入到CLASSPATH中。



共5个网摘 [ 1 ] 

guorabbit/相关标签



网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
Copyright © 2000-2008, CSDN.NET, All Rights Reserved