JAVA对象实例,集合,I/O流
Box mybox = new Box();
1.Box mybox;//声明mybox,把它作为对Box类型的对象引用,执行后mybox的值为Null,
表示没有引用对象
2.mybox = new Box();//Box是被实例化的类的名字,后面的括号指定了构造函数。
集合:
1.为什么需要集合
JAVA中需要处理对象,为了方便处理多个对象,我们需要把多个对象用容器存储起来
2.集合和数组的区别
(1)长度区别:数组长度固定
集合长度可变
(2)内容不容:数组存储的是同一种类型的元素
集合可以存储不同类型的元素
(3)元素数据类型:数组可以存储基本数据类型和引用类型
集合只能存引用类型(若存储的是Int.会自动装箱成Integer)
3.List集合:有序,可重复
ArrayList:是一个数组队列,相当于动态数组,与数组相比,容量能动态增长。
继承了AbstractList,实现了List,RandomAccess,Cloneable,java.io.Serializable这些接口
ArrayList继承了AbstractList,提供相关的添加,删除,修改
继承了RandmoAccess接口,提供了随机访问功能
继承了Cloneable接口,覆盖函数clone(),能被克隆
实现java.io.Serializable接口,支持序列化
不是线程安全,当由于增加数据导致容量不足时,容量会添加上一次容量大小的一半
默认构造器构造ArrayList的时候,默认容量大小是10.
序列化写入到输出流时,先写入容量,再依次写入每一个元素,
当读出输入流时,先读取容量,再依次读取每一个元素。
ArrayList的三种遍历:
1.迭代器,Iterator(最慢)
Integer value = null;
Iterator iter = list.iterator();
while(iter.hasNext()){
value=(Integer)iter.next();
}
2.随机访问,通过索引值去遍历(最快)
Integer value = null;
int size = list.size();
for(int i=0; i<size; i++){
value = (Integer)list.get(i);
}
3.for循环遍历
Integer value = null;
for(Integer integ:list){
value = integ;
}
LinkedList
Vector
Arrays.asList()方法
- (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用
- (2) 当使用asList()方法时,数组就和列表链接在一起了.
-
当更新其中之一时,另一个将自动获得更新。
-
注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性
- (3) asList得到的数组是的没有add和remove方法的
- 阅读相关:通过查看Arrays类的源码可以知道,asList返回的List是Array中的实现的
- 内部类,而该类并没有定义add和remove方法.另外,为什么修改其中一个,另一个也自动
- 获得更新了,因为asList获得List实际引用的就是数组
List.toArray():将集合转换为数组,返回值是一个Object的数组,Oject[]
,因为是Object类型,所以这个数组是不可以进行强制数据转换的
List.toArray(T[] t)方法返回一个类T的数组,这个数组包含了类T中的所有元素
4.Set集合:无序,不可重复
流流流流流流流流流流流流流流流流流流流流流流流流流
I/O流!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1.什么是流?流是什么?
JAVA程序中,设备,文件对于数据的输入/输出操作都是以“流”的方式进行
读入数据:输入流,读出:输出流
所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,
字符只有在内存中才会形成。
字节流在操作时不会用到内存,字符流则会用到内存。
即在操作时,字节流和字符流的操作完成之后都不关闭输出流,
字节流的操作文件中存在输出的内容,而字符流操作的文件,为空白,输出的内容还在内存中
2.JAVA的字节流
InputStream是所有字节输入流的祖先
OutputStream是所有字节输出流的祖先
3.JAVA的字符流
Reader是所有读取字符串输入流的祖先
Writer是所有输出字符串的祖先
都是抽象类,不能直接new
字节流转换为字符流时,实际上是Byte[]转换为String
4.字节流与字符流的区别
(1)字节流的操作的基本单位为字节;
字符流操作的基本单位为Unicode码元
(2)字节流默认不使用缓冲区
字符流使用缓冲区
(3)字节流在读取时,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节时,
先去查指定的编码表,将查到字符返回
(4)字节流可以处理所有类型数据,而字符流只能处理字符
5. Reader-BufferedReader,InputStreamReader-FileReader
Writer-BufferWriter,OutputStreamWriter-FileWriter
InputStream-FileInputStream,FilterInputStream-BufferedInputStream
OutputStream-FileOutputStream,FilterOutputStream-BufferedOutputStream
- I/O流可以分为节点流和处理流两大类(是否直接与特定的地方(如磁盘,内存,设备等)相连)
节点流:可以从一个特定的地方读写数据
处理流:对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
如BufferedReader
处理流的构造方法总是要带一个其他的流对象做参数,
7.缓冲流(处理流的一种)
计算机访问外部设备或文件,比直接访问内存慢的多。如果我们每次调用read()方法或
writer()方法访问外部设备,CPU需要花许多时间在等外部设备响应,而不是数据处理。
因此开辟一个内存缓冲区的内存区域,程序每次调用read和writer都是在这个缓冲区,
缓冲区满了以后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU。
拥有缓冲区的流称为缓冲流,BufferedInputStream,BufferedOutputStream
BufferedReader,BufferedWriter
为了提高效率,可以用BufferedReader来很配合其他字节流,BufferedReader带有缓冲切,
可以先把一批数据读入到缓冲区内。
BufferedReader:
BufferedReader(Reader in ):创建一个使用默认大小输出缓冲区的缓冲字符输入流对象
BufferedReader(Reader out,int sz):创建一个使用指定个大小输出缓冲区的缓冲字符输入流对象
readLine():读取一个文本行
BufferedWriter:
BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的缓冲字符输出流对象
BufferedWriter(Writer out, int sz):创建一个使用指定大小输出缓冲区的缓冲字符输出流对象
newLine():换行
BufferedInputStream和BufferedOutputStream
验证缓冲流一BufferedReader:
File file = new File("D:\\yin.text")
Reader read = new FileReader(file);
BufferedReader bin = new BufferedReader(read);
str = bin.readLine();
bin.close();
read.close();
验证缓冲流二BufferedWriter:
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
for(int i = 0; i < str.length; i++){
bw.writer(str[i])
bw.newLine();
}
bw.close();
fw.close();
8.转换流:
对读取到的字节数据进行指定编码的编码转换。
使用inputStreamReader时是默认的编码表
InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”))
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),utf-8)