我的java基础太差了
一、集合进阶
1.1 单列集合-List

List系列集合添加的元素都是有序、可重复、有索引的
set系列集合添加的元素是无序,不重复,无索引的
1.1.1 Collection集合
collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。

Collection<String> coll = new ArrayList<>(); coll.add("XXX");
|
contains小知识点
当集合中插入的是对象使用对象来做比较哦是无法比对成功的,需要重写equals方法
1.1.1.1 Collection的遍历方式
迭代器遍历
迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式。

Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd");
Iterator<String> it = coll.iterator();
while(it.hasNext()) { String str = it.next(); System.out.println(str); }
|
- 报错NoSuchElementException
- 迭代器遍历完毕,指针不会复位
- 循环中只能用一次next方法
- 迭代器遍历时,不能用集合的方法进行增加或者删除
增强for遍历
- 增强for的底层就是迭代器,为了简化迭代器的代码书写的。
- 它是JDK5之后出现的,其内部原理就是一个lterator迭代器
- 所有的单列集合和数组才能用增强for进行遍历。
格式
for(元素的数据类型 变量名: 数组或者集合){
}
Collection<String> coll = new ArrayList<>(); coll.add("zhangsan"); coll.add("lisi"); coll.add("wangwu");
for (String s : coll) { System.out.println(s); }
|
lambda表达式
Collection<String> coll = new ArrayList<>(); coll.add("zhangsan"); coll.add("lisi"); coll.add("wangwu");
coll.forEach(System.out::println);
|
1.1.2 List集合
- collection的方法List都继承了
- List集合因为有索引,所以多了很多索引操作的方法。
| 方法名称 | 说明 |
|---|
| void add(int index, E element) | 在此集合中的指定位置插入指定的元素 |
| E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
| E set(int index, E element) | 修改指定索引处的元素,返回被修改的元素 |
| E get(int index) | 返回指定索引处的元素 |
List<String> list = new ArrayList<>();
list.add("aaa"); list.add("bbb"); list.add("ccc");
String result = list.set(0, "QQQ"); System.out.println(result);
System.out.println(list);
|
遍历
与上方Collection遍历一致
列表迭代器
ListIterator<String> it = list.listIterator(); while(it.hasNext()){ String str = it.next(); if("bbb".equals(str)){ it.add("qqq"); } }
|

1.1.3 ArrayList
扩容机制:
- 利用空参创建的集合,在底层创建一个默认长度为0的数组
- 添加第一个元素时,底层会创建一个新的长度为10的数组
- 存满时,会扩容1.5倍
- 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
这个1.5倍是相对与当前长度的1.5倍哦,比如现在长度是15了,再扩容就是15+(15*0.5)(向下取整)=22

1.1.4 LinkedList集合·

1.1.5 泛型
泛型方法
只能在本方法上使用
泛型接口:
- 什么是泛型?
- JDK5引入的特性,可以在编译阶段约束操作的数据类型,并进行检查
- 泛型的好处?
- 统一数据类型
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
泛型的细节?
哪里定义泛型?
- 泛型的继承和通配符
- 泛型不具备继承性,但是数据具备继承性
- 泛型的通配符:?
- ? extend E
- ? super E
- 使用场景
- 定义类、方法、接口的时候,如果类型不确定,就可以定义泛型
- 如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符
1.2 树
1.2.1 红黑树
- 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
- 1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的”红黑树”。
- 它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,
- 每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过”红黑规则”进行实现的
红黑规则
- 每一个节点或是红色的,或者是黑色的
- 根节点必须是黑色
- 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
- 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
- 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
红黑树默认为红色

1.3 单列集合-Set
无序、不重复、无索引
HashSet:无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
Treeset:可排序、不重复、无索引
import java.util.HashSet; import java.util.Iterator; import java.util.Set;
public class SetExample { public static void main(String[] args) { Set<String> s = new HashSet<>();
s.add("张三"); s.add("张三"); s.add("李四"); s.add("王五");
System.out.println(s);
Iterator<String> it = s.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); }
System.out.println("增强for循环遍历:"); for (String str : s) { System.out.println(str); }
System.out.println("Lambda 表达式遍历:"); s.forEach(str -> System.out.println(str));
System.out.println("方法引用遍历:"); s.forEach(System.out::println); } }
|
1.3.1 HashSet
HashSet底层原理
- Hashset集合底层采取哈希表存储数据
- 哈希表是一种对于增删改查数据性能都较好的结构
哈希表的组成
JDK8开始:数组+链表+红黑树
哈希值
- 根据hashcode方法算出来的int类型的整数
- 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
- 一般情况下,会重写hashcode方法,利用对象内部的属性值计算哈希值
对象的哈希值特点:
- 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
- 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
- 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
示例
@Data public class Student{ private String name; private int age; }
|
Student s1 = new Student("zhangsan", 23); Student s2 = new Student("zhangsan", 23);
System.out.println(s1.hashCode()); System.out.println(s2.hashCode());
|
底层原理
- 创建一个默认长度16,默认加载因为0.75的数组,数组名table
- 根据元素的哈希值跟数组的长度计算出应存入的位置
- 判断当前位置是否为null,如果是null直接存入
- 如果位置不为null,表示有元素,则调用equals方法比较属性值
- 一样:不存不一样:存入数组,形成链表
JDK8以前:新元素存入数组,老元素挂在新元素下面JDK8以后:新元素直接挂在老元素下面

JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树
如果集合中存储的是自定义对象,必须要重写hashCode和equals方法
1.3.2 LinkedHashSet
- 有序、不重复、无索引。
- 这里的有序指的是保证存储和取出的元素顺序一致
- 原理∶底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。

效率较低
1.3.3 TreeSet
- 有序、不重复、无索引。
- 默认从小到大排序
- 底层基于红黑树实现排序,增删改查性能较好
TreeSet集合自定义规则有几种方式
- 方式一: Javabean类实现Comparable接口,指定比较规则
- 方式二:创建集合时,自定义Comparator比较器对象,指定比较规则
方法的返回值的特点
- 负数:表示当前要添加的元素是小的,存左边
- 正数:表示当前要添加的元素是大的,存右边
- 0:表示当前要添加的元素已经存在,舍弃
import java.util.Iterator; import java.util.TreeSet;
public class TreeSetDemo { public static void main(String[] args) { TreeSet<Integer> ts = new TreeSet<>();
ts.add(4); ts.add(5); ts.add(1); ts.add(3); ts.add(2);
Iterator<Integer> it = ts.iterator(); while (it.hasNext()) { int i = it.next(); System.out.println(i); }
for (Integer num : ts) { System.out.println(num); }
ts.forEach(num -> System.out.println(num)); } }
|
方式1:Comparable
实现类中去实现comparable接口,重写里面的抽象方法,再制定规则
public class Student implements Comparable<Student> { private String name; private int age;
public Student() { }
public Student(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override public int compareTo(Student other) { return Integer.compare(this.age, other.age); }
@Override public String toString() { return "Student{name='" + name + '\'' + ", age=" + age + '}'; } }
|
底层使用的是红黑树
方式二:比较器排序
方式一不满足我们的需求时才需要使用比较器
import java.util.Comparator; import java.util.TreeSet;
public class TreeSetComparatorDemo { public static void main(String[] args) { TreeSet<String> ts = new TreeSet<>((o1, o2) -> { int i = o1.length() - o2.length(); return i == 0 ? o1.compareTo(o2) : i; });
ts.add("apple"); ts.add("banana"); ts.add("pear"); ts.add("grape"); ts.add("kiwi"); ts.add("orange");
System.out.println(ts); } }
|
1.4 单列集合的使用场景
- 如果想要集合中的元素可重复
- 用ArrayList集合,基于数组的。(用的最多)
- 如果想要集合中的元素可重复,而且当前的增删操作明显多于查询
- 如果想对集合中的元素去重
- 如果想对集合中的元素去重,而且保证存取顺序
- 用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet。
- 如果想对集合中的元素进行排序
- 用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。
1.5 双列集合-Map
- 双列集合一次需要存一对数据,分别为键和值
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键只能找到自己对应的值
- 键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”

1.5.1 Map的常见API
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
| 方法名称 | 说明 |
|---|
| V put(K key, V value) | 添加元素 |
| V remove(Object key) | 根据键删除键值对元素 |
| void clear() | 移除所有的键值对元素 |
| boolean containsKey(Object key) | 判断集合是否包含指定的键 |
| boolean containsValue(Object value) | 判断集合是否包含指定的值 |
| boolean isEmpty() | 判断集合是否为空 |
| int size() | 集合的长度,也就是集合中键值对的个数 |
使用方式
Map<String, String> m = new HashMap<>();
m.put("郭靖", "黄蓉"); m.put("韦小宝", "沐剑屏"); m.put("尹志平", "小龙女");
String value = m.put("韦小宝", "双儿"); System.out.println(value);
String result = m.remove( key:"郭靖");
m.clear();
boolean keyResult = m.containsKey("郭靖"); System.out.println(keyResult);
boolean valueResult = m.containsValue("小龙女2"); System.out.println(valueResult);
boolean result = m.isEmpty(); System.out.println(result);
int size = m.size(); System.out.println(size);
System.out.println(m);
|
遍历方式
方式一:键找值
public class A02_MapDemo2 { public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("尹志平", "小龙女"); map.put("郭靖", "穆念慈"); map.put("欧阳克", "黄蓉");
Set<String> keys = map.keySet();
for (String key : keys) { String value = map.get(key); System.out.println(key + " = " + value); } Iterator<String> iterator = keys.iterator(); while (iterator.hasNext()) { String key = iterator.next(); String value = map.get(key); System.out.println(key + " = " + value); } keys.forEach(key -> { String value = map.get(key); System.out.println(key + " = " + value); }); } }
|
方式二:键值对遍历
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("标枪连手", "马超"); map.put("人物挂件", "明世隐"); map.put("御龙骑士", "尹志平");
Set<Map.Entry<String, String>> entries = map.entrySet();
Set<Map.Entry<String, String>> entries = map.entrySet(); for (Map.Entry<String, String> entry : entries) { String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " = " + value); } Iterator<Map.Entry<String,String>> iterator = entries.iterator(); while(iterator.hasNext()) { Map.Entry<String,String> entry = iterator.next(); System.out.println(entry.getKey() + " = " + entry.getValue()); } entries.forEach(entry -> { System.out.println(entry.getKey() + " = " + entry.getValue()); }); }
|
方法三:Lambda表达式遍历
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("鲁迅", "这句话是我说的"); map.put("曹操", "不可能绝对不可能"); map.put("刘备", "接着奏乐接着舞"); map.put("柯镇恶", "看我眼色行事");
map.forEach((key, value) -> System.out.println(key + " = " + value)); }
|
1.5.2 HashMap
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键存储的是自定义对象,需要重写hashcode和equals方法如果值存储自定义对象,不需要重写hashCode和equals方法
案例1:
需求:创建一个HashMap集合,是公生对象(Student),值是籍贯(String)。
存储三个键值对元素,并遍历
要求:同姓名,同年龄认为是同一个学生
@Data public class Student{ private String name; private int age; }
|
public class hashDemo{ public static void main(String[] args){ HashMap<Student,String> hm new HashMap<>(); Student s1 = new Student("zhangsan", 23); Student s2 = new Student("lisi", 24); Student s3 = new Student("wangwu", 25); Map<Student, String> hm = new HashMap<>(); hm.put(s1, "江苏"); hm.put(s2, "浙江"); hm.put(s3, "福建"); Set<Student> keys = hm.keySet(); for (Student key : keys) { String value = hm.get(key); System.out.println(key + "=" + value); }
System.out.println("----------------------------");
Set<Map.Entry<Student, String>> entries = hm.entrySet(); for (Map.Entry<Student, String> entry : entries) { Student key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "=" + value); } hm.forEach((Student,s)->System.out.println(student,s)) } }
|
1.5.3 LinkedhashMap
- 由键决定:有序、不重复、无索引。
- 这里的有序指的是保证存储和取出的元素顺序一致
- 原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();
lhm.put("c", 789); lhm.put("b", 456); lhm.put("a", 123); lhm.put("a", 111);
System.out.println(lhm);
|
1.5.4 TreeMap
- TreeMap跟TreeSet底层原理一样,都是红黑树结构的。
- 由键决定特性:不重复、无索引、可排序
- 可排序:对键进行排序。
- 注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则
1.6 Collections
- java.util.Collections:是集合工具类
- 作用:Collections不是集合,而是集合的工具类。
| 方法名称 | 说明 |
|---|
| public staticboolean addAll(Collectionc, T… elements) | 批量添加元素 |
| public static void shuffle(List<?> list) | 打乱List集合元素的顺序 |
| public staticvoid sort(Listlist) | 排序 |
| public staticvoid sort(Listlist, Comparatorc) | 根据指定的规则进行排序 |
| public staticint binarySearch(Listlist, T key) | 以二分查找法查找元素 |
| public staticvoid copy(Listdest, Listsrc) | 拷贝集合中的元素 |
| public staticint fill(Listlist, T obj) | 使用指定的元素填充集合 |
| public staticvoid max/min(Collectioncoll) | 根据默认的自然排序获取最大/小值 |
| public staticvoid swap(List<?> list, int i, int j) | 交换集合中指定位置的元素 |
import java.util.*;
public class CollectionsExample { public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asList(10, 1, 2, 4, 8, 5, 9, 6, 7, 3));
Collections.shuffle(list); System.out.println("shuffle后: " + list);
Collections.sort(list); System.out.println("sort后: " + list);
Collections.sort(list, (a, b) -> b - a); System.out.println("sort(降序)后: " + list);
Collections.sort(list); int index = Collections.binarySearch(list, 5); System.out.println("元素5的位置: " + index);
List<Integer> dest = new ArrayList<>(Collections.nCopies(list.size(), 0)); Collections.copy(dest, list); System.out.println("copy后dest: " + dest);
Collections.fill(dest, 100); System.out.println("fill后dest: " + dest);
int max = Collections.max(list); int min = Collections.min(list); System.out.println("最大值: " + max + ", 最小值: " + min);
Collections.swap(list, 0, list.size() - 1); System.out.println("swap后list: " + list); } }
|
1.7 不可变集合
不可以被修改的集合,长度和内容都不可被修改
1.7.1 代码格式
在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。
| 方法名称 | 说明 |
|---|
| staticListof(E…elements) | 创建一个具有指定元素的List集合对象 |
| staticSetof(E…elements) | 创建一个具有指定元素的Set集合对象 |
| staticMapof(E…elements) | 创建一个具有指定元素的Map集合对象 |
注意: 这个集合不能添加,不能删除,不能修改
List<String> list = List.of("张三", "李四", "王五", "赵六");
System.out.println(list.get(0)); System.out.println(list.get(1)); System.out.println(list.get(2)); System.out.println(list.get(3));
for (String s : list) { System.out.println(s); }
System.out.println("--------------------------");
Iterator<String> it = list.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); } System.out.println("--------------------------");
|
可变Map集合
import java.util.Map; import java.util.HashMap;
public class ImmutableDemo {
public static void main(String[] args) { HashMap<String, String> hm = new HashMap<>(); hm.put("郑十", "苏州"); hm.put("刘一", "无锡"); hm.put("陈二", "嘉兴"); hm.put("aaa", "111");
Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
map.forEach((key, value) -> System.out.println(key + " -> " + value)); } }
|
总结
- 不可变集合的特点?
● 定义完成后不可以修改,或者添加、删除 - 如何创建不可变集合?
● List、Set、Map接口中,都存在of方法可以创建不可变集合 - 三种方式的细节
● List:直接用
● Set:元素不能重复
● Map:元素不能重复、键值对数量最多是10个。
超过10个用ofEntries方法
1.8 Stream流
1.8.1 流的开始
先得到一条Stream流(流水线),并把数据放上去
| 获取方式 | 方法名 | 说明 |
|---|
| 单列集合 | default Streamstream() | Collection中的默认方法 |
| 双列集合 | 无 | 无法直接使用stream流 |
| 数组 | public staticStreamstream(T[] array) | Arrays工具类中的静态方法 |
| 一堆零散数据 | public staticStreamof(T… values) | Stream接口中的静态方法 |
双列集合获取Stream流的方式
import java.util.HashMap;
public class StreamDemo3 { public static void main(String[] args) { HashMap<String, Integer> hm = new HashMap<>();
hm.put("aaa", 111); hm.put("bbb", 222); hm.put("ccc", 333); hm.put("ddd", 444);
hm.entrySet().stream().forEach(s -> System.out.println(s)); } }
|
数组方式获取Stream流集合
import java.util.Arrays;
public class StreamDemo4 { public static void main(String[] args) { int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; String[] arr2 = {"a", "b", "c"};
Arrays.stream(arr1).forEach(s -> System.out.println(s));
System.out.println("==========================");
Arrays.stream(arr2).forEach(s -> System.out.println(s)); } }
|
1.8.2 流的中间操作
| 名称 | 说明 |
|---|
| Streamfilter(Predicate<? super T> predicate) | 过滤 |
| Streamlimit(long maxSize) | 获取前几个元素 |
| Streamskip(long n) | 跳过前几个元素 |
| Streamdistinct() | 元素去重,依赖(hashCode和equals方法) |
| staticStreamconcat(Stream a, Stream b) | 合并a和b两个流为一个流 |
| Streammap(Functionmapper) | 转换流中的数据类型 |
1.8.3 终结方法
| 名称 | 说明 |
|---|
| void forEach(Consumer action) | 遍历 |
| long count() | 统计 |
| toArray() | 收集流中的数据,放到数组中 |
| collect(Collector collector) | 收集流中的数据,放到集合中 |
1.8.4 Collections收集方法
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors;
public class StreamDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "张无忌-男-15", "张无忌-男-15", "周芷若-女-14", "赵敏-女-13", "张强-男-20", "张三丰-男-100", "张翠山-男-40", "张良-男-35", "王二麻子-男-37", "谢广坤-男-41");
List<String> newList1 = list.stream() .filter(s -> "男".equals(s.split("-")[1])) .collect(Collectors.toList());
System.out.println("收集到List中的男性(允许重复): " + newList1); System.out.println("=========================================");
Set<String> newList2 = list.stream() .filter(s -> "男".equals(s.split("-")[1])) .collect(Collectors.toSet());
System.out.println("收集到Set中的男性(自动去重): " + newList2); } Map<String, String> nameToAgeMap = list.stream() .filter(s -> "男".equals(s.split("-")[1])) .collect(Collectors.toMap( s -> s.split("-")[0], s -> s.split("-")[2], (oldVal, newVal) -> oldVal )); System.out.println("姓名 -> 年龄 (男性): " + nameToAgeMap);
}
|
1.8.5 方法引用
- 引用处需要是函数式接口.
- 被引用的方法需要已经存在
- .被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致.
- 被引用方法的功能需要满足当前的要求
引用静态方法
格式:类名::静态方法
范例:Integer : :parseInt
ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "1", "2", "3", "4", "5");
list.stream() .map(Integer::parseInt) .forEach(s -> System.out.println(s));
|
引用其他类中的成员变量
格式: 其他类对象::方法名
ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");
list.stream() .filter(new FunctionDemo3()::stringJudge) .forEach(s -> System.out.println(s));
public boolean stringJudge(String s){ return s.startsWith("张") && s.length() == 3; }
|
引用本类或父类成员方法
本类:this::方法名
父类:super::方法名
注意:引用处不能是静态方法
引用构造方法
格式:类名::new
范例:student : :new
二、异常
Exception:叫做异常,代表程序可能出现的问题。
我们通常会用Exception以及他的子类来封装程序出现的问题。
运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。
运行时出现的异常(如:数组索引越界异常)
编译时异常:编译阶段就会出现异常提醒的。(如:日期解析异常)
| 方法名称 | 说明 |
|---|
| public String getMessage() | 返回此 throwable 的详细消息字符串 |
| public String toString() | 返回此可抛出的简短描述 |
| public void printStackTrace() | 把异常的错误信息输出在控制台 |
三、File
| 方法名称 | 说明 |
|---|
| public File(String pathname) | 根据文件路径创建文件对象 |
| public File(String parent, String child) | 根据父路径名称字符串和子路径名称字符串创建文件对象 |
| public File(File parent, String child) | 根据父路径对应文件对象和子路径名称字符串创建文件对象 |
3.1 常见方法(判断、获取)
| 方法名称 | 说明 |
|---|
| public boolean isDirectory() | 判断此路径名表示的File是否为文件夹 |
| public boolean isFile() | 判断此路径名表示的File是否为文件 |
| public boolean exists() | 判断此路径名表示的File是否存在 |
| public long length() | 返回文件的大小(字节数量) |
| public String getAbsolutePath() | 返回文件的绝对路径 |
| public String getPath() | 返回定义文件时使用的路径 |
| public String getName() | 返回文件的名称,带后缀 |
| public long lastModified() | 返回文件的最后修改时间(时间毫秒值) |
3.2 常见方法(创建、删除)
| 方法名称 | 说明 |
|---|
| public boolean createNewFile() | 创建一个新的空的文件 |
| public boolean mkdir() | 创建单级文件夹 |
| public boolean mkdirs() | 创建多级文件夹 |
| public boolean delete() | 删除文件、空文件夹 |
File f1 = new File("D:\\aaa\\ddd\\a.txt"); boolean b = f1.createNewFile(); System.out.println(b);
|
3.3 File的常见成员方法(获取并且遍历)
| 方法名称 | 说明 |
|---|
| public File[] listFiles() | 获取当前该路径下所有内容 |
范例
import java.io.File;
public class Test2 { public static void main(String[] args) {
File file = new File("D:\\aaa"); boolean b = haveAVI(file); System.out.println(b); }
public static boolean haveAVI(File file) { File[] files = file.listFiles();
for (File f : files) { if (f.getName().endsWith(".avi")) { return true; } } return false; } }
|
四、IO流
4.1 字节写数据
一次写一个
FileOutputStream fos = new FileOutputStream("myio\\a.txt");
fos.write(57); fos.write(55);
fos.close();
|
一次写多个
import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays;
public class WriteExamples { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("myio\\example.txt");
fos.write(65);
byte[] bytes = {66, 67, 68}; fos.write(bytes);
byte[] moreBytes = {69, 70, 71, 72, 73}; fos.write(moreBytes, 1, 3);
fos.close(); } }
|
五、多线程
5.1 什么是多线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
并发:在同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在多个CPU上同时执行
5.2 多线程的实现方式
5.2.1 继承Thread类的方式进行实现
package com.itheima.a01threadcase1;
public class ThreadDemo { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); t1.setName("线程1"); t2.setName("线程2"); t1.start(); t2.start(); } }
|
package com.itheima.a01threadcase1;
public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + "HelloWorld"); } } }
|
5.2.2 实现Runnable接口的方式进行实现
package com.itheima.a02threadcase2;
public class ThreadDemo { public static void main(String[] args) { MyRun mr = new MyRun(); Thread t1 = new Thread(mr); Thread t2 = new Thread(mr); t1.setName("线程1"); t2.setName("线程2"); t1.start(); t2.start(); } }
|
package com.itheima.a02threadcase2;
public class MyRun implements Runnable { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "HelloWorld!"); } } }
|
5.2.3
六、反射
反射允许对成员变量,成员方法和构造方法的信息进行编程访问