Skip to content

Commit 3b6dfd1

Browse files
committed
updates
1 parent b785252 commit 3b6dfd1

14 files changed

+444
-4
lines changed
16.3 KB
Loading
40 KB
Loading

第6章 集合框架/集合框架.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
---
2+
typora-copy-images-to: images
3+
---
4+
15
# Java类中集合的关系图
26

37
![](http://img.blog.csdn.net/20161003151458688)
@@ -6,6 +10,8 @@
610

711
# 1. 集合类概述
812

13+
在程序中可以通过数组来保存多个对象,但在某些情况下开发人员无法预先确定需要保存对象的个数,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个学校的学生信息,由于不停有新生来报道,同时也有学生毕业离开学校,这时学生的数目就很难确定。为了在程序中可以保存这些数目不确定的对象,JDK中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,在Java中这些类被统称为集合。集合类都位于java.util包中,在使用时一定要注意导包的问题,否则会出现异常。
14+
915
## **1.1 为什么出现集合类?**
1016

1117
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
@@ -20,6 +26,8 @@
2026

2127
# **2. Collection接口概述**
2228

29+
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有ArrayList和LinkedList,Set接口的主要实现类有HashSet和TreeSet。
30+
2331
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
2432

2533
![](http://img.blog.csdn.net/20150827220241133)
@@ -135,6 +143,10 @@ public class MyStackDemo {
135143
- 哈希表依赖于哈希值存储
136144
- 添加功能底层依赖两个方法:int hashCode()、boolean equals(Object obj)
137145

146+
HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。整个存储的流程如下图所示。
147+
148+
![1500708070711](images/1500708070711.png)
149+
138150
HashSet存储元素保证唯一性的代码及图解:
139151

140152
![](http://img.blog.csdn.net/20150827220306728)
@@ -414,6 +426,16 @@ public class TreeSetDemo {
414426

415427
## **4.4 集合的遍历**
416428

429+
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口Iterator。Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。
430+
431+
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程,如下图所示。
432+
433+
![1500707872157](images/1500707872157.png)
434+
435+
图中,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next()方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext()方法返回false,表示到达了集合的末尾,终止对元素的遍历。
436+
437+
需要特别说明的是,当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当做Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换。
438+
417439
迭代:是取出集合中元素的一种方式。
418440

419441
而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都具有共性内容: 判断和取出。那么就可以将这些共性抽取。那么这些内部类都符合一个规则(或者说都抽取出来一个规则)。该规则就是Iterator。通过一个对外提供的方法:iterator();,来获取集合的取出对象。因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
@@ -491,9 +513,10 @@ public class ListIteratorDemo {
491513
}
492514
```
493515

494-
495516
# **5. Map接口概述**
496517

518+
Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,每个元素都包含一对键值,在使用Map集合时可以通过指定的Key找到对应的Value,例如根据一个学生的学号就可以找到对应的学生。Map接口的主要实现类有HashMap和TreeMap。
519+
497520
![map](http://img.blog.csdn.net/20150812154828706)
498521

499522
## **5.1 Map接口概述**

第7章 IO流/IO流之File类.md

Lines changed: 237 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
1+
---
2+
typora-copy-images-to: img
3+
---
4+
15
# **1. File类概述**
6+
7+
File类用于封装一个路径,这个路径可以是从系统盘符开始的绝对路径,如:“D:\file\a.txt”,也可以是相对于当前目录而言的相对路径,如:“src\Hello.java”。File类内部封装的路径可以指向一个文件,也可以指向一个目录,在File类中提供了针对这些文件或目录的一些常规操作。
8+
29
文件和目录路径名的抽象表示形式,表示一个文件或文件夹,并提供了一系列操作文件或文件夹的方法
10+
11+
File类中提供了一系列方法,用于操作其内部封装的路径指向的文件或者目录,例如判断文件/目录是否存在、创建、删除文件/目录等。
12+
13+
![1500708828607](img/1500708828607.png)
14+
315
# **2. 构造方法**
416
| 方法 | 功能描述 |
517
| :------------------------------- | :------------------- |
@@ -463,4 +475,228 @@ public class FileDeleteDemo {
463475

464476
运行结果:
465477

466-
![file](http://img.blog.csdn.net/20150812003454970)
478+
![file](http://img.blog.csdn.net/20150812003454970)
479+
480+
## 10.4 模拟文件管理器
481+
482+
DocumentManager
483+
484+
```java
485+
package cn.itcast.chapter07.task03;
486+
487+
import java.io.File;
488+
import java.util.ArrayList;
489+
import java.util.Scanner;
490+
491+
public class DocumentManager {
492+
public static void main(String[] args) throws Exception {
493+
Scanner sc = new Scanner(System.in);
494+
System.out.println("--1:指定关键字检索文件 2:指定后缀名检索文件 " + "3:复制文件/目录 4:退出--");
495+
while (true) {
496+
System.out.print("请输入指令:");
497+
int command = sc.nextInt();
498+
switch (command) {
499+
case 1:
500+
searchByKeyWorld();// 指定关键字检索文件
501+
break;
502+
case 2:
503+
searchBySuffix();// 指定后缀名检索文件
504+
break;
505+
case 3:
506+
copyDirectory();// 复制文件/目录
507+
break;
508+
case 4:
509+
exit();// 退出
510+
break;
511+
default:
512+
System.out.println("您输入的指令错误!");
513+
break;
514+
}
515+
}
516+
}
517+
518+
// *********1.指定关键字检索文件*********
519+
private static void searchByKeyWorld() {
520+
Scanner sc = new Scanner(System.in);
521+
System.out.print("请输入要检索的目录位置:");
522+
String path = sc.next();// 从控制台获取路径
523+
File file = new File(path);
524+
if (!file.exists() || !file.isDirectory()) {// 判断目录是否存在,是否是目录
525+
System.out.println(path + " (不是有效目录)");
526+
return;
527+
}
528+
System.out.print("请输入搜索关键字:");
529+
String key = sc.next();// 获取关键字
530+
// 在输入目录下获取所有包含关键字的文件路径
531+
ArrayList<String> list = FileUtils.listFiles(file, key);
532+
for (Object obj : list) {
533+
System.out.println(obj);// 将路径打印到控制台
534+
}
535+
}
536+
537+
// *********2.指定后缀名检索文件********//
538+
private static void searchBySuffix() {
539+
Scanner sc = new Scanner(System.in);
540+
System.out.print("请输入要检索的目录位置:");
541+
String path = sc.next();// 从控制台获取路径
542+
File file = new File(path);
543+
if (!file.exists() || !file.isDirectory()) {// 判断目录是否存在,是否是目录
544+
System.out.println(path + " (不是有效目录)");
545+
return;
546+
}
547+
System.out.print("请输入搜索后缀:");
548+
String suffix = sc.next();
549+
String[] suffixArray = suffix.split(",");// 获取后缀字符串
550+
// 在输入目录下获取所有指定后缀名的文件路径
551+
ArrayList<String> list = FileUtils.listFiles(file, suffixArray);
552+
for (Object obj : list) {
553+
System.out.println(obj);// 将路径打印到控制台
554+
}
555+
}
556+
557+
// *********3.复制文件/目录**********//
558+
private static void copyDirectory() throws Exception {
559+
Scanner sc = new Scanner(System.in);
560+
System.out.print("请输入源目录:");
561+
String srcDirectory = sc.next();// 从控制台获取源路径
562+
File srcFile = new File(srcDirectory);
563+
if (!srcFile.exists() || !srcFile.isDirectory()) {// 判断目录是否存在,是否是目录
564+
System.out.println("无效目录!");
565+
return;
566+
}
567+
System.out.print("请输入目标位置:");
568+
String destDirectory = sc.next();// 从控制台获取目标路径
569+
File destFile = new File(destDirectory);
570+
if (!destFile.exists() || !destFile.isDirectory()) {// 判断目录是否存在,是否是目录
571+
System.out.println("无效位置!");
572+
return;
573+
}
574+
// 将源路径中的内容复制到目标路径下
575+
FileUtils.copySrcPathToDestPath(srcFile, destFile);
576+
}
577+
578+
// *********4.退出**********//
579+
private static void exit() {
580+
System.out.println("您已退出系统,谢谢使用!");
581+
System.exit(0);
582+
}
583+
}
584+
```
585+
586+
FileUtils
587+
588+
```java
589+
package cn.itcast.chapter07.task03;
590+
591+
import java.io.File;
592+
import java.io.FileInputStream;
593+
import java.io.FileOutputStream;
594+
import java.io.FilenameFilter;
595+
import java.util.ArrayList;
596+
597+
public class FileUtils {
598+
/**
599+
* 指定关键字检索文件
600+
* @param file File对象
601+
* @param key 关键字
602+
* @return 包含关键字的文件路径
603+
*/
604+
public static ArrayList<String> listFiles(File file, final String key) {
605+
FilenameFilter filter = new FilenameFilter() { // 创建过滤器对象
606+
public boolean accept(File dir, String name) {// 实现accept()方法
607+
File currFile = new File(dir, name);
608+
// 如果文件名包含关键字返回true,否则返回false
609+
if (currFile.isFile() && name.contains(key)) {
610+
return true;
611+
}
612+
return false;
613+
}
614+
};
615+
// 递归方式获取规定的路径
616+
ArrayList<String> arraylist = fileDir(file, filter);
617+
return arraylist;
618+
}
619+
620+
/**
621+
* 指定后缀名检索文件
622+
* @param file File对象
623+
* @param suffixArray 后缀名数组
624+
* @return 指定后缀名的文件路径
625+
*/
626+
public static ArrayList<String> listFiles(File file,
627+
final String[] suffixArray) {
628+
FilenameFilter filter = new FilenameFilter() { // 创建过滤器对象
629+
public boolean accept(File dir, String name) {// 实现accept()方法
630+
File currFile = new File(dir, name);
631+
if (currFile.isFile()) {// 如果文件名以指定后缀名结尾返回true,否则返回false
632+
for (String suffix : suffixArray) {
633+
if (name.endsWith("." + suffix)) {
634+
return true;
635+
}
636+
}
637+
}
638+
return false;
639+
}
640+
};
641+
// 递归方式获取规定的路径
642+
ArrayList<String> arraylist = fileDir(file, filter);
643+
return arraylist;
644+
}
645+
646+
/**
647+
* 递归方式获取规定的路径
648+
* @param dir File对象
649+
* @param filter 过滤器
650+
* @return 过滤器过滤后的文件路径
651+
*/
652+
public static ArrayList<String> fileDir(File dir, FilenameFilter filter) {
653+
ArrayList<String> arraylist = new ArrayList<String>();
654+
File[] lists = dir.listFiles(filter); // 获得过滤后的所有文件数组
655+
for (File list : lists) {
656+
// 将文件的绝对路径放到集合中
657+
arraylist.add(list.getAbsolutePath());
658+
}
659+
File[] files = dir.listFiles(); // 获得当前目录下所有文件的数组
660+
for (File file : files) { // 遍历所有的子目录和文件
661+
if (file.isDirectory()) {
662+
// 如果是目录,递归调用fileDir()
663+
ArrayList<String> every = fileDir(file, filter);
664+
arraylist.addAll(every);// 将文件夹下的文件路径添加到集合中
665+
}
666+
}// 此时的集合中有当前目录下的文件路径,和当前目录的子目录下的文件路径
667+
return arraylist;
668+
}
669+
670+
/**
671+
* 复制文件/目录
672+
* @param srcFile 源目录
673+
* @param destFile 目标目录
674+
*/
675+
public static void copySrcPathToDestPath(File srcDir, File destDir)
676+
throws Exception {
677+
File[] files = srcDir.listFiles();// 子文件目录
678+
for (int i = 0; i < files.length; i++) {
679+
File copiedFile = new File(destDir, files[i].getName());// 创建指定目录的文件
680+
if (files[i].isDirectory()) {// 如果是目录
681+
if (!copiedFile.mkdirs()) {// 创建文件夹
682+
System.out.println("无法创建:" + copiedFile);
683+
return;
684+
}
685+
// 调用递归,获取子文件夹下的文件路径
686+
copySrcPathToDestPath(files[i], copiedFile);
687+
} else {// 复制文件
688+
FileInputStream input = new FileInputStream(files[i]);// 获取输入流
689+
FileOutputStream output = new FileOutputStream(copiedFile);// 获取输出流
690+
byte[] buffer = new byte[1024];// 创建缓冲区
691+
int n = 0;
692+
// 循环读取字节
693+
while ((n = input.read(buffer)) != -1) {
694+
output.write(buffer, 0, n);
695+
}
696+
input.close();// 关闭输入流
697+
output.close();// 关闭输出流
698+
}
699+
}
700+
}
701+
}
702+
```

0 commit comments

Comments
 (0)