java基础第十天——集合框架与IO流

  Map: 
  双列集合
  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:
字节流(最常用)
字符流
|-转换流
打印流
内存流
序列化流

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值