集合类

数组和集合的比较

数组的特点:

  • 本质上就是一段连续的存储空间,用于记录多个类型相同的数据。
  • 支持下标访问,可以实现随机访问。
  • 数组一旦定义则长度固定,无法自动调整内存空间的大小。
  • 增删元素不方便,可能会造成大量元素的移动。
  • 数组元素可以是基本数据类型,也可以是引用数据类型。

集合的特点:

  • 内存空间可以连续也可以不连续,数据类型可以不相同。
  • 部分支持下标访问,部分不支持。
  • 集合的存储空间长度不固定,可以随时自动调整大小。
  • 增删元素方便,可以不移动任何元素。
  • 集合元素必须是引用数据类型。

集合框架

在Java中集合框架的顶层接口是:java.util.Collection接口 和 java.util.Map接口。
其中Collection接口中操作元素的基本单位是:单个元素。
其中Map接口中操作元素的基本单位是:单对元素。

在以后的开发中Collection接口本身很少使用,更多的是该接口的子接口:List接口、Queue接口、Set接口。

Collection接口的常用方法

boolean add(E e) - 用于将参数指定的元素e放入当前集合中。
- 若当前集合发生改变则返回true,否则返回false。
boolean addAll(Collection<? extends E> c)
- 用于将参数指定集合c中的所有元素放入当前集合中。boolean remove(Object o)
- 用于从当前集合中移除参数o指定的单个元素。
boolean removeAll(Collection<?> c)
- 用于从当前集合中移除参数c指定的所有元素。
void clear()
- 用于移除当前集合中的所有元素,也就是清空当前集合。boolean contains(Object o)
- 用于判断当前集合中是否包含参数指定的单个元素。
boolean containsAll(Collection<?> c)
- 用于判断当前集合中是否包含参数指定的所有元素。int size() - 用于获取当前集合中的元素个数并返回。
boolean isEmpty() - 判断当前集合是否为空。
boolean retainAll(Collection<?> c)
- 用于计算当前集合和参数集合中的交集并保留到当前集合中。
- 若当前集合中的元素发生改变则返回true,否则返回false。

List集合


基本概念
java.util.List接口是Collection接口的子接口,元素有放入先后次序,并且允许重复。
该接口的主要实现类有:ArrayList类、LinkedList类、Stack类、Vector类

其中ArrayList类的底层是采用动态数组实现的,因此访问元素方便,增删元素不方便。
其中LinkedList类的底层是采用双向链表实现的,因此访问元素不方便,增删元素方便。
其中Stack类的底层是采用动态数组实现的,该类主要描述具有后进先出特性的数据结构,简称为LIFO(last in first out 栈)。
其中Vector类的底层是采用动态数组实现的,与ArrayList类相比,是Java早期提供的类,属于线程安全的类,因此效率比较低,推荐使用ArrayList类取代之。

常用的方法

void add(int index, E element) - 用于将元素element插入到当前集合中index的位置。
boolean addAll(int index, Collection<? extends E> c)
- 用于将集合c中的所有元素插入到当前集合中index的位置。
E remove(int index) - 用于删除当前集合中下标为index位置的元素并返回。
E set(int index, E element)
- 用于将当前集合中index位置的元素替换为element并返回之前的元素值。
E get(int index) - 用于获取当前集合中index位置的元素并返回。List<E> subList(int fromIndex, int toIndex)
- 用于获取当前集合中从fromIndex(含)到toIndex(不含)之间的部分视图并返回。
- 所谓视图就是并没有申请新的内存空间去单独存放可以看到的元素。

泛型机制


通常情况下,集合中允许存放不同类型的数据内容,是因为这些数据全部被看做Object类型放入的,当需要从集合中取出元素时则也只能按照Object类型来处理,若希望表达该元素真实的数据类型时,就需要进行强制类型转换,而该方法容易引发类型转换异常。
为了避免上述错误的发生,从jdk1.5开始引入泛型机制,也就是在每个集合类型的右侧使用<数据类型>的方式明确要求该集合可以存放的元素类型,若放入元素类型不匹配则编译报错。

如:
List<String> l1 = new LinkedList<String>();

原理(尽量理解):
泛型的本质就是参数化类型,也就是让数据类型作为参数进行传递的过程。其中List集合中的E相当于形式参数进行占位,而使用List集合时<>中的数据类型相当于实际参数对形式参数进行赋值,当赋值完毕后则List集合中所有的E都会被<>中的类型加以替换,而实际参数的种类可以是多样的,因此导致同一个List集合却能处理各种不同类型的数据,支持更加广泛的类型,从而得名"泛型"。
Queue接口(重点)

基本概念
java.util.Queue接口是Collection接口的子接口,与List接口属于平级关系。
该接口主要用于描述一种具有先进先出特征的数据结构,简称为FIFO(first in first out)
该接口的主要实现类是:LinkedList类。

常用的方法

boolean offer(E e) - 用于将参数指定的元素e插入到当前队列中的末尾。
E poll() - 用于获取并移除当前队列中的队首元素,若队列为空,则返回null。
E peek() - 用于获取队首元素并返回,若队列为空,则返回null。

Set接口(重点)

1 基本概念
java.util.Set接口是Collection接口的子接口,元素没有放入次序并且不允许重复。
该接口的主要实现类有:HashSet类 和 TreeSet类。
其中HashSet类的底层是采用哈希表进行数据的管理。
其中TreeSet类的底层是采用二叉树进行数据的管理。

常用的方法

参考Collection集合的方法即可。
Iterator<E> iterator() - 用于获取当前集合的迭代器对象,可以访问集合中的每个元素
boolean hasNext() - 用于判断当前集合中是否拥有元素可以迭代/遍历/访问。
E next() - 用于获取一个元素并指向下一个位置。
void remove() - 用于从集合中移除刚刚获取到的元素。注意:
当迭代集合中的所有元素时,若希望删除某个元素则需要使用迭代器自己的remove()方法,若使用集合的remove()方法则会引发并发修改异常。

增强版的for循环(for each)

(1)语法格式for(元素类型 变量名 : 数组名/集合名){循环体;}(2)执行流程
不断地从数组/集合中取出元素并赋值给变量名,然后执行循环体,直到处理完毕所有元素总结:
对于Set集合来说,遍历所有元素的方式有3种:toString()、迭代器、增强版for循环。
对于List集合来说,遍历方式除了上述3种之外,还有 get()方法的获取。

TreeSet类

什么是二叉树?
二叉树就是指每个节点最多只有两个子节点的树形结构

什么是有序二叉树?

有序二叉树就是指满足以下3个条件的二叉树,又叫做二叉查找树。

  • 要求左子树中任意节点的元素值都小于根节点元素值;
  • 要求右子树中任意节点的元素值都大于根节点元素值;
  • 左子树和右子树的内部也要遵循上述规则;
    向TreeSet类中放入元素
    当需要添加元素到TreeSet集合时,需要指定元素比较大小的规则,具体方式如下:
    a.使用元素的自然排序进行处理,也就是让元素类型实现java.lang.Comparable接口;
    b.使用比较器进行处理,也就是创建TreeSet对象时传入java.util.Comparator接口;

注意:
当创建TreeSet集合时没有传入比较器则采用元素的自然排序规则进行处理,若传入比较器则按照比较器的规则进行处理,并且使用比较器可以实现多元化的排序。

Map接口(重点)


1 基本概念
java.util.Map<K,V>接口中操作元素的基本单位是:单对元素,具体格式如下:
K - 此映射所维护的键(Key)的类型
V - 映射值(Value)的类型
该接口中不能包含重复的key,并且一个key最多只能对应一个value。
该接口的主要实现类为:HashMap类 和 TreeMap类。

2 常用的方法

V put(K key, V value) - 使用参数指定的key和value组成一对放入当前集合中。
- 若当前集合中没有key则返回null,否则返回key之前对应的value.
V remove(Object key) - 用于从当前集合中移除参数key指定的元素。
boolean containsKey(Object key) - 用于判断当前集合是否包含参数指定的key.
boolean containsValue(Object value) - 用于判断当前集合是否包含参数指定的value.
V get(Object key) - 用于根据参数指定的key返回对应的value。Set<Map.Entry<K,V>> entrySet()
- 用于将当前调用对象表示的Map集合转换为Set集合并返回。
K getKey() - 用于获取Entry类型变量中的key并返回。
V getValue() - 用于获取Entry类型变量中的value并返回。
Set<K> keySet()
- 用于将当前调用对象表示的Map集合中所有的Key组成Set集合并返回。

HashMap

HashMap原理:

HashMap性能:

异常机制

File类(重点)

基本概念
java.io.File类用于描述指定路径信息的文件或目录,可以获取相关的属性信息,大小等

常用的方法
File(String pathname) - 根据参数指定的路径名来构造对象进行关联。
boolean exists() - 用于判断文件或目录是否存在。
String getName() - 用于获取文件或目录的名称。
long length() - 用于获取文件的长度/大小。
long lastModified() - 用于获取文件的最后一次修改时间,需要与Date类搭配使用。
String getAbsolutePath() - 用于获取绝对路径信息并返回。
绝对路径 - 主要指以根目录开始的路径信息,如:C:/… D:/… /…
相对路径 - 主要指以当前所在目录开始的路径信息,如:./…
- 以后的开发中推荐使用相对路径的方式。
boolean delete() - 用于删除文件或目录。
boolean createNewFile() - 用于创建新的空文件。

boolean mkdir() - 用于创建单层目录。
boolean mkdirs() - 用于创建多层目录。File[] listFiles() - 用于获取当前目录中的所有内容并返回。
boolean isFile() - 用于判断是否为标准文件。
boolean isDirectory() - 用于判断是否为目录文件。

I/O流

基本概念
I/O就是Input/Output的简写,也就是表示输入/输出的含义。
I/O流就是指像流水一样不间断地进行数据的读写过程。

基本分类
以读写数据的单位不同分为:字节流和字符流。
其中字节流就是指以字节为单位进行读写的流,可以读写任意类型的文件。
其中字符流就是指以字符(2个字节)为单位进行读写的流,只能读写文本文件。

以数据流动的方向不同分为:输入流和输出流(站在程序的角度)。
其中输入流就是指将数据内容输入到程序中的流,也就是读文件。
其中输出流就是指将数据内容从程序中输出,也就是写文件。

基本框架

FileOutputStream类(重中之重)


基本概念
java.io.FileOutputStream类用于将图像数据之类的原始字节流写入到输出流中。

常用的方法

FileOutputStream(String name) - 根据参数指定的路径名来构造对象。
FileOutputStream(String name, boolean append) - 用于以追加的方式构造对象。
void write(int b) - 用于将参数指定的单个字节写入输出流。
void write(byte[] b, int off, int len)
- 用于将数组b中从off位置开始的len个字节写入输出流。
void write(byte[] b)
- 用于将数组b中的所有字节写入输出流。
void close() - 用于关闭流对象并释放有关的资源。

FileInputStream类(重中之重)

基本概念
java.io.FileInputStream类用于读取图像数据之类的原始字节流。

常用的方法

FileInputStream(String name) - 根据参数指定的文件名来构造对象。
int read() - 用于从输入流中读取一个字节的数据并返回,若读到文件末尾则返回-1。
int read(byte[] b, int off, int len)
- 用于从输入流中读取len个字节放入数组b中下标为off的位置上。
- 成功返回实际读取到的字节数,若读到文件末尾则返回-1。
int read(byte[] b)
- 用于从输入流中读取b.length个字节放入数组b中。
int available()
- 用于获取此输入流所关联文件的大小。
void close() - 用于关闭流对象并释放有关的资源。

DataOutputStream类(熟悉)

基本概念
java.io.DataOutputStream类主要用于将Java语言中基本数据类型的内容写入输出流中。

常用的方法

DataOutputStream(OutputStream out) - 根据参数指定的引用来构造对象。
- 其中OutputStream类是个抽象类,实参需要传递子类的对象。
void writeInt(int v) - 用于将参数指定的整数以4个字节的形式写入输出流中。
- 优先写入高字节数据,如:12: 0000 0000   0000 0000    0000 0000  0000 1100
void close()

DataInputStream类(熟悉)

基本概念
java.io.DataInputStream类用于从输入流中读取Java基本数据类型的内容。

常用的方法

DataInputStream(InputStream in) - 根据参数指定的引用来构造对象。
- 其中InputStream类是个抽象类,实参需要传递子类的对象。
int readInt() - 用于读取一个整数并返回。
void close()

BufferedWriter类(重点)

基本概念
java.io.BufferedWriter类用于写入单个字符、字符数组以及整个字符串到输出流中。

常用的方法

BufferedWriter(Writer out) - 根据参数指定的引用来构造对象。
- 其中Writer类是个抽象类,因此实参需要传递子类的对象。
void write(int c) - 用于写入参数指定的单个字符。
void write(char[] cbuf, int off, int len)
- 用于将参数cbuf中下标从off位置开始的len个字符写入输出流。
void write(char[] cbuf)
- 用于将参数cbuf中整个字符数组的内容写入输出流。
void write(String s, int off, int len)
- 用于将参数s中从off位置开始的len个字符写入输出流中。
void write(String str)
- 用于将参数str指向的整个字符串写入输出流中。
void newLine() - 用于写入一个行分隔符。
void close()

BufferedReader类(重点)

基本概念
java.io.BufferedReader类用于从输入流中读取单个字符、字符数组以及一行字符串内容。

常用的方法

BufferedReader(Reader in) - 根据参数指定的引用来构造对象。
- 其中Reader类是个抽象类,实参需要传递子类的对象。
int read() - 用于读取单个字符并返回。
int read(char[] cbuf, int off, int len)
- 用于读取len个字符放入字符数组cbuf中下标从off开始的位置。
int read(char[] cbuf)
- 用于读取cbuf.length个字符放入字符数组中。
String readLine()
- 用于读取一行字符串并返回。
void close()

PrintStream类(重点)

基本概念
java.io.PrintStream类用于实现各种数据格式的打印/输出。

常用的方法

PrintStream(OutputStream out) - 根据参数指定的引用来构造对象。
- 其中OutputStream类是个抽象类,实参需要传递子类的对象。
void print(String s) - 用于输出参数指定的字符串。
void println(String x) - 用于输出字符串后换行。
void close()

ObjectOutputStream类(重点)


基本概念
java.io.ObjectOutputStream类主要用于将Java语言中的对象整体写入输出流中。
只能将支持 java.io.Serializable 接口的对象写入流中
类通过实现 java.io.Serializable 接口以启用其序列化功能。
序列化就是指将一个对象的相关信息有效组织成一个字节序列的过程,反之就叫做反序列化

常用的方法

ObjectOutputStream(OutputStream out) - 根据参数指定的引用构造对象。
- 其中OutputStream类是个抽象类,实参需要传递子类的对象。
void writeObject(Object obj)
- 用于将参数指定的对象整体写入输出流。
void close()

ObjectIntputStream类(重点)

基本概念
java.io.ObjectInputStream类用于将之前写入的对象整体读取出来。

常用的方法

ObjectInputStream(InputStream in) - 根据参数指定引用来构造对象。
- 其中InputStream类是抽象类,实参传递子类的对象。
Object readObject() - 用于读取一个对象并返回。
void close()

经验的分享:
当需要将多个对象写入文件时,通常建议将多个对象放入一个集合中,然后将这个集合看做一个对象整体写入文件中,此时只需要写入一次,而读取文件中的内容时,可以一次性将整个集合读取出来。

那年学过的Java笔记三核心类库二相关推荐

  1. 那年学过的Java笔记三核心类库一

    核心类库一: 抽象类 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰 具体语法格式如下: 访问控制符 abstract 返回值类型 方法名称( ...

  2. 那年学过的Java笔记三核心类库三

    线程 基本概念 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件. 进程 - 主要指运行在内存中的程序. 目前主流的操作系统都支持多进程,是为了让操作系统同时执行多个任务,但进程是重量级的 ...

  3. 那年学过的Java笔记一SE基础

    JavaSE知识点梳理 [外链图片转存失败(img-EbT2nyO4-1564412078255)(https://i.imgur.com/eZoqsaL.jpg)] JavaSE基础 [外链图片转存 ...

  4. 那年学过的Java笔记二SE面向对象

    面向对象 面向对象编程 1 什么是对象? 万物皆对象. 2 什么是面向对象? 面向对象就是指以特征/属性和行为的观点去分析现实世界中事物的方式.3 什么是面向对象编程? 面向对象编程就是指先以面向对象 ...

  5. Java笔记04-核心类库

    Java笔记04-核心类库 Object类 1.1 常用的包 java.lang包 -该包是Java语言中的核心包,该包中的内容由Java虚拟机自动导入 如:String类,System类等java. ...

  6. 那年学过的Oracle笔记

    数据库基础 DB 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜--存储电子文件的处所,用户可以对文件中的数据进行新 ...

  7. java笔记三java基础语法

    Final关键字 package demo07;public class Demo02Final {/*day11[final.权限.内部类.引用类型]* 学习了继承之后,子类可以对父类的方法进行重写 ...

  8. java需要记的语法,Java笔记(三)……基础语法

    myeclipse,eclipse控制台输出乱码问题 首先我描述一下问题,我在做udp socket编程(一个聊天的程序)的时候,从控制台中读取中文,然后再向控制台中打印,出现中文乱码的情况. 1.出 ...

  9. 小汤学编程之JAVA基础day07——面向对象(二):封装、继承与多态

    一.封装 1.使用步骤      2.优点     3.包结构     4.访问修饰符 二.继承 1.理解      2.重写     3.final的详解     4.防止被继承的两种方法 三.多态 ...

最新文章

  1. c语言字面值知识体系总结大学霸IT达人
  2. python的基础网络编程是下列_Python基础(六)网络编程
  3. 数据结构:栈实现逆波兰计算器
  4. 高等数学:第七章 空间解析几何(1)空间解析几何与向量代数 向量的加减法、数乘、坐标
  5. 正儿八经的详细讲java内部类
  6. [转]MySQL数据库优化总结
  7. NTLDR is missing解决方法
  8. 【主席树】更为厉害(P3899)
  9. java充血模型orm框架,关于领域驱动设计和贫血、失血、充血模型
  10. list的交集,差集,并集
  11. OpenCV4图像处理算子不完全手册-入门篇(已完结)
  12. Function与function的区别
  13. 【Linux系列文章】正则表达式与文本处理工具
  14. 【POJ 1187】 陨石的秘密(dp)
  15. 原生JS快速实现拖放(drag and drop)效果
  16. 应用程序无法正常启动(0x000007b)的不常见的解决过程
  17. 阿尔法编程python答案第四章_智慧职教Python编程基础答案第四章单元测试答案
  18. fluter set get
  19. [OpenGL] 小游戏 - 太空对战
  20. 一个前端的MONGO救赎--1

热门文章

  1. 曾火爆一时的五笔输入法,为什么彻底衰落了?
  2. 运算符重载为类的友元函数
  3. 【计算机网络】许多信道不能传输低频、直流分量的原因
  4. post报文给mqtt服务器没有响应,post请求转为mqtt的方法
  5. 对警报线程池的警报线程_检测和警报SQL Server代理丢失的作业
  6. idea引入外部jar,运行项目不报错,使用maven打war包install/package时报程序包不存在等
  7. 内置auth 的使用,用超级用户创建
  8. Windows Server 2008 R2 主域控制器委派DNS到子域控控制器
  9. Android坡度计
  10. 让你的 Node.js 应用跑得更快的 10 个技巧