• [java]中的可变参数定义和使用

    public class Demo1 {   //此时,数组arr必须是最后一个参数; public static int sum(int... arr) // 此时的参数arr是一个整形的数组 { int temp = 0; for (int i = 0; i < arr.length; i++) { temp += arr[i]; } return temp; } public static void main(String[] args) { System.out.println(sum(1)); System.out.println(sum(1, 2)); System.out.println(sum(1, 2, 3)); System.out.println(sum(1, 2, 3, 4)); int[] arr = { 2, 3, 4 }; System.out.println(sum(arr)); } } 输出结果: 1 3 6 10 9 我们之前也编写过将数组作为参数,或者返回值,这里也回顾一下: 数组作为参数和返回值的方法定义语法: public int [] myArrSort(int [] arr) {   ````` } 调用: int [] arr={1,3,5,2,4}; int [] num=myArrSort(arr); 输出: for(int item : arr) { System.out.println(item); }

    0
    1399
    1008B
    2010-02-08
    6
  • JAVA中的二维数组

    主要内容: 1. 数组的定义 2. 数组的分类[按维数] 3. 数组的用法 4. 数组的常见操作 java中的foreach实现方式 一维数组 1. 定义:省略 2. 用法: 声明并赋值: //方法一:先声明,再赋值 int [] arr=new int[5]; arr[0]=10; arr[4]=100; arr[5]=10;//语法无误,编译时报错:java.lang.ArrayIndexOutOfBoundsException System.out.println(arr[5]);//语法无误,编译时报错:错误同上 //方法二:使用for循环动态赋值 //导入java.util.*;包 Scanner input=new Scanner(System.in); int [] arr=new int[5]; for(int i=0;i<arr.length;i++) { System.out.println("请输入第"+(i+1)+"个值"); arr[i]=input.nextInt(); } //方法三:声明时赋值 int [] arr=new int[]{23,45,56,67}; int [] arr1={23,45,56,67}; int [] arr2= new int[5]{23,45,56,67};//错误,此时不能给确定的长度 输出: int [] arr=new int[]{23,45,56,67}; //方法一:使用for循环输出 for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } //方法二:使用foreach输出:此为JDK5.0 新特性 for(int item : arr) { System.out.println(item); } 常见算法: 1. 求一维数组中的最大[小]值 2. 求一维数组中的总和,平均值 3. 添加,删除,修改,搜索等 具体请参考本人FTP\\5.0S1\\JAVA\\数组完整操作范例。[重复让人如此崩溃!] 二维数组 1. 定义:省略 2. 用法: 声明并赋值: //声明时赋值 int [][]arr={ {1,2,3}, {4,5,6}, {7,8,9} }; 输出: //方法一:使用嵌套for循环输出二维数组 for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } //方法二:使用嵌套foreach输出二维数组 for(int row[] :arr) //此时不难看出,二维数组可以看作是每个元素都是一个一维数组的一维数组 { for(int item: row) { System.out.print(item+ " "); } System.out.println(); } 补充: //动态创建规则二维数组 int R=10;//行 int N=5;//列 int [][]arr=new int ­[N]; //动态创建不规则二维数组 int arr[][]; arr=new int[2][]; arr[0]=new int[10]; arr[1]=new int[5]; 赋值都一样:此处省略! 算法体验:杨辉三角 int i,j; int a[][]=new int[10][10]; //给每行的第一列,及对角线处均赋值为1 for(i=0;i<10;i++) { a[i][0]=1; a[i][i]=1; } //从arr[2][1]=a[1][0]+a[1][1]; //推出:a[i][j]=a[i-1][j-1]+a[i-1][j]; //即元素等于两肩之和 for(i=2;i<10;i++) { for(j=1;j<i;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(i=0;i<10;i++) { for(j=0;j<=i;j++) { System.out.print(a[i][j]+" "); } System.out.println(); }

    5
    6707
    3KB
    2010-02-08
    50
  • [java]读书笔记整理:一切都是对象

    一.用引用操纵对象 每种编程语言都有自己的数据操纵方式。有时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵对象,还是用某种基于特殊语法的间接表示(例如C和C++里的指针)在操纵对象? 所有的这一切在java里都得到了简化。一切被视为对象,因此可采用单一固定的语法。尽管一切都“看作”对象,但操纵的标志符实际上是对象的一个“引用”(reference)。 例如:用遥控器(引用)来操纵电视机(对象)。 分析:1.改变音量,实际操控的是遥控器(引用) 2.四处走动,只要带着遥控器(引用)而不是电视机(对象),仍旧可以操控电视 3.即使没有电视机,遥控依然可以独立存在 也就是说,你拥有一个引用,并不一定需要一个对象与它关联。因此,如果想操纵一个词或句子,则可以创建一个String引用: String s; 但这里创建的只是引用,并不是对象。如果此时向s发送一个消息,就会返回一个运行时错误。这是因为此时s实际上没有与任何事物关联(即,没有电视机)。因此,一种安全的做法是:创建一个引用的同时便进行初始化。 String s=”hello”; 但这里用到了java语言的一个特性:字符串可以用带引号的文本初始化。通常,必须对对象采用一种更通用的初始化方法。 一旦创建了一个引用,就希望它能与一个新的对象关联。通常用new关键字来实现这一目的的。new关键字的意思是“给我一个对象”,所以前一例子可以写成: String s=new String(“hello”); 它不仅表示“给我一个新的字符串”,而且通过提供一个初始字符串,给出了怎样产生这个String的信息。 当然,String类型并非是唯一存在的类型,java提供了数量众多的现成类型。重要的是,你不能盲目的创建类型。 二.存储到什么地方 程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?对这些方面的了解会对你有很大的帮助。有六个不同的地方可以存储数据。 1) 寄存器 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量及其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到计算机存在的任何迹象。 2) 堆栈 位于通用RAM(随机访问存储器)中,但通过“堆栈指针”可以从处理器那里获得直接 支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,java编译器必须知道存储在堆栈内所有数据的确切大小和声明周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些java数据存储于堆栈中——特别是对象引用,但是java对象并不存储其中。 3) 堆 一种通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要创建一个对象时,只需用new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代价。用堆进行存储分配比用堆栈进行存储分配需要更多的时间(如果确实可以在java中向在C++中一样在栈中创建对象)。 4) 静态存储 这里的“静态”是指“在固定的位置”(尽管也在RAM里)。静态存储里存放程序运行时一直存在的数据。可用关键字static来标识某个对象的特定元素是静态的,但java对象本身从来不会存放在静态存储空间里。 5) 常量存储 常量值通常直接存储在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情况下,可以选择将其存放在ROM(只读存储器)中。 6) 非RAM存储 如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。器中两个基本的例子是“流对象”和“持久化对象”。在“流对象”中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此,即使程序终止,它们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的,基于RAM的对象。Java 提供对“轻量级持久化”的支持,未来的java版本可能会为持久化提供更全面的解决方案。 三.永远不需要销毁对象 在大多数程序设计语言中,变量声明周期的概念,占据了程序设计工作中非常重要的部分。变量需要存活多长时间?如果想要销毁对象,那么什么时刻进行呢?变量生命周期的混乱往往会导致大量的程序Bug,接下来将介绍java是怎样替我们完成所有的清理工作,从而大大地简化这个问题的。 作用域 大多数过程型语言都有作用域(Scope)的概念。作用域决定了在其内定义的变量名的可见性和生命周期。在C,C++和java中,作用域由花括号的位置决定。例如: { int x=12; //只有x 可用 { int y=100; //x,y 都可用 } //只有x 可用 //y 超出了作用域 } 在作用域里定义的变量只可用于作用域结束之前。 任何位于“//”之后到行末的文字都是注释。 缩排格式使java代码易于阅读。由于java是一种自由格式(free-form)的语言,所以,空格,制表符,换行都不会影响程序的执行结果。 注意,尽管一下代码在C和C++中是合法的,但是在java中却不能这样书写: { int x=12; { int x=100; } } 编译器将会报告变量x已经定义过。所以,在C和C++里将一个较大作用域的变量“隐藏”起来的做法,在java里是不允许的。因为java设计者认为这样做会导致程序混乱。 对象的作用域 Java对象不具备和基本类型一样的生命周期。当用new创建一个java对象时,它可以存活于作用域之外。所以假如你采用代码: { String s=new String(”this is a string”) ; } 引用s在作用域终点就消失了。然而,s指向的String对象仍然继续占据内存空间。在这一小段代码中,我们似乎无法再访问这个对象,因为对它唯一的引用已超过了作用域的范围。[后续在说,在程序执行过程中,怎样传递和赋值对象引用]。 事实证明,由new创建的对象,只要你需要,就会一直保留下去。这样。许多C++编程问题在java中就完全消失了,在C++中,最难的问题似乎在于:程序员并不能从语言本身获得任何帮助,以确保在需要调用对象时,该对象仍然可用。更重要的是:在C++中,一旦使用完对象后,必须确保要销毁对象。 这样便代码一个有趣的问题。如果java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C++里可能发生的问题。这也是java神奇之处所在。Java有个“垃圾回收器”,用来监视用new创建的所有对象,并辨别哪些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不必担心内存回收的问题。你只需要创建对象,一旦不再需要,他们就会自行消失。这样做就消除了这类编程问题(即“内存泄漏”),这是由于程序员忘记是放内存而产生的问题。

    0
    193
    6KB
    2010-02-08
    19
  • 如何将窗体连接网页源代码

    (1) 这个控件叫INET控件 INET控件的几点使用 Inet控件支持HTTP与FTP两种通讯协议。利用这个控件可以完成许多功能。 我们通过例子来看看。 环境VB6+WINXP 打开VB6,新建工程 添加部件Microsoft Internet Transfer Controls. 在form中添加2个按钮,2个文本框和Inet控件 代码如下: Option Explicit ''这段代码使用了GetHeader来返回页面信息,比较准确一些 ''可以得到文件最后修改日期,文件大小等等 ''用这个办法还可以判断一个文件是否存在 Private Sub Command1_Click() Dim a As String Dim str As String Dim RetCode As Long Inet1.OpenURL "http://localhost/xml/tt.htm" If Inet1.StillExecuting Then DoEvents End If ''可以看到所有的项目 MsgBox Inet1.GetHeader ''得到修改日期时间是格林时间,将它转换北京时间 str = Inet1.GetHeader("Last-modified") str = Replace(Right(str, Len(str) - InStr(1, str, ",") - 1), "GMT", "") Text1.Text = CDate(Format(str, "yyyy/mm/dd hh:mm:ss")) MsgBox Inet1.GetHeader("content-length") RetCode = Val(Mid(Trim(Inet1.GetHeader), 10, 3)) Select Case RetCode Case 200 MsgBox "成功" Case 404 MsgBox "没有发现" Case Else MsgBox "Error" End Select End Sub ''这段代码简单的判断了是否与internet连接 ''如果连接,得到网页源码并且保存 Private Sub Command2_Click() Inet1.Cancel If Len(Inet1.OpenURL("http://localhost/xml\tt.htm")) <> 0 Then MsgBox "已经连接" Text2.Text = Inet1.OpenURL("http://localhost/xml\tt.htm") If Inet1.StillExecuting Then DoEvents End If ''保存到文件 Open App.Path & "\index.htm" For Output As #1 Print #1, Text2.Text Close #1 Else MsgBox "没有连接" End If End Sub. (2) '我最喜欢用这种方法 Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub Command1_Click() Dim WEBADDR As String WEBADDR = "http://www.baidu.com/" Call ShellExecute(hwnd, "Open", WEBADDR, "", App.Path, 3) End Sub '另两种方法 Private Sub Command1_Click() aa = "Explorer http://www.baidu.com/" Shell aa, vbNormalFocus End Sub '******************************* Private Sub Command1_Click() WebBrowser1.Navigate ("http://www.baidu.com/") End Sub

    0
    140
    2KB
    2009-12-25
    16
  • Java初学者都必须理解的六大问题

      对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。   问题一:我声明了什么!   String s = "Hello world!";   许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。   这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:   String string = s;   我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。    问题二:"=="和equals方法究竟有什么区别?   ==操作符专门用来比较变量的值是否相等。比较好理解的一点是:   int a=10;   int b=10;   则a==b将是true。   但不好理解的地方是:   String a=new String("foo");   String b=new String("foo");   则a==b将返回false。   根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。   对象内容的比较,正是equals方法做的事。   看一下Object对象的equals方法是如何实现的:   boolean equals(Object o){   return this==o;   }   Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。   看一下一个极端的类:   Class Monster{   private String content;   ...   boolean equals(Object another){ return true;}   }   我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。   所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。      问题三:String到底变了没有?   没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:   String s = "Hello";   s = s + " world!";   s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。   通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。   同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:   public class Demo {   private String s;   ...   public Demo {   s = "Initial Value";   }   ...   }   而非   s = new String("Initial Value");   后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。   上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。   至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。

    4
    99
    5KB
    2009-12-25
    9
上传资源赚积分or赚钱