作者: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>>>操作的文件不存在,会自动创建。如果存则不会覆盖。
写代码:
123456RandomAccessFile raf =
new
RandomAccessFile(
"ran.txt"
,
"rw"
);
//读写模式raf.write(
"李四"
.getBytes());
raf.writeInt(
97
);
//write只写数的低8位,当大于255时,数据丢失
raf.write(
"王五"
.getBytes());
raf.writeInt(
99
);
raf.close();
注:它可以实现数据的分段写入,可以用不同线程同时写入不同段!他们直接不会互相冲突--------下载软件的原理
123456789public
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*倍数)
1234567891011RandomAccessFile 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接口的中的方法)
------(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]
//
|
12345678910/*把数组变成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,
12345678910111213//如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
//如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
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]
12345678910111213141516171819
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));