Java基础笔记四集合和IO流

Java基础笔记四
六、集合

1.        理解:集合就是存储对象最常用的一种方式,只用于存储对象,长度是可变的

          与数组的区别:都是容器,数组也可以储存对象,但长度是固定的,集合是可变的

                                  数组中可以存储基本数据类型,集合只能存储对象

2.        List(列表):Collection接口的子接口,可存放重复元素,元素存取有序的

特有方法:1 增:add(index,element)

                              addAll(index,Collection)

                2)  删:remove(index)

                3)  改:set(index,element)

                4)  查:get(index)

                               subList(from,to)

                               listIterator();对集合在遍历过程中进行增删改查

接口中常用的类:1 Vector:线程安全,但速度慢,已被ArrayList替代

                                             底层是数组数据结构

                                                 特有取出方式:elements()枚举

2)  ArrayList:线程不安全,查询速度快

 底层数据结构使用的是数组结构

3)  LinkedList:链表结构,增删速度快

 底层数据结构使用的是链表结构

     通过equals方法(复写)判断元素是否相同

迭代:在迭代的循环中next一次,就要做hasNext判断一次!

3.      Set(集):Collection接口的子接口,不可存放重复元素,元素存取是无序的

        接口中常用的类:1 HashSet:线程不安全,存取速度快

                                                  底层数据结构是哈希表

                                                 通过equals方法和hashCode来确定元素的唯一性

1)  TreeSet:线程不安全,可以对Set集合中的元素进               行排序

底层数据结构是二叉树

元素的排序方式一:通过元素实现接口Comparable中的compareTo完成,当主条件相同时,要判断副条件

元素的排序方式二:自定义比较器,该比较器实现Comparator接口,覆盖compare方法,两种方式都存在首先使用比较器

4.      泛型:

特点:1 提高了程序的安全性

2)   将运行期遇到的问题转移到了编译期

3 省去了类型强转的麻烦

4 泛型的出现优化了程序设计

                            静态:静态方法不可以访问类上定义的泛型

                                     如果静态方法操作的应用数据类型不确定,可以将泛型定义方法上

5.      Map

MapCollection

1)  两者在集合框架中并列存在

2)  Map存储的是键值对

3)  Map存储元素使用put方法,Collection使用add方法

4)  Map集合没有直接取出元素的方法,先转成Set集合,再通过迭代

5)  Map集合中键要保证唯一性

Map集合取出方式:

1)  Set<K> keySet:map中所有的键存入到set集合,因为set集合具有迭代器。通过迭代器获取所有键,通过map集合的get方法获得键对应的值。

2)  Set<Map.Entry<K,V>> entrySetmap中的映射关系存入到set集合,使用getKeygetValue方法获取键和值

常用类:

1)  Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代

2)  HashMap:线程不安全,速度快,允许存放null键,null

3)  TreeMap:对键进行排序,排序原理与TreeSet相同

6.      工具类:Collections:所有的方法全是静态的

  sort方法可以对List集合进行排序

                            Arrays:(用于操作数组的工具类)二分查找、局部排序

                                          asList方法可将数组变成集合,运用集合的思想操作数组元素,但是不能够使用集合的增删方法,因为集合的长度是固定的(同理,将集合变成数组时为了限定对集合中元素的操作)

7.      增强for循环:1 与迭代器的区别:

可以对集合进行遍历,但不能对集合进行操作

                                         迭代器:除了遍历,还可以对集合进行remove操作,如果是ListIterator,还可以在遍历过程中进行增删改查

2 与传统for循环的区别:

    传统for循环,可以定义角标,遍历数组时建议使用

      增强for循环,有一个局限是必须有被遍历目标

七、IO

1.        理解:IO流用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中

2.        分类:1 按操作数据:字节流和字符流

2  流向:输入流和输出流

3.        书写:导入IO包中的类

      进行IO异常处理

      finally中对流进行关闭

4.        字符流的缓冲区:

      对应类:BufferedWriterBufferedReader

         缓冲区提高了对数据的读写效率

      缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强

         跨平台的换行符:newLine()

                     BufferedReader中的读取一行readLine(),当返回值为null时,表示读取到文件的末尾。返回的时候只返回回车符之前的数据内容,不返回回车符,可以通过newLine实现换行

5.        装饰设计模式:

1)  当想要对已有的功能进行增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类(例如:缓冲区)

2)  装饰类通常会通过构造函数接受被装饰的对象,并基于被装饰对象的功能,提供更强的功能

3)  装饰类比继承要灵活,避免了继承体系臃肿,降低了类与类之间的关系。装饰类增强的是已有的对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以,装饰类和被装饰类通常属于同一个体系中

6.        字节流:不仅可以操作字符,还可以操作其他媒体文件

7.        字节流缓冲区:提高字节流的缓冲效率

8.        转换流:InputStreamReaderOutputStreamWriter

1)  由来:字符流与字节流之间的桥梁

      方便了字符流与字节流之间的操作

2)  应用:字节流中的数据都是字符时,转成字符流操作更高效,通常涉及到字符编码转换时,使用转换流

9.        标准输入输出流:(键盘录入,控制台显示)

1)  BufferedReader bufr = new BufferedReader(newInputStreamReader(System.in));

2)  BufferedWriter bufw = new BufferedWriter(newOutputStreamWriter(System.out));

10.        流操作的基本规律:

1)       明确源和目的

源:输入流:InputStreamReader

目的:输出流:OutputStreamWriter

2)       操作的数据是否是纯文本

是:字符流

不是:字节流

3)  体系明确后,再确定要使用哪个具体的对象

通过设备进行区分:

     源设备:内存、硬盘、键盘

     目的设备:内存、硬盘、控制台

11.        流应用:

1)       流是用来处理数据的

2)       处理数据时,一定要先明确数据源,与数据目的地

3)       数据源可以是文件,可以是键盘

4)       数据的目的地可以是文件、显示器、或者其他设备

5)       流只是在帮助数据进行传输,并对传输的数据进行处理

12.        File类:

1)  用来将文件或者文件夹封装成对象

2)  方便对文件与文件夹的属性信息进行操作

3)  File对象可以作为参数传递给流的构造函数

4)  File类中的常用方法

创建:

boolean createNewFile();在指定的位置创建文件,如果文件存在,则不创建,返回false,和输出流不一样。

boolean mkdir();创建文件夹

boolean mkdirs();创建多级文件夹

删除:

     boolean delete();删除失败返回false

     voiddeleteOnExit();在程序退出时删除指定文件

判断:

     boolean exists();文件是否存在

     isFile();判断是否是文件

     isDirectory();判断是否是文件夹

     isHidden();判断是否是隐藏文件

获取信息:

     getName();

     getPath();返回的是封装的路径

     getParent();返回的是绝对路径中的文件父目录

     getAbsolutePath();返回的是绝对路径

     length();

13.        递归:函数自身调用自身

注意:限定条件,注意递归的次数,尽量避免内存溢出

;