坐在自习室的一角,寻找一点程序员的感觉。可恶的C#实验,折磨人啊……….
[java]Vector、ArrayList、List使用深入剖析
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
由Collection接口派生的两个接口是List和Set。
List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Set接口
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
Map接口 HashMap类 WeakHashMap类 总结 同步性
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:
Hashtable numbers = new Hashtable();
numbers.put(“one”, new Integer(1));
numbers.put(“two”, new Integer(2));
numbers.put(“three”, new Integer(3));
要取出一个数,比如2,用相应的key:
Integer n = (Integer)numbers.get(“two”);
System.out.println(“two = ” + n);
由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。
Hashtable是同步的。
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
最近看到一个不错的软件 Resource Hacker
图标,位图,指针,菜单,对话,字符串表,消息表,加速器,Borland 窗体和版本信息资源都可以被完整地反编译为他们各自的格式,不论是作为图像或 .rc 文本文件。
图像资源 (图标,指针和位图) 可以被相应的图像文件 (.ico, .cur, .bmp),.res 文件,甚至另一个 .exe 文件所替换。
对话,菜单,字符串表,加速器和消息表资源脚本 (以及 Borland 窗体) 可以通过使用内部资源脚本编辑器被编辑和重新编译。
资源也可以被一个 .res 文件所替换,只要替换的资源与它是同一类型并且有相同的名称。
允许一个程序支持多种语言,或者添加一个自定义图标或位图 (公司的标识等) 到程序的对话中。
返厂归来的SZ电脑测试
我的电脑回来了,hohohoho
努力了几个小时,终于成功了,6600蓝牙共享上网
很多朋友,一看到题目,可能会窃笑,有电脑不用,干嘛用手机来上网啊。而且手机通过电脑共享宽带上网,电脑不能关机,不能超出10米范围,有什么意思啊~~
这里就为自己写这篇教程的出发点,作一个说明。
有很多朋友都是几个人用一台电脑的,比如大学里面同宿舍啊,比如两个小情人啊,比如夫妻啊,限于种种原因,没有第二台电脑,所以有时候,就会为争鼠标,而有些小小摩擦,产生种种不愉快……
现在为你们排忧解难来了。电脑设置共享宽带,用6600通过蓝牙上网,实现10米范围内免费无线上网的梦想,弟兄们,姐妹们,行动起来吧,想想看,捧着手机在沙发上浏览网页,在阳台进聊天室聊天,在床上看儿童不宜的内容,多爽啊~~~
“序”就写到这里,言归正传:
工具准备:
1、6600一枚;
2、蓝牙适配器一条;
3、电脑一台;
4、ADSL宽带一根(本教程仅针对ADSL宽带);
5、手机端软件:gnubox6600.SIS、Opera;
6、电脑端软件:CCProxy(代理软件)。
测试环境:
1、6600(V5.27);
2、Windows2003 STD EN;
电脑端:(用语可能与你机子上不同,因为我用英文版,自己临时翻译过来的)
1、先不要插上蓝牙,将下载的Widcomm Driver Ver.4.0.1.700驱动程序和破解程序解压,是一个文件夹,找到SETUP.EXE运行,安装过程特别注意以下两点
(1)不要修改安装路径
(2)提示“没有通过Windows测试”时选“仍然继续”
(3)提示“没有找到Bluetooth时”,选“取消”,这样可以在不插上蓝牙时也完成驱动的安装,(这里如果你插上蓝牙,后面会有麻烦的)
2、安装完成后系统会要求重新启动,重新启动时按F8键进入xp安全模式,运行破解程序WidComm.4.0.1.700patched.exe
3、破解安装后请重新启动系统到正常模式,这时插上你的蓝牙,稍候,系统会提示“发现新硬件”并自动安装好相应的驱动。
4、 装好了驱动,我们要运行一下“初始Bluetooth配置向导”配置环境,在右下的任务栏双击蓝牙的图标即可(像双鱼那个)
(1)计算机名可以随便,简单点好,将来手机上就会显示此名称
(2)安装本计算机为其它蓝牙提供的服务时可以都选上,其实大多数我没用上,注意不要少了“Bluetooth串行端口”
(3)在“另一设备”那一页选“跳过”(你还有其它蓝牙设置吗?)
(4)安装完成后,右击右下角的蓝牙图标(双鱼),选择“高级配置”,找到“本地服务”中的COM端口号,不同机器端口号不同,我的是com6(这一步迷惑了我好长时间,因为其它的地方还有com端口,网上大多讲的是com3 和com4,手机与PC连接时也会出现一些com口连接的提示,都不用管,就是这里的,记住是“本地服务”中的) ,这一端口号后面还要使用几次。
PC端安装虚拟的调制解调器
1、打开“控制面板”里找到“电话和调制解调器”,如果需要设置一下“拨号规则”输入区号什么的,随意输入数字。
2、在调制解调器栏点击“添加”出现“添加硬件向导”时选勾上“不要检测我的调制解调器,我将从列表汇中选择”下一步
3、 选择“标准调制解调器”的“两台计算机间的通讯电缆”下一步
4、出现端口选择,一定要选前面要你记住的那个“本地服务”下的com口, 完成调制解调器的设置。
PC端添加新连接
1、进入控制面板的“网络连接”打开“新建连接",下一步
2、“设置高级连接”,下一步
3、“接受传入的连接”,下一步
4、出现刚才设置的“两台计算机间的通讯电缆(COM3)”勾上,下一步
5、“不允许虚拟专用连接”,下一步
6、不选择任何用户(选择也无所谓),下一步
7、出现“Internet协议(TCP/IP)”点击属性,将“允许呼叫的计算机指定其IP地址”打上钩,完成了,点完成后出现“传入的连接”图标,右击看属性,选“用户”选项卡,找到下言的“总是允许象掌上电脑这样的直接连接的设备不需要提供密码来连接”将其勾上,“确定”即可
———————————-(另一种设置方法)——————————————-
1、在宽带联接上点右键,选属性-高级-允许其他网络用户使用本机的网络联接,确定后电脑会问你是否使用192.168.0.1的ip,都同意;
2、控制面板-电话和调解器设置-在拨号规则里新建一个默认联接-在调解器里添加“两台电脑的直联电缆”(如果你不知道蓝牙的传入端口的话,就选中所有端口吧)
3、新建联接-设置高级连接-同意传入连接-选中所有端口(如果你不知道蓝牙的传入端口的话)-下一步-不允许虚拟连接……
4、到这里,你的网络连接里面,就有了一个共享的宽带连接和一个传入连接。在传入连接上点右键,选属性,选“用户”,选中“Administrator”,也可以是其他用户,下面构选允许直接连接设备,在“网络”里,选中TCP/IP,选属性,两个单选框都要打勾,复选框那里选第二个,From 192.168.0.1 To 192.168.0.254,然后确定;
5、安装代理软件CCProxy,安装之后,设置一下,如图。一定要填写电脑ip!!!然后开着代理软件,不要关。
手机端:
1、设置手机的接入点,新建一个,取名“Bt”。注意大小写,非常重要!
数据承载方式:数据通话
拨号号码:0000
用户名/密码:输入你在电脑设置用户的时候,选择的那个用户的密码。我使用Administrator。
提示输入密码:否
鉴定:普通
其他的默认
然后点选项-高级设置:
进入高级设置
手机IP地址:192.168.0.3(必须是空闲的)
主域名服务器:当地的DNS服务器(不懂的话找一台拨号上ADSL的电脑,在cmd中输入ipconfig /all可以查看)
次域名服务器:各地的次DNS服务器
使用PPP压缩:是
使用登入脚本:是
登入脚本:
CHARMAP [windows-1252]
LOOP 10
{
SEND "CLIENT"+<0x0d>
WAIT 3
{
"SERVER" OK
}
}
EXIT KErrNoAnswer$
OK:
EXIT
登录脚本不能错,注意大小写,注意换行。为避免输错,请使用6600的复制粘贴功能!
填入代理服务器,192.168.0.1,端口是808。
点确定保存了,退出来。
2、安装gnubox6600.SIS。
选项->2Box Direct->Bluetooth,然后选你的蓝牙名称,如图。
(注意你要看到Default TelNum:必须是空白的,如果出现0000,请在Gunbox里选择另外的选项,再选择回来,多试几次,就会空白的)
成功后,不要关闭,开着它,按挂机键最小化。
3、打开opera,设置代理服务器,192.168.0.1,端口是808,接入点选Bt,然后试试上一个网址,呵呵,真正的WWW网址!
这时候,6600会首先联上电脑,成功的话,你会看到网络连接里,传入连接成功连接上了,如图。稍后,代理软件CCProxy的图标会活动起来,接着,网页就打开了,如图,爽吧,嘿嘿~~~
4、查看手机,没有显示G的标志,表示并不是GPRs上网的,呵呵,再查看GPRS流量,如果你不放心的话。
本教程提到的部分软件下载:
1、gnubox6600.SIShttp://club.joyes.com/images/upload2/2005/03/31/224543.rar
2、
CCProxy6.2http://download.winzheng.com/SoftDown.asp?ID=21353&lbID=1
CCPrroxy6.2注册器http://www.sedown.com/phome?phome=DownSoft&softid=19876&pathid=0&pass=2dbc278bd2fe59a9976e93116b70fa3d&p=:::
3、Opera 6.2 破解版http://club.joyes.com/Announce/Announce.asp?BoardID=115&ID=2380443
..............................
帮朋友做的台式机配置单Part_1
这套配置主要是以AMD Athlon64 X2双核处理器为核心,面向初步的CAD设计和日常多媒体应用而作,价格4000-5000RMB
配件 | 名称 | 现在价格 | 数量 |
CPU | AMD Athlon64 X2 3600+ AM2(盒) | ¥720 | 1 |
主板 | 微星 K9N Neo-F | ¥680 | 1 |
内存 | 威刚VDATA 512MB DDRII667(万紫千红) | ¥280 | 2 |
硬盘 | WD 鱼子酱JD 80G 7200转 8M(串口) | ¥360 | 1 |
显卡 | 小影霸 7300GT-GT3 | ¥499 | 1 |
光驱 | 三星 金将军16XDVD 黑金版 | ¥160 | 1 |
液晶显示器 | LG L1719S | ¥1,400 | 1 |
机箱 | 金河田 飓风II 8197 | ¥210 | 1 |
键鼠套装 | 大白鲨 SK-747 | ¥45 | 1 |
音箱 | 漫步者 R201T04 | ¥130 | 1 |
总价: 4764 元 | |||
配件 | 名称 | 现在价格 | 数量 |
CPU | AMD Athlon64 X2 3600+ AM2(盒) | ¥720 | 1 |
主板 | 华硕 M2V | ¥580 | 1 |
内存 | 宇瞻 512MB DDRII667(金牌超频) | ¥275 | 1 |
硬盘 | 三星 160GB 7200转 8M 串口(SP1604C) | ¥455 | 1 |
显卡 | 七彩虹 天行7300GT-GD3 CF白金版 256M V1 | ¥599 | 1 |
光驱 | 明基 DD165N | ¥160 | 1 |
液晶显示器 | LG L1719S | ¥1,400 | 1 |
机箱 | 金河田 飓风系列8185B/S | ¥220 | 1 |
键鼠套装 | 多彩 防水高手K8020P+M338BP | ¥75 | 1 |
音箱 | 麦博 M-111 | ¥99 | 1 |
总价: 4583 元 |
帮朋友做的台式机配置单Part_2
配件 | 名称 | 现在价格 | 数量 | |||
CPU | AMD Athlon64 X2 3800+ AM2(散) | ¥720 | 1 | |||
主板 | 捷波 悍马HA01GT | ¥599 | 1 | |||
内存 | 威刚VDATA 1GB DDRII667(万紫千红) | ¥550 | 1 | |||
硬盘 | WD 鱼子酱JD 80G 7200转 8M(串口) | ¥360 | 1 | |||
显卡 | Inno3D 7600GST游戏王子 | ¥599 | 1 | |||
液晶显示器 | 三星 711N(黑色) | ¥1,470 | 1 | |||
机箱 | 富士康 TSAA+861 | ¥160 | 1 | |||
电源 | 航嘉 冷静王钻石版2.2 | ¥238 | 1 | |||
键鼠套装 | 金河田 深度打击 | ¥98 | 1 | |||
总价: 4794 元 | ||||||
配件 | 名称 | 现在价格 | 数量 | |||
CPU | AMD Athlon64 X2 3600+ AM2(盒) | ¥720 | 1 | |||
主板 | 华擎 AM2NF6G-VSTA | ¥475 | 1 | |||
内存 | 威刚VDATA 1GB DDRII667(万紫千红) | ¥550 | 1 | |||
硬盘 | WD 鱼子酱 1600JS 7200转 8M(串口) | ¥463 | 1 | |||
光驱 | 先锋 DVD-127 | ¥165 | 1 | |||
液晶显示器 | AOC 177Si | ¥1,390 | 1 | |||
机箱 | 富士康 飞狐140 | ¥120 | 1 | |||
电源 | 九州风神 SUV-400 | ¥180 | 1 | |||
键鼠套装 | 双飞燕 KBS-7620 | 缺货 | 1 | |||
总价: 4133 元 | ||||||
配件名 | 品牌型号 | 单价 | 数量 | |||
CPU | AMD AM2 Athlon 64 X2 3800+ / 3600+ | 880 / 725 | 1 | |||
主板 | 捷波 悍马HA01 GT | 599 | 1 | |||
内存 | 金士顿 DDRII667 512M | 310 | 1 | |||
硬盘 | 希捷 酷鱼7200.9/ST3160811AS(伟仕三年) | 485 | 1 | |||
显卡 | 影驰 GeForce 7300GT悟静版 256M 2.5ns | 499 | 1 | |||
CD/DVD光驱 | 飞利浦 SPD2201BD(黑) | 175 | 1 | 可换用其它品牌 | ||
液晶显示器 | 明基 FP71G+ | 1499 | 1 | 价格还可再降 | ||
机箱 | 金河田 飓风8197 | 288 | 1 | 价格还可再降 | ||
键鼠套装 | 微软 光学精巧套装500(黑) | 199 | 1 | 价格还可再降 | 可换用其它品牌 | |
价格总计:4934.0/4779.0 |
考前如何集中突破传统阅读难关
第一天做题(一定要按时间,把开始和结束的时间标在题目前),做完后然后把错题标出来,写上错误原因和错题类型
第二天,开始分析每个选项的错误原因,这其中就要分析词汇,语法,句型等,很费事但很值得
第三天,开始分析文章中所有长难句和难点,(甚至可以翻译全文,尤其是那种你第一遍读完根本不知所云的文章),把每一段的中文梗概写在段前,把握整篇文章的结构,把握作者为什么这样谋篇布局。
第四天,将前几天的内容反嚼,总结,加深记忆.
其实四天基本上就够了,根据个人程度不同,说一个星期是一个概数.
这样的方法用在突击很好,这样搞上3,4套题,传统阅读将没什么大问题.注意:分析的越透彻效果越好!