java核心
异常处理
-
这个感觉目前还是用不了。只是在提示的时候加上。
-
try{
//错误的方法
}catch{//处理
}可以多个catch处理多个异常
finally{
//最终执行代码
}
执行完会顺序执行后面的语句 -
throw ex; 抛出异常给上级
throw 的作用是手工抛出异常类的实例化对象 将异常再次抛出,即使是处理了还可以
throws 声明的方法表示该方法不处理异常,而由系统自动将所捕获的异常信息抛给上级调用方法。
上级调用了throws声明的方法,自定义异常
class 自定义异常类 extends 异常类{//必须继承java标准类库里意思相近的或者Java基类,Exception()
} -
编译时异常: 程序正确,但因为外在的环境条件不满足引发。
例如:用户错误及I/O问题—-程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,
而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。
Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。 -
运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范……这类异常需要更改程序来避免,
Java编译器强制要求处理这类异常。 -
父类与子类抛异常
-
若父类方法并没有抛异常
a) 那么子类就重写父类方法就不可以抛出编译异常(IOException),可以抛运行时异常 -
子类重写方法的时候可以随时抛出运行时异常,包括空指针异常,数组越界异常等。
-
如果父类的方法抛出了一个异常,那么子类在方法重写的时候不能抛出比被重写方法
申明更加宽泛的编译时异常。使用接口也是一样的
io输入输出流
- 输入(input)是从硬盘读取到内存,是读数据
- 输出(output)是从内存写入到硬盘,是存数据
File类
- java.io.File 类用于表示文件(目录)
只用于表示文件的信息(名称 , 大小),不能访问文件内容 - File file = new File(“D:\java”);得用双斜杠
File file = new File(“D:\java” , “日记.txt”);1
File file = new File(“D:\java\日记.txt”);2
1 2 是一样的 - file.exists()查看目录是否存在 存在返回true
file.mkdir()创建一级目录 file.delete()删除目录,file.mkdirs()创建多级目录
file.isDirectory()判断是否为目录,是返回true
file.isFile()判断是否为文件
file.createNewFile()创建一个文件
字节流
- InputStream/OutputStream
- 是一个抽象类,所有输入输出类的超类
- 子类都以该类名作为后缀 - FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
- int read() 从此输入流中读取一个数据字节。
- int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 - FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
- void write(int b) 将指定字节写入此文件输出流。
- void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 - 必须需要 void close()
关闭此文件输入/出流并释放与此流有关的所有系统资源。 - 要想换行可添加\n windows 是\r\n Linux 是\n mac 是\r
- 追加写入 可在构造方法里加true
//文件复制模板
FileInputStream fis = new FileInputStream("D://aa.txt");
FileOutputStream fos = new FileOutputStream("D://a.txt");
byte[] bytes = new byte[1024];
int len;
while((len = fis.read(bytes))!=-1) {
fos.write(bytes,0,len);
}
fis.close();
fos.close();
-
这两个相当于修饰类,把一些方法封装,可以直接使用
DataInputStream
但是实例化对象时,需要DataInputStream dis = new DataInputStream(new FileInputStream(file));
DataOutputStream -
BufferedInputStream 带缓冲区 bis.flush刷新缓冲区
write使用和FileInputStream差不多,就是先把字节读入缓冲区,然后写入文件,提高io性能 -
字节流的copy 批量操作最快 就是从文件读取字节到字节数组,然后存入文件中比一个一个字节读取快,也比缓冲区读取快
字符流
-
字符流 = 字节流 + 编码表
-
储存为字节,怎么识别哪几个字节代表汉字?汉字的第一个字节都是负数,然后按照编码格式读取之后的字节,再拼接起来
-
编码表:一般会有ASCll(用于显示现代英语) GBxxx(主要是GBK(双字节),用来显示中文)系列 Unicode(统一码,都可以用,一般使用UTF-8,汉字是三字节,英语是单字节)
-
编码:byte[] getBytes();使用平台默认字符集编码,byte[] getBytes(String name)使用自己指定字符集编码。
-
解码:String(byte[] bytes);使用字符串的构造方法,平台默认字符集解码。String(byte[] bytes , String name)使用自己指定的字符集解码
-
Reader/Writer 是抽象类
-
子类有InputStreamReader/OutputStreamWriter
-
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
-
可以直接write(字符串);
-
FileReader / FileWriter 和上面的InputStreamReader一样 , 就是构造可以直接放file或者一个路径
没法加上文件编码,文件是utf-8你项目gbk就是乱码,没法修改,只能回归InputStreamReader -
字符的过滤器
- BufferedReader
readLine() 一次读一行 , 不能识别换行符,构造比较复杂,三层
- BuffeedWriter/PrintWrite —>写一行,也不能换行
newLine(); 写入一个行分隔符。
PrintWrite 构造更简单,可以文件名
PrintWriter(File file) 使用指定文件创建不具有自动行刷新的新 PrintWriter。
Println(line) 写一行,然后终止该行。
特殊输入流
- System.in 标准输入流,从键盘输入
- 自己实现从键盘录入:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- 别人的类:Scanner s = new Scanner(System.in);
- System.out.println一般是使用这个输出数据到控制台
- System.out本质是一个字节输出流,返回是一个PrintStream类的对象,而该类的爷爷类是OutputStream,父类是FileOutputStream
对象序列化流
-
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
-
学生类必须实现Serializable 接口 ,不需要重写方法
-
void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
反对象序列化流
- ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
- Object readObject() 从 ObjectInputStream 读取对象。
- 需要将Object强转成Student类型
集合
- 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
Collection
- JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如 Set 和 List)实现。
- 创建Collection集合的对象 , 需要多态的方式和一个具体的实现类
Collection<E> c = new ArrayList<E>();
- 也具有一些方法
- Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。 Iterator迭代器,集合专用遍历方法
- Iterator 是一个接口 常用方法:E next():返回迭代的下一个元素 boolean hasNext(): 判断有没有下一个元素
- 会返回一个实现类对象,就是Iterator接口的具体实现类。故是通过多态形式的
//以这种迭代器方式遍历集合
Iterator<E> it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
List
- 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
- 与 set 不同,列表通常允许重复的元素
- List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
- ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。
ArrayList
- 可调整大小的数组实现,是泛型
- ArrayList() 构造一个初始容量为 10 的空列表。
- boolean add(E e) 将指定的元素添加到此列表的尾部。
- void add(int index, E element) 将指定的元素插入此列表中的指定位置。
- void clear() 移除此列表中的所有元素。
- E remove(int index) 移除此列表中指定位置上的元素,返回被删除的元素
- boolean remove(Object o) 移除此列表中首次出现的指定元素(如果存在),返回删除是否成功
- E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素,返回被修改的元素
- int size() 返回此列表中的元素数。
- E get(int index) 返回此列表中指定位置上的元素。
- 底层实现是数组,查询快,增删慢
LinkedList
-
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
-
底层实现是链表,查询慢,增删慢
-
是List的具体实现类,所以一些方法是一样的。但是有因为是链表,所以还是有一些针对头尾节点的方法
-
void addFirst(E e) 将指定元素插入此列表的开头。
-
void addLast(E e) 将指定元素添加到此列表的结尾。
-
E getFirst() 返回此列表的第一个元素。
-
E getLast() 返回此列表的最后一个元素。
-
E removeFirst() 移除并返回此列表的第一个元素。
-
E removeLast() 移除并返回此列表的最后一个元素。
Set
- 一个不包含重复元素的 collection
- 没有带有索引的方法,不能使用普通for循环遍历
- 哈希值:是JDK根据对象的地址,字符串,或者数字算出来的int类型的数值
- Object类中有返回对象哈希值的方法,public int hashCode()返回该对象的哈希码值。同一个对象的哈希值是相同的,不是的话则不相同
HashSet
- 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
- 底层数据结构是哈希表,不保证存入和取出数据顺序相同,同时也具备Set的特点
- 哈希表:JDK8之前底层是使用链表+数组,可以说是一个元素为链表的数组。JDK8之后,在长度比较长时,实现了优化
- 首先是一个长度为16的数组,然后每个对象%16 余几就在几的位置。若余数相同,则比较哈希值,不一样的话在同一个位置开始产生链表。哈希值还一样,则比较内容。这样就保证了哈希表内容的不重复
TreeSet
- 使用元素的自然顺序(a-z)对元素进行排序,或者根据创建 set 时提供的 Comparator(自定义排序) 进行排序,具体取决于使用的构造方法
- TreeSet() 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
- TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
- 元素有序,但是不是根据存储的有序,而是根据一种指定的排序方式。
- 元素,不可重复。没有带索引的方法,不能使用普通for可以使用迭代器和foreach
Comparable 自然排序
- 你的学生类需要实现这个接口,得重写compareto()方法(只有这一个)
- int compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
- 每次使用add的时候就会比较一次,或者多次(猜的)
- (条件)?a:b 若条件满足,则为a,否则为b
Comparator 比较器排序
- 可以使用TreeSet的带参构造方法,TreeSet(Comparator<? super E> comparator)
- 需要的是一个实现Comparator接口的实现类。可以通过匿名内部类的方式搞
TreeSet(new Comparator<E>(){
public int compare(E e1 , E e2){
return 0;
}
})
Map
- public interface Map<K,V> K - 此映射所维护的键的类型,V - 映射值的类型,双列
- 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值。就是单射,一 一 对应
- V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 当Key第一次出现,用来添加元素。之后就是修改元素
- V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 根据建来删除元素
- boolean containsKey(Object key) 判断是否包括key
- boolean containsValue(Object value) 判断是否包含指定value
- boolean isEmpty() 判断是否为空
- V get(Object key) 根据key返回value
- Set keySet() 返回key的集合
- Collection values() 返回value的集合
- Set<Map.Entry<K,V>> entrySet() 返回键值对对象得集合
//第一种,遍历Map集合
Map<E><E> map = new Map<E><E>();
Set<E> keySet = map.keySet();
for(E key :keySet){
E value = map.get(key);
System.out.println(key +","+ value);
}
//第二种
Set<Map.Entry<K,V>> entrySet = new map. entrySet();
for(Map.Entry<K,V> me : entrySet ){
System.out.println(me.getKey() +"," + me.getValue() );
}
Collections
- 具体类,全是静态方法,针对集合操作的工具类
- static <T extends Comparable<? super T>> void sort(List list)
根据元素的自然顺序 对指定列表按升序进行排序。 - static void reverse(List<?> list) 反转指定列表中元素的顺序。
- static void shuffle(List<?> list) 使用默认随机源对指定列表进行置换。