Rex

——生命不止,奋斗不息。
posts - 27, comments - 8, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

查找MS SQL SERVER 2005的相关文档后记录这些:
1.ANSI_NULLS

1SET ANSI_NULLS ON
2GO

上面第一行是 指定与空值一起使用时的等于 (=) 和不等于 (<>) 比较运算符的 SQL-92 标准行为。
SQL SERVER 的联机丛书里提道:后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
用法解释:SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。

当 SET ANSI_NULLS 为 ON 时,所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,如果数据值为 NULL,则所有数据对空值的比较将取值为 TRUE。如果未指定 SET ANSI_NULLS,则应用当前数据库的 ANSI_NULLS 选项设置。有关 ANSI_NULLS 数据库选项的详细信息,请参阅 ALTER DATABASE (Transact-SQL)设置数据库选项

仅当某个比较操作数是值为 NULL 的变量或文字 NULL 时,SET ANSI_NULLS ON 才会影响比较。如果比较双方是列或复合表达式,则该设置不会影响比较。

为使脚本按预期运行,不管 ANSI_NULLS 数据库选项或 SET ANSI_NULLS 的设置如何,请在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。

在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。

对计算列或索引视图创建或更改索引时,SET ANSI_NULLS 也必须为 ON。如果 SET ANSI_NULLS 为 OFF,则针对表(包含计算列或索引视图的索引)的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。SQL Server 将返回一个错误消息,该错误消息会列出所有违反所需值的 SET 选项。另外,在执行 SELECT 语句时,如果 SET ANSI_NULLS 为 OFF,则 SQL Server 将忽略计算列或视图的索引值并解析选择操作,就好像表或视图没有这样的索引一样。
ANSI_NULLS 是在处理计算列或索引视图的索引时必须设置为所需值的七个 SET 选项之一。还必须将选项 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 设置为 ON,而必须将 NUMERIC_ROUNDABORT 设置为 OFF。

2.SET QUOTED_IDENTIFIER

SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。有关详细信息,请参阅标识符。文字可以由单引号或双引号分隔。

当 SET QUOTED_IDENTIFIER 为 ON(默认值)时,由双引号分隔的所有字符串都被解释为对象标识符。因此,加引号的标识符不必符合 Transact-SQL 标识符规则。它们可以是保留关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。不能使用双引号分隔文字字符串表达式,而必须用单引号括住文字字符串。如果单引号 (') 是文字字符串的一部分,则可以由两个单引号 (") 表示。当对数据库中的对象名使用保留关键字时,SET QUOTED_IDENTIFIER 必须为 ON。

当 SET QUOTED_IDENTIFIER 为 OFF 时,表达式中的文字字符串可以由单引号或双引号分隔。如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。

当在计算列或索引视图上创建或更改索引时,SET QUOTED_IDENTIFIER 必须为 ON。如果 SET QUOTED_IDENTIFIER 为 OFF,则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列的索引视图和索引所必需的 SET 选项设置的详细信息,请参阅 SET (Transact-SQL) 中的“使用 SET 语句时的注意事项”。

在进行连接时,SQL 本机客户端 ODBC 驱动程序和 SQL Server 的 SQL Native Client OLE DB Provider 自动将 QUOTED_IDENTIFIER 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。对来自 DB-Library 应用程序的连接,SET QUOTED_IDENTIFIER 默认设置为 OFF。

创建表时,即使此时将 QUOTED IDENTIFIER 选项设置为 OFF,该选项在表的元数据中仍始终存储为 ON。

创建存储过程时,将捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置,并用于该存储过程的后续调用。

在存储过程内执行 SET QUOTED_IDENTIFIER 时,其设置不更改。

当 SET ANSI_DEFAULTS 为 ON时,将启用 SET QUOTED_IDENTIFIER。

SET QUOTED_IDENTIFIER 还与 ALTER DATABASE 的 QUOTED_IDENTIFER 设置相对应。有关数据库设置的详细信息,请参阅 ALTER DATABASE (Transact-SQL)设置数据库选项

SET QUOTED_IDENTIFIER 是在分析时进行设置的。在分析时进行设置意味着:SET 语句只要出现在批处理或存储过程中即生效,与代码执行实际上是否到达该点无关;并且 SET 语句在任何语句执行之前生效。


3.SET NOCOUNT ON
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数(返回受上一语句影响的行数)。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft SQL Server 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn rows affected"。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。

4.临时表的使用
a.临时表其实是放在数据库tempdb里的一个用户表,当不再使用时会自动删除。
b.一种是以#(局部)或##(全局)开头的表,这种表在会话期间存,会话结束则自动删除;二者在名称、可见性和可用性上均不相同。本地临时表的名称以单个符号   (#)   打头;它们仅对当前的用户连接是可见的;当用户从   Microsoft&reg;   SQL   Server™   2000   实例断开连接时被删除。全局临时表的名称以数学符号   (##)   打头,创建后对任何用户都是可见的,当所有引用该表的用户从   SQL   Server   断开连接时被删除。
c.另一种,如果创建时不以#或##开头,而用tempdb.TempTable来命名它,则该表可在数据库重启前一直存在.


posted @ 2007-12-25 13:31 W.R 阅读(670) | 评论 (0)编辑 收藏

1.查询从第N条到第M条:
       在MSSQL中  可以用  方式1:
SELECT TOP m-n+1 * FROM TableA 
  
WHERE (id NOT IN 
    (
SELECT TOP n-1 id FROM   TableA)) 
id 为TableA表的关键字
        也可用方式2:在存储过程中新建一张临时表 取查询表的主键做字段
CREATE procedure pagination1
(
@pagesize int,  --页面大小,如每页存储20条记录
@pageindex int   --当前页码
)
as
set nocount on
begin
declare @indextable table(id int identity(1,1),nid int)  --定义表变量
declare @PageLowerBound int  --定义此页的底码
declare @PageUpperBound int  --定义此页的顶码
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) order by fariqi desc
select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid
and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
end
set nocount off


借助临时表来达到你的目的。
个人推荐第1种方式。

另外  not in 与 not exists 在执行效率上是没有本质的区别的。

posted @ 2007-11-23 13:02 W.R 阅读(107) | 评论 (0)编辑 收藏

重要两点:
1.通过装饰模式在DataSource与SessionFactory之间衔接。
2.利用副本给线程绑定数据源。

posted @ 2007-08-21 14:08 W.R 阅读(491) | 评论 (0)编辑 收藏

 

for(Iterator iter = map.entrySet().iterator();iter.hasNext()){
Map.Entry element 
= (Map.Entry) iter.next();
Object strKey 
= element.getKey(); //键值
Object strValue = element.getValue(); //value值
}

HashMap<K,V> map
for(V v:map)
v.

posted @ 2007-08-21 14:05 W.R 阅读(3710) | 评论 (1)编辑 收藏

 

select   *   from  sysproperties g,syscolumns a  where  a.id = g.id  AND  a.colid  =  g.smallid
记住这句话,在MSSQL中查询字段描述的查询语句。

posted @ 2006-12-12 17:11 W.R 阅读(251) | 评论 (0)编辑 收藏

一、C++
         一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。看如下一段Ccode:
void GetMemory2(char **p, int num) 

    
*= (char *)malloc(num); 

void Test(void) 

    char 
*str = NULL; 
    GetMemory(
&str, 100); 
    strcpy(str, 
"hello"); 
    printf(str); 

执行Test后,能够输出hello ;但是确实是内存泄露了,该free一下,另外我想C++中free is better than delete!
         以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
       
char*  p= new char[nSize];
       
if!GetStringFrom( p, nSize ) ){
              MessageBox(“Error”);
              
return;
       }

       …
//using the string pointed by p;
       delete p;
}


         广义的说,内存泄漏不仅仅包含堆内存的泄漏,还包含系统资源的泄漏(resource leak),比如核心态HANDLE,GDI Object,SOCKET, Interface等,从根本上说这些由操作系统分配的对象也消耗内存,如果这些对象发生泄漏最终也会导致内存的泄漏。而且,某些对象消耗的是核心态内存,这些对象严重泄漏时会导致整个操作系统不稳定。所以相比之下,系统资源的泄漏比堆内存的泄漏更为严重。

GDI Object的泄漏是一种常见的资源泄漏:

 

void CMyView::OnPaint( CDC* pDC )
{
       CBitmap bmp;
       CBitmap
* pOldBmp;
       bmp.LoadBitmap(IDB_MYBMP);
       pOldBmp 
= pDC->SelectObject( &bmp );
       …
       
if( Something() ){
              
return;
       }

       pDC
->SelectObject( pOldBmp );
       
return;
}

当函数Something()返回非零的时候,程序在退出前没有把pOldBmp选回pDC中,这会导致pOldBmp指向的HBITMAP对象发生泄漏。这个程序如果长时间的运行,可能会导致整个系统花屏。这种问题在Win9x下比较容易暴露出来,因为Win9x的GDI堆比Win2k或NT的要小很多。
         有一个很简单的办法来检查一个程序是否有内存泄漏.就是是用Windows的任务管理器(Task Manager).  运行程序,然后在任务管理器里面查看 “内存使用”和”虚拟内存大小”两项,当程序请求了它所需要的内存之后,如果虚拟内存还是持续的增长的话,就说明了这个程序有内存泄漏问题. 当然如果内存泄漏的数目非常的小,用这种方法可能要过很长时间才能看的出来.
         已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。

以发生的方式来分类,内存泄漏可以分为4类:

      1.常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。比如例二,如果Something()函数一直返回True,那么pOldBmp指向的HBITMAP对象总是发生泄漏。

      2.偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。比如例二,如果Something()函数只有在特定环境下才返回True,那么pOldBmp指向的HBITMAP对象并不总是发生泄漏。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

      3.一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,但是因为这个类是一个Singleton,所以内存泄漏只会发生一次。另一个例子:

 

char* g_lpszFileName = NULL;
void SetFileName( const char* lpcszFileName )
{
    
if( g_lpszFileName ){
        free( g_lpszFileName );
    }

    g_lpszFileName 
= strdup( lpcszFileName );
}

如果程序在结束的时候没有释放g_lpszFileName指向的字符串,那么,即使多次调用SetFileName(),总会有一块内存,而且仅有一块内存发生泄漏。

      4.隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。举一个例子:

 

class Connection
{
public:
       Connection( SOCKET s);
       
~Connection();
       …
private:
       SOCKET _socket;
       …
}
;
class ConnectionManager
{
public:
       ConnectionManager()
{

       }

       
~ConnectionManager(){
          list
<Connection>::iterator it;
          
for( it = _connlist.begin(); it != _connlist.end(); ++it ){
                     delete (
*it);
              }

              _connlist.clear();
       }

       
void OnClientConnected( SOCKET s ){
         Connection
* p = new Connection(s);
         _connlist.push_back(p);
       }

       
void OnClientDisconnected( Connection* pconn ){
              _connlist.remove( pconn );
              delete pconn;
       }

private:
       list
<Connection*> _connlist;
}
;

 假设在Client从Server端断开后,Server并没有呼叫OnClientDisconnected()函数,那么代表那次连接的Connection对象就不会被及时的删除(在Server程序退出的时候,所有Connection对象会在ConnectionManager的析构函数里被删除)。当不断的有连接建立、断开时隐式内存泄漏就发生了。

二、JAVA中的内存泄露
         JAVA有GC自动回收内存,内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。在C/C++中分配了内存不释放的情况就是内存泄露。虽然Java存在内存泄露,但是基本上不用很关心它,特别是那些对代码本身就不讲究的就更不要去关心这个了。 Java中的内存泄露当然是指:存在无用但是垃圾回收器无法回收的对象。而且即使有内存泄露问题存在,也不一定会表现出来。看下面的例子:

public class Stack {
 
private Object[] elements=new Object[10];
 
private int size = 0
 
public void push(Object e){
  ensureCapacity();
  elements[size
++= e; 
 }

 
public Object pop(){
  
if( size == 0
   
throw new EmptyStackException(); 
   
return elements[--size];
 }

  
private void ensureCapacity(){
   
if(elements.length == size){
    Object[] oldElements 
= elements;
    elements 
= new Object[2 * elements.length+1];
    System.arraycopy(oldElements,
0, elements, 0, size);
   }

  }

}

假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用,无法回收。再看这个例子:
public class Bad{
 public static Stack s
=Stack();
  static{
   s.push(new Object());
   s.pop(); 
//这里有一个对象发生内存泄露
   s.push(new Object()); 
//上面的对象可以被回收了,等于是自愈了
  }
因为是static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如果你的Stack最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很容易理解,Stack内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!for example:
public class NotTooBad{
 public void doSomething(){
  Stack s
=new Stack();
  s.push(new Object());
  
//other code
  s.pop();
//这里同样导致对象无法回收,内存泄露.
 }
//退出方法,s自动无效,s可以被回收,Stack内部的引用自然没了,所以
 
//这里也可以自愈,而且可以说这个方法不存在内存泄露问题,不过是晚一点
 
//交给GC而已,因为它是封闭的,对外不开放,可以说上面的代码99.9999%
 
//情况是不会造成任何影响的,当然你写这样的代码不会有什么坏的影响,但是
 
//绝对可以说是垃圾代码!没有矛盾吧,我在里面加一个空的for循环也不会有
 
//什么太大的影响吧,你会这么做吗?
}
上面两个例子都不过是小打小闹,但是C/C++中的内存泄露就不是Bad了,而是Worst了。他们如果一处没有回收就永远无法回收,频繁的调用这个方法内存不就用光了!因为Java还有自愈功能(我自己起的名字,还没申请专利),所以Java的内存泄露问题几乎可以忽略了,但是知道的人就不要犯了。
  不知者无罪!Java存在内存泄露,但是也不要夸大其辞。如果你对Java都不是很熟,你根本就不用关心这个,我说过你无意中写出内存泄露的例子就像你中一千万一样概率小,开玩笑了,其实应该是小的多的多! 
         在某些时候,因为代码上写的有问题,会导致某些内存想回收都收不回来,比如下面的代码
Temp1 = new BYTE[100];
Temp2 
= new BYTE[100];
Temp2 
= Temp1;
这样,Temp2的内存地址就丢掉了,而且永远都找不回了,这个时候Temp2的内存空间想回收都没有办法.

posted @ 2006-11-22 14:13 W.R| 编辑 收藏

<iframe name="add2" allowtransparency="ture" frameBorder="0" MARGINWIDTH="100%" style="filter:alpha(opacity=0)"; height:expression(1); aho:expression(autoResize()); width:100%;" id="mainFrame" src="" ></iframe>
中style="filter.alpha(opacity=0)"设置透明度。


function mychange()
{
  if (document.add1form.typeid.value!=null && document.add1form.typeid.value!="0") {
    document.all["mainFrame"].style.filter = "";
     document.all["mainFrame"].src="<%=request.getContextPath()%>/single_letterAction.do?actionCode=select&typeid="
           + document.add1form.typeid.value +"&Mlever=<%=Mlever%>&Mname=<%=Mname%>";
   }
}

另外在此记下一句话:
<div style="border:1 outset #ffffff; overflow:auto;width:100%;height:250" id="word" contenteditable></div>

posted @ 2006-11-14 11:26 W.R 阅读(2330) | 评论 (1)编辑 收藏

//本窗口(弹出窗口)关闭,刷新父窗口
<script>window.opener.parent.location.reload();window.close()</script>

//后退一页
<a href="javascript:history.go(-1);">返回前页</a>

//新弹出窗口
<script language=JavaScript>
function newin(url,name,size)
{
 var windowname=window.open(url,name,"left=0,top=0,status=no,scrollbars=no,resizable=no,"+size);
}
</script>
<a href=Javascript:newin('x.htm','Review','width=500,height=400')>查看简介</a>

//页面自动返回
<meta http-equiv="refresh" content="1;url=bigclass.asp">
<p align=center><font color=red>恭喜您!您选择的大类已经被删除!<br>1秒钟后返回上页!</font>

//关闭窗口
<a href="javascript:window.close();">点击这里关闭本窗口</a>

//载入时弹出窗口
<script language="JavaScript">
window.open('http://www.leshanju.6to23.com/','','toolbar,menubar,scrollbars,resizable,status,location,directories,copyhistory

,height=400,width=750');
</script>


//弹出窗口自动关闭
<script language="JavaScript">
  function close() {
  setTimeout("self.close()",10000) //毫秒
  }
</script>

<body onload="close()">

//只弹出一次的窗口
<script>

  function openwin(){
  window.open("page.html","","width=200,height=200")
  }

  function get_cookie(Name) {
  var search = Name + "=" var returnvalue = "";
  if (document.cookie.length > 0) {
  offset = document.cookie.indexOf(search)
  if (offset != -1) {
  offset += search.length
  end = document.cookie.indexOf(";", offset);
  if (end == -1)
  end = document.cookie.length;
  returnvalue=unescape(document.cookie.substring(offset, end))

  }
  }
  return returnvalue;
  }

  function loadpopup(){
  if (get_cookie("popped")=="){
  openwin()
  document.cookie="popped=yes"
  }
  }
</script>

<body onload="loadpopup()">

//控制新开窗口属性
<input type="button" Value="打开新窗口"
ONCLICK="window.open('test.htm', 'Sample',
'toolbar=yes,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,copyhistory=yes,width=300,height=20

0,left=100,top=100')">

//web窗体对话框
<script language=javascript>
function logonApprove()
{
 var

result=window.showModalDialog("ubbfaces.asp",window,"scroll:no;resizable:no;help:no;status:no;dialogWidth:400px;dialogHeight:

250px");
}

posted @ 2006-11-14 11:19 W.R 阅读(386) | 评论 (0)编辑 收藏

 1 import  java.util. * ;
 2
 3 /**
 4  * 演示Vector的使用。包括Vector的创建、向Vector中添加元素、从Vector中删除元素、
 5  * 统计Vector中元素的个数和遍历Vector中的元素。
 6   */

 7
 8
 9 public   class  VectorDemo {
10   public   static   void  main(String[] args) {
11   
12    // Vector的创建
13    // 使用Vector的构造方法进行创建 
14   Vector v  =   new  Vector( 4 );
15   
16    // 向Vector中添加元素
17    // 使用add方法直接添加元素
18   v.add( " Test0 " );
19   v.add( " Test1 " );
20   v.add( " Test0 " );
21   v.add( " Test2 " );
22   v.add( " Test2 " );
23   
24    // 从Vector中删除元素
25   v.remove( " Test0 " );  // 删除指定内容的元素
26   v.remove( 0 );        // 按照索引号删除元素
27   
28    // 获得Vector中已有元素的个数
29    int  size  =  v.size();
30   System.out.println( " size: "  size);
31   
32    // 遍历Vector中的元素
33    for ( int  i  =   0 ;i  <  v.size();i + ) {
34    System.out.println(v.get(i));
35   }

36  }

37 }

38
java.util.vector
ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些;
Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小。
Vector 有三个构造函数,
public Vector(int initialCapacity,int capacityIncrement)
public Vector(int initialCapacity)
public Vector()
  Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。第二个构造函数只创建初始存储容量。第三个构造函数既不指定初始的存储容量也不指定capacityIncrement。
  Vector 类提供的访问方法支持类似数组运算和与Vector 大小相关的运算。类似数组的运算允许向量中增加,删除和插入元素。它们也允许测试矢量的内容和检索指定的元素,与大小相关的运算允许判定字节大小和矢量中元素不数目。
  现针对经常用到的对向量增,删,插功能举例描述:
addElement(Object obj)  
  把组件加到向量尾部,同时大小加1,向量容量比以前大1
insertElementAt(Object obj, int index)  
  把组件加到所定索引处,此后的内容向后移动1 个单位
setElementAt(Object obj, int index)
  把组件加到所定索引处,此处的内容被代替。
  removeElement(Object obj) 把向量中含有本组件内容移走。
  removeAllElements() 把向量中所有组件移走,向量大小为0。
  例如:
 
 1import java.lang.System;
 2import java.util.Vector;
 3import java.util.Emumeration;
 4public class Avector{
 5    public static void main(String args[]){
 6        Vector v=new Vector(); 
 7        v.addElement("one"); 
 8        v.addElement("two");
 9        v.addElement("three"); 
10        v.insertElementAt("zero",0);
11        v.insertElementAt("oop",3);
12        v.setElementAt("three",3);
13        v.setElementAt("four",4);
14        v.removeAllElements();
15    }

16}

Vector中的变化情况:
1. one   2. one   3. one   4. zero   5.zero   6. zero  7. zero     8.

         two         two            one       one          one      one
           three       two       two           two   two
                three      oop           three  three
                     three          three  four
 
  另外,Vector 在参数传递中发挥着举足轻重的作用。
  在Applet 中有一块画布(Canvas) 和一个(Panel), 而Panel 中放着用户要输入的信息,根据这些信息把参数传递到canvas 中,这时在Java 中用一个接口(Interface), 而在接口中需用一个Vector 去传递这些参数。另外,在一个类向另一个类参数传递就可以用这种方法。
  例如:
 
import java.util.Vector
interface codeselect{
           Vector codeselect=new Vector();
             }
显示数学信息
Vector(0)存入学生编号
Vector(1)存入学科
 
  在Panel 中当用户在TextField 和Choice 中选择自己所要求的内容,程序中
  通过事件响应把值传到向量Vector 中。
  假若在Panel 类中:
 1public void codepanel extends Panel{
 2    public void init() 
 3        TextField s=new TextField();
 4        Choice c=new Choice();
 5        c. addItem("语文");
 6        c.addItem("数学");
 7        c.addItem("政治");
 8        add(s);
 9        add (c);
10    }

11 
12    public boolean handleEvent(Event event){
13        if(event.id==Event.ACTION_EVENT){
14          if(event.target.instanceof Textfield)
15          {
16             coderesult.setElementAt(s.getText(),0);
17          }
 else if(event.target intanceof Choice) {
18             coderesult.setElementAt(new Integer(c.getSelectedIndex()),1);
19          }

20        }

21    }

22}

这时,向量中已经存入学生编号和学科索引号(0 为语文,1 为数学,2 为政治)。
  而在Canvas 中得到此值,
public class codecanvas extends Canvas{
    
public void code{
    }

    
public void paint{ 
         String str;
        
int t;
        str
=(String)coderesult.elementAt(0);
        t
=(new Integer(codeselect.elementAt(1).toString())).intValue();
        
if(t==0{
             
//显示语文信息
         }
 else if(t==1){
             
//显示数学信息 
         }

        
else if(t==2{
             
//显示政治信息
         }

    }

}
 

posted @ 2006-11-09 13:18 W.R| 编辑 收藏

如果指定了上载路径,千万得记得检查所指定的路径存在否。

posted @ 2006-11-07 11:30 W.R 阅读(303) | 评论 (1)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3 下一页