双列集合
map集合中的元素都是成对出现,成对存储的
map集合中的元素都是以一对键和值的形式组成存在的,称为键值对,理解为夫妻对
map集合中的键不能重复存储,值可以重复
map集合中的每一个键 对应着一个值
Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构只针对键有效,跟值无关
Collection集合的数据结构是针对元素有效
方法:
添加功能:
V put(K key, V value) 把指定的键与指定的值添加到Map集合中
删除功能:
void clear() 清空集合中的元素
V remove(Object key) 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值
判断功能:
boolean containsKey(Object key) 判断指定的键,在Map集合中是否存在
boolean containsValue(Object value) 判断指定的值,在Map集合中是否存在
boolean isEmpty() 判断Map集合是否为空的集合
获取功能:
Set<Map.Entry<K,V>> entrySet() 获取到Map集合中所有的键值对对象的集合(Set集合)
V get(Object key) 根据指定的键,在Map集合中获取对应的值
Set<K> keySet() 获取Map集合中所有的键,存储到Set集合中
int size() : 获取Map集合中 键值对元素的个数
Collection<V> values(): 获取Map集合中所有的值,存储到Collection集合中
—————————————————————————————
Map集合遍历的两种方式
方式1:根据键找值
//方式1 键找值的方式
//a, 获取到Map集合中所有的键
//b, 遍历键的集合,获取到每一个键
//c, 通过键,找到对应的值
//获取到Map集合中所有的键
Set<String> keys = map.keySet();
//遍历键的集合,获取到每一个键
for (String key : keys) {
//通过键,找到对应的值
Student s = map.get(key);
System.out.println( key + "..." + s.getName() + "..." + s.getAge() );
}
方式2:根据键值对对象找键和值
//a, 获取Map集合中所有的键值对元素,返回对应的集合
//b, 遍历键值对元素集合,获取到每一个键值对元素对象
//c, 通过键值对元素对象,获取对应的键,和对应的值
//获取Map集合中所有的键值对元素,返回对应的集合
Set< Map.Entry<String, Student>> entrySet = map.entrySet();
//遍历键值对元素集合,获取到每一个键值对元素对象
for (Map.Entry<String, Student> entry : entrySet) {
//通过键值对元素对象,获取对应的键,和对应的值
//找键
String key = entry.getKey();
//找值
Student s = entry.getValue();
//打印
System.out.println( key+"..."+s.getName()+"..."+s.getAge() );
}
—————————————————————————————
HashMap:
特点:
他是Map集合的子集合
底层采用哈希表结构
HashMap集合中的key不能重复,如何保证键不能重复?
重写hashCode() 与 equals()
不能保证元素存与取的顺序完全一致
允许使用 null 值和 null 键
线程不同步,效率高
—————————————————————————————
LinkedHashMap:
特点:
有序并唯一的Map集合
有序: Map集合中元素的存与取的顺序一致
元素唯一: Map集合中的键 不能重复存储
有序: 是由 链表结构来实现的
元素唯一: 是由 哈希表结构来实现的
—————————————————————————————
TreeMap:
特点:
底层是二叉树实现的
TreeMap集合中的键是如何保证唯一并排序的?
方式1,通过 自然排序接口 实现
Comparable接口
重写方法 compareTo(T obj)
方式2,通过比较器接口 实现
Comparator接口
重写方法 compare(T obj1, T obj2)
—————————————————————————————
集合的嵌套
里面里面的元素是一个集合
new ArrayList< ArrayList<String> >();
new HashMap<String, HashMap<String,String> >;
new HashMap<String, ArrayList<String> >
new LinekedList< HashMap<String,String> >
—————————————————————————————
1, HashMap和Hashtable的区别?
HashMap:
他是Map集合的子集合
底层哈希表结构
键和值 可以存储 null
jdk1.2 线程不同步,效率高
Hashtable:
他是Map集合的子集合
底层哈希表结构
键和值 不能存储为 null
jdk1.0 线程同步,安全
2, List,Set,Map等接口是否都继承子Map接口?
List 不继承 Map接口, List继承的是 Collection集合
Set 不继承 Map接口,Set 继承的是 Collection集合
Collection 单列集合, 掌握Collection 集合中的方法
|- List, 知道List集合中的方法
|- ArrayList
|- Vector
|- LinkedList
|- Set
|- HashSet
|- LinkedHashSet
|- TreeSet
Map 双列集合, 掌握 Map集合中的方法
|- HashMap
|- LinkedHashMap
|- TreeMap
—————————————————————————————
Collections: 集合工具类
Collection: 单列集合的顶层接口
Map : 双列集合的顶层接口
Collections中的方法:
public static <T> void sort(List<T> list) 排序
public static <T> int binarySearch(List<?> list,T key) 二分查找
public static <T> T max(Collection<?> coll) 最大值
public static void reverse(List<?> list) 反转
public static void shuffle(List<?> list) 集合中的元素存储位置随机打乱
—————————————————————————————
异常:就是java中出现的不正常的现象(错误与异常)
异常的继承体系:
Throwable: 它是所有错误与异常的超类(祖宗类)
|- Error 错误,不管
|- Exception 编译期异常, javac.exe进行编译的时候报错
|- RuntimeException 运行期异常, java出现运行过程中出现的问题
异常中 涉及的关键字:
try: 可能发生异常的代码
catch: 捕获异常,进行异常的处理
finally: 在异常处理过程中,一定要执行的代码
throws: 说明该方法中,可能会抛出指定的异常
throw: 说明抛出了一个异常对象
异常中 涉及到的方法:
Throwable
public String getMessage() 获取异常原因
public String toString() 获取异常类名与 异常原因
public void printStackTrace() 获取异常类名、异常原因、异常产生的位置
public void printStackTrace(PrintStream ps) 获取异常类名、异常原因、异常产生的位置,把信息存储指定的日志文件中
异常处理的两种方式:
1,出现问题,自己解决
try{
可能出现异常的代码
} catch(异常类名 对象名){
异常处理代码
} finally {
异常操作中一定要执行的代码
}
try{
可能出现异常的代码
} catch(异常类名 对象名){
异常处理代码
} catch(异常类名 对象名){
异常处理代码
}
try{
可能出现异常的代码
} catch(异常类名1 | 异常类名2 | 异常类名3... 对象名){
异常处理代码
}
try{
可能出现异常的代码
} catch(异常类名 对象名){
异常处理代码
}
try{
可能出现异常的代码
} finally {
异常操作中一定要执行的代码
}
2,出现问题,别人解决
格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2,...{}
public void method() throws ATMException{}
自定义异常:
定义一个类,让该类继承于 Exception
重写构造方法:
空参数构造方法
只有一个String参数的构造方法
—————————————————————————————
异常中的注意事项;
try...catch..finally
异常使用的注意事项
当产生多个异常需要处理的时候,如果多个异常之间有子父类异常关系
子类异常放上面编写,父类异常放下面编写
throws
异常处理使用的注意事项
如果要抛出多个异常,多个异常之间有子父类异常关系,抛出父类异常即可
throws 异常处理的使用注意事项:
1, 父类方法没有抛出异常,子类方法中 不能抛出异常, 只能try..catch处理
2, 父类方法有有异常抛出,子类方法可以抛出与父类相同的异常,或者父类异常的子异常
3, 父类方法有有异常抛出,子类可以不抛出异常的
4, 父类方法有有异常抛出,子类方法不可以抛出父类没有的异常,或超出父类异常的范围
—————————————————————————————
File: 文件和目录路径名的抽象表示形式
文件 F:\itcast\20150718\day19\总结.txt
目录 F:\itcast\20150718\day19\当天作业
构造方法:
public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象
pathname = F:\itcast\20150718\day19\总结.txt
public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象
parent = F:\itcast\20150718\day19
child = 总结.txt
public File(File parent, String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象
—————————————————————————————
File类中的创建功能:
创建文件
public boolean createNewFile() throws IOException
返回值为true, 说明创建文件成功
返回值为false,说明文件已存在,创建文件失败
IOException: 系统找不到指定的路径。
创建目录
public boolean mkdir() 创建单层文件夹
创建文件夹成功,返回 true
创建文件夹失败,返回 false
public boolean mkdirs() 创建多层文件夹
—————————————————————————————
FIle类的删除功能
public boolean delete()
删除此抽象路径名表示的文件或目录。
如果此路径名表示一个目录,则该目录必须为空才能删除。
—————————————————————————————
File类中的重命名功能
public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
两个File对象 是否在同一个文件夹中
文件夹相同, 重命名功能
文件夹不同,重命名 + 移动功能
路径的分类:
绝对路径, 带盘盘符
E:\Workspace\20150718\day20_File\abc.txt
相对路径, 不带盘符
day20_File\abc.txt
注意: 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为 项目的根目录
—————————————————————————————
判断功能
public boolean isDirectory() 判断是否为文件夹
public boolean isFile() 判断是否为文件
public boolean exists() 判断File对象对应的文件或文件夹是否存在
public boolean canRead() 判断当前File对象对应的文件中的内容是否可读
public boolean canWrite()判断当前File对象对应的文件中的内容是否可写
public boolean isHidden()判断当前file对象对应的文件或文件夹是否是隐藏文件
—————————————————————————————
基本获取功能
public String getAbsolutePath() 获取当前File的绝对路径
public String getPath() 获取当前File对象的路径, 通常用来获取相对路径
public String getName() 获取当前File对象的文件或文件夹名称
public long length() 获取当前File对象的文件或文件夹的大小(字节)
public long lastModified() 获取File对象的最后一次的修改时间
—————————————————————————————
高级获取功能
public String[] list() 获取File所代表目录中所有文件或文件夹的名称
public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径
—————————————————————————————
文件名称过滤器的实现思想及代码
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
—————————————————————————————
递归: 方法定义中调用方法本身的现象
//直接递归
public void methodA(){
methodA();
}
//间接递归
public void metohdB(){
methodC();
}
public void methodC(){
methodB();
}
—————————————————————————————
递归注意实现
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
构造方法不能递归使用
—————————————————————————————
IO流:处理设备之间的数据传输
上传文件和下载文件
IO(Input, Output)
输入 输出
IO流分类
流的方向:
输入流
输出流
数据类型:
字节流
字符流
什么情况下使用哪种流呢?
如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
如果你什么都不知道,就用字节流
IO流按照数据类型 分类:
字节流
字节输入流--> InputStream
|- FileInputStream
字节输出流--> OutputStream
|- FileOutputStream
字符流
字符输入流--> Reader
字符输出流--> Writer
—————————————————————————————
OutputStream类: 字节输出流的超类,抽象类
功能:它可以将数据写入到指定的文件中
FileOutputStream: 文件字节输出流,是用于将数据写入 File中的
构造方法:
public FileOutputStream(File file) throws FileNotFoundException
指定一个File对象,用来创建文件输出流对象
public FileOutputStream(String name) throws FileNotFoundException
指定一个文件的路径,用来创建文件输出流对象
如果指定的File文件不存在,帮我们创建出来,进行操作 ;
如果存在,则直接打开文件,进行操作
字节输出流中的写数据的方法
public void write(int b) 写出一个字节到文件中
public void write(byte[] b) 写出一个字节数组的内容 到文件中
public void write(byte[] b,int startIndex, int len) 写出一个字节数组一部分的内容 到文件中
参数:startIndex 指定起始位置
len: 指定 要写出数据的个数
面试题
1,创建字节输出流到底做了哪些事情?
FileOutputStream fos = new FileOutputStream("fos.txt");
a,创建了一个文件字节输出流对象
b,如果fos.txt文件不存在, 创建该文件,如果已经存在,打开
c,把创建好的字节输出流对象 赋值给 fos变量
2,数据写成功后,为什么要close()?
public void close() throws IOException
关闭此输出流并释放与此流有关的所有系统资源
3,如何实现数据的换行?
Windows \r\n
Unix Linux \n
MacOS \r
4,如何实现数据的追加写入?
public FileOutputStream(File file, boolean append) throws FileNotFoundException
public FileOutputStream(String name, boolean append) throws FileNotFoundException
—————————————————————————————
InputStream: 字节输入流, 抽象类,用来读取文件中的数据的
此抽象类是表示字节输入流的所有类的超类
通过字节输入流,读取文件中的数据
FileInputStream: 从文件中获取 字节数据的
构造方法:
public FileInputStream(File file) throws FileNotFoundException
public FileInputStream(String name) throws FileNotFoundException
有指定的文件,就打开,没有指定的文件就报错
InputStream 文件字节输入流中的读取方法
public abstract int read() throws IOException 一次读取一个字节
不用担心是抽象方法,自类会将方法实现
注意: 如果流位于文件末尾而没有可用的字节,则返回值 -1
public int read(byte[] b) throws IOException 一次读取一个字节数组
参数:
byte[] b 用来存储每次在文件中读取到的字节数据
返回值:
int, 每次从文件中 读取了多少个新的字节数据
如果为-1,说明文件中的数据读取完了
如果不为-1,说明从文件中读取到了新的字节数据
—————————————————————————————
写数据的步骤:
1, 创建流对象(打开文件)
2, 写数据到文件中
3, 关闭文件
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcde".getByte() );
fos.close();
—————————————————————————————
读数据的步骤
1, 创建流对象(打开文件)
2,从文件中读取数据
3,关闭文件
FileInputStream fis = new FileInputStream("fis.txt");
//方式1 一次读取一个字节
int ch = -1;
while ( (ch = fis.read()) != -1 ){
syso( ch );
}
//方式2 一次读取一个字节数组
byte[] buffer = new byte[1024];// 1kb
int len = -1;
while ( (len = fis.read(buffer)) != -1 ) {
syso( buffer );
}
—————————————————————————————
fis.close();
DataInputStream: 数据输入流, 从流中读取基本 Java 数据类型
DataInputStream(InputStream in)
DataOutputStream: 数据输出流, 将基本 Java 数据类型写入输出流
DataOutputStream(OutputStream out)
—————————————————————————————
内存操作流
内存操作流一般用于处理临时信息,因为临时信息不需要保存,使用后就可以删除
可以不关闭流,因为内存操作流的close方法的实现是空的
操作字节数组
ByteArrayInputStream
ByteArrayOutputStream
操作字符数组
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter
—————————————————————————————
打印流
字节打印流: PrintStream
System.out.println()
public static final PrintStream out
字符打印流: PrintWriter
构造方法:
PrintWriter(File file)
PrintWriter(String fileName)
PrintWriter(OutputStream out)
PrintWriter(Writer out)
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)
普通方法:
public void println(int x) 带换行效果,可以没有参数
public void print(int x) 不带换行, 必须有参数
注意:
如果启用了自动刷新,则只有在调用 println、printf 或 format 的能够实现数据写入到流所对应的文件
—————————————————————————————
标准输入输出流
System.in -- 标准的输入流 -- 键盘输入
System.out -- 标准的输出流 -- 显示器显示
public static final InputStream in 字节输入流
public static final PrintStream out 字节打印流(输出流)
public static final PrintStream err 字节打印流(输出流) “标准”错误输出流
键盘输入数据:
Scanner
main() 传入参数
System.in
控制台输出数据:
System.out.println();
System.out <---> PrintStream
—————————————————————————————
RandomAccessFile 随机访问流, 支持对文件的读与写操作
public final int readXxx() throws IOException 获取Xxx类型数据
public native long getFilePointer() throws IOException 获取当前指针的位置
public native void seek(long pos) throws IOException 设置当前指针的位置
native : JNI( Java Native Interface)
-------------------------------------------------------
序列化流: 把对象写入到流中
ObjectOutputStream
构造方法:
ObjectOutputStream()
ObjectOutputStream(OutputStream out)
方法:
public final void writeObject(Object obj) throws IOException
将指定的对象写入 ObjectOutputStream
反序列化流:从流中读取对象
ObjectInputStream
构造方法
ObjectInputStream()
ObjectInputStream(InputStream in)
方法:
public final Object readObject() throws IOException, ClassNotFoundException
* 从 ObjectInputStream 读取对象
注意: 使用序列化与反序列化的类通过实现 java.io.Serializable 接口以启用其序列化功能。
未实现此接口的类将无法使其任何状态序列化或反序列化
序列化接口没有方法或字段,仅用于标识可序列化的语义
使用transient关键字声明不需要序列化的成员变量
—————————————————————————————
Properties: 它是唯一 一个能与IO流相结合的集合
特点:
Map集合的子集合
它的父类是 Hashtable
它的键与值都是String类型数据
Properties 特有方法
public Object setProperty(String key, String value) ----- put(K key, V value)
调用 Hashtable 的方法 put。
public Set<String> stringPropertyNames() --- keySet()
返回此属性列表中的键集,其中该键及其对应值是字符串
public String getProperty(String key) ---- get(K key)
用指定的键在此属性列表中搜索属性
public String getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性
Properties和IO流的结合使用
public void load(InputStream stream)
public void load(Reader reader) 把流所对应的文件中的数据,读取到集合中
public void store(OutputStream stream,String comments)
public void store(Writer writer,String comments) 把集合中的数据,存储到流所对应的文件中
—————————————————————————————
集合:
ArrayList
HashSet
HashMap
泛型
IO:
字节流(最常用)
字符流
|-转换流
打印流
内存流
序列化流