集合变数组---------集合变数组

作者:ljs

创作时间:2014-03-06 17:18

说明:以后有时间详细写作

遗留问题:

1,返回的列表可序列化的,并且实现了 RandomAccess??这句话怎么理解

=======================================================================

时间:2014-03-09

现在我们来看看什么叫RandomAccess?这个东西的作用?

public interface RandomAccess
 

List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

将操作随机访问列表的最佳算法(如 ArrayList)应用到连续访问列表(如 LinkedList)时,可产生二次项的行为。如果将某个算法应用到连续访问列表,那么在应用可能提供较差性能的算法前,鼓励使用一般的列表算法检查给定列表是否为此接口的一个 instanceof,如果需要保证可接受的性能,还可以更改其行为。

现在已经认识到,随机和连续访问之间的区别通常是模糊的。例如,如果列表很大时,某些 List 实现提供渐进的线性访问时间,但实际上是固定的访问时间。这样的 List 实现通常应该实现此接口。实际经验证明,如果是下列情况,则 List 实现应该实现此接口,即对于典型的类实例而言,此循环:

     for (int i=0, n=list.size(); i < n; i++)
         list.get(i);
 
的运行速度要快于以下循环:
     for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();

3,RandomAccessFile------------直接父类为Object

----随机访问文件,自身具备读写的方法
----通过skipBytes(int  x),seek(int  x)来达到随机访问
该类不是算是IO体系中子类。 而是直接继承自Object。
但是它是IO包中成员。因为它具备读和写功能。
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置, 同时可以通过seek改变指针的位置。 
完成读写的原理:------------就是内部封装了字节输入流和输出流。

RandomAccessFile(File file, String mode) ;
RandomAccessFile(String name, String mode)
通过构造函数可以看出,该类只能操作文件。
而且操作文件还有模式:只读r,,读写rw等。
模式----- r>>>不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。
模式-----rw>>>操作的文件不存在,会自动创建。如果存则不会覆盖

写代码:
1
2
3
4
5
6
RandomAccessFile raf =  new  RandomAccessFile( "ran.txt" , "rw" ); //读写模式
raf.write( "李四" .getBytes());
raf.writeInt( 97 ); //write只写数的低8位,当大于255时,数据丢失
raf.write( "王五" .getBytes());
raf.writeInt( 99 );
raf.close();
1
2
3
4
5
6
7
8
9
public  static  void  writeFile_2() throws  IOException {
     RandomAccessFile raf =  new  RandomAccessFile( "ran.txt" , "rw" );
     raf. seek ( 8 * 0 ); //能够实现分段写入
     raf.write( "周期" .getBytes());
     raf.writeInt( 103 );
 
     raf.close();
}
注:它可以实现数据的分段写入,可以用不同线程同时写入不同段!他们直接不会互相冲突--------下载软件的原理
第一个线程0----10
第二个线程11----23
第三个线程24-----45........
其他流多线程就会造成数据虽然写入,但是不是连续的,解码出现错误
读代码:
skipBytes(int  x);//只能往前跳
seek(int  x);调整对象中指针
seek(8*倍数);//数据分段,因此希望数据有规律
//遇到假如name太长的情况就统一让nam按16个字节存!!年龄按4个字节seek(20*倍数)
1
2
3
4
5
6
7
8
9
10
11
RandomAccessFile raf =  new  RandomAccessFile( "ran.txt" , "r" );
//调整对象中指针。
//raf.seek(8*1);
//跳过指定的字节数
raf.skipBytes( 8 );
byte [] buf =  new  byte [ 4 ];
raf.read(buf);
String name =  new  String(buf);
int  age = raf.readInt();
System.out.println( "name=" +name);
System.out.println( "age=" +age);


==================================================================================================================

<1>Object[ ] toArray()---------返回包含此 collection 中所有元素的数组(Collection接口的中的方法)



<2>static  List   asList(T... a) ----返回一个受指定数组支持的固定大小的列表。
------(Arrays工具类中的方法),返回的列表可序列化的,并且实现了 RandomAccess
注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定。
  contains get indexOf()subList();这些可以
如果你增删。那么会反生UnsupportedOperationException
1
2
3
4
5
6
7
list.add( "1234" );
list.add( "12345" );
list.add( "12346" );
Object[] arr = list.toArray();
for (Object arr:arrs){
       System.out.println(arr+ "-----" );
}
1
2
3
4
5
String[]arrString = { "abc" , "abcd" , "abb" };
List st = Arrays.asList(arrString);
System.out.println(st);
//结果:[abc, abcd, abb]
//
1
2
3
4
5
6
7
8
9
10
/*把数组变成list集合有什么好处?
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定。
  contains get indexOf()subList();这些可以
如果你增删。那么会反生UnsupportedOperationException,
*/
String[] arr = { "abc" , "cc" , "kkkk" };
List<String> list = Arrays.asList(arr);
sop( "contains:" +list.contains( "cc" ));
list.add( "qq" ); //发生UnsupportedOperationException,
1
2
3
4
5
6
7
8
9
10
11
12
13
//如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
//如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
String[] arr1 = { "abc" , "abd" , "cca" , "kkk" };
int[] arr2 = {2,3,5,7};
Integer[] arr3 = {2,3,5,7};
 
List<String> list1 = Arrays.asList(arr1); //
List<int[]> list2 = Arrays.asList(arr2); //注意加泛型的类型:
List<Integer> list3 = Arrays.asList(arr3); //泛型类型
         
sop(list1); //结果:[abc, abd, cca, kkk]
sop(list2); //结果:[[I@1c80b01],将整个数组作为一个元素存在
sop(list3); //结果:[2, 3, 5, 7]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ArrayList<String> al = new ArrayList<String>();
al.add( "abc1" );
al.add( "abc2" );
al.add( "abc3" );
 
/*
1,指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。
所以创建一个刚刚好的数组最优。
2,为什么要将集合变数组?
为了限定对元素的操作。不需要进行增删了。
*/
 
//String[] arr = al.toArray( new  String[0]); //0<3,结果:[abc1, abc2, abc3]
String[] arr = al.toArray( new  String[5)]); //5>3,结果:[abc1, abc2, abc3, null, null]
String[] arr = al.toArray(new String[al.size()]);
System.out.println(Arrays.toString(arr));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值