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:
Map与Collection:
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>> entrySet将map中的映射关系存入到set集合,使用getKey和getValue方法获取键和值
常用类:
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. 字符流的缓冲区:
对应类:BufferedWriter、BufferedReader
缓冲区提高了对数据的读写效率
缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强
跨平台的换行符:newLine()
BufferedReader中的读取一行readLine(),当返回值为null时,表示读取到文件的末尾。返回的时候只返回回车符之前的数据内容,不返回回车符,可以通过newLine实现换行
5. 装饰设计模式:
1) 当想要对已有的功能进行增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类(例如:缓冲区)
2) 装饰类通常会通过构造函数接受被装饰的对象,并基于被装饰对象的功能,提供更强的功能
3) 装饰类比继承要灵活,避免了继承体系臃肿,降低了类与类之间的关系。装饰类增强的是已有的对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以,装饰类和被装饰类通常属于同一个体系中
6. 字节流:不仅可以操作字符,还可以操作其他媒体文件
7. 字节流缓冲区:提高字节流的缓冲效率
8. 转换流:InputStreamReader,OutputStreamWriter
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. 递归:函数自身调用自身
注意:限定条件,注意递归的次数,尽量避免内存溢出