Day20 队列,栈,Map集合,File文件操作
队列和栈
Queue和Deque
队列和栈的区别
队列:先进先出
栈:先进后出
队列(Queue)
因为队列也是继承Collection,所以集合中的add方法也可以用来添加元素,但是他还有一个自己的方法offer();
添加:add();
offer();该方法表示入队操作
poll();出队操作
peek();引用队首操作,不做出队操作:
QueueDemo
public class QueueDemo {
public static void main(String[] args) {
Queue<String> q=new LinkedList<String>();
q.offer("two");
q.offer("one");
q.offer("three");
System.out.println(q);
String s=q.poll();
System.out.println(s);
s=q.peek();
System.out.println(s);
System.out.println(q);
}
}
栈:先进后出
如子弹弹夹
push():入栈操作
pop():出栈操作
peek();栈首元素
DequeDemo
public class DequeDemo {
public static void main(String[] args) {
Deque<String> d=new LinkedList<String>();
d.push("one");
d.push("two");
d.push("three");
System.out.println(d);
d.pop();
System.out.println(d);
String s=d.peek();
System.out.println(s);
System.out.println(d);
}
}
Map集合
Map集合实际上就相当于是一个多行两列的表格
Map集合的最重要的特征就是里面都是以键-值对(key-value)的方式出现的
put(Object key,Object value):往Map集合添加值
get(Object key):通过key拿vallue值
remove(Object key):删除key的的键值对
remove(Object key,Object value):返回一个boolean值,如果为true就删除
注意:Map的键值对中,key是唯一的
Map<String,Integer> map=new HashMap<String, Integer>();
/**
*
*/
map.put("语文", 20);
map.put("数学", 50);
map.put("英语", 40);
map.put("美术", 50);
System.out.println(map);
Integer a=map.get("语文");
System.out.println(a);
map.remove("数学");
System.out.println(map);
boolean b=map.remove("美术", 50);
System.out.println(b);
System.out.println(map);
map.put("英语", 50);
System.out.println(map);
重写equals和hashCode
- 重写equals和hashCode方法
- -生成getter和setter:封装
- -重写toString:引用类型会继承父类object的toString方法,会得到一堆地址
- -重写equals和hashCode:
- 为什么重写equals?
- 当我们自己创建的类,在创建对象后,想比较这两个对象长得是否一样,就必须要重写equals,因为不重写,默认的就是调用父类Object中的equals方法,但是这个方法中实际比较的还是地址(使用==来进行比较)
- 为什么重写hashCode?
- 当一个类的对象作为map集合中的key值出现的时候,我们必须要在该类中同时重写equals和hashCode两个方法,因为map集合中的key值是通过equals比较为true,并且经过散列算法算出来的hashCode值来进行判定的,也就是说,equals比较为true,并且算出来的hashCode值也一样,才认定key值是一样的,如果只重写某一个方法,那么在经过散列算法之后,除了会认为key值不一样之外,还要可能参数链表形式的值,会严重影响查询效率
集合的遍历
三种遍历方式
Map集合的遍历:key-value
- 只遍历key值:set keySet():
- 遍历key-value键值对:Entry
- 只遍历value值
public class MapDemo2 {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<String, Integer>();
/**
* 第一种遍历方式:遍历key值
* set keySet():该方法会将所有的key值存放导一个Set集合中,因为key值是不允许重复的,所以刚好跟Set
* 集合的特点相契合
*/
map.put("语文", 20);
map.put("数学", 50);
map.put("英语", 40);
map.put("美术", 50);
Set<String> set=map.keySet();
for(String s:set){
System.out.println(s);//key值
System.out.println(map.get(s));//根据key值拿到value值
}
/**
* 第二种遍历方式:遍历key-value键值对
* Map集合中,在一个叫做Entry的类中维护了key-value键值对
* 这个实例对象中,封装了key和value两个属性
*/
Set<Map.Entry<String, Integer>> s1=map.entrySet();
for(Map.Entry<String, Integer> e:s1) {
String key=e.getKey();
Integer value=e.getValue();
System.out.println(key+":"+value);
}
/**
* 第三种:遍历value值
* Collection values :只获取到所有的value值,会返回一个Collection对象
*/
Collection<Integer> c=map.values();
for(Integer i:c) {
System.out.println(i);
}
}
}
MapDemo2L1
public class MapDemo2L1 {
public static void main(String[] args) {
Map<String, Map<String,Integer>> map2=new HashMap<String, Map<String,Integer>>();
Map<String,Integer> map3=new HashMap<String,Integer>();
map3.put("数学", 80);
map3.put("英语", 85);
map3.put("物理", 87);
map3.put("语文", 90);
map2.put("张三", map3);
System.out.println(map2);
Map<String,Integer> map4=new HashMap<String,Integer>();
map4.put("数学", 90);
map4.put("英语", 85);
map4.put("物理", 75);
map4.put("语文", 95);
map2.put("李四", map3);
System.out.println(map2);
//李四物理成绩
Set <String> s3=map2.keySet();
for(String s:s3) {
if("李四".equals(s)) {
Map<String,Integer> m=map2.get(s);//拿到李四的value值
Set<String> s2=m.keySet();
for(String ss:s2) {
if("物理".equals(ss)) {//找到key值是物理的
System.out.println(m.get(ss));
}
}
}
}
}
}
递归:方法当中自己调自己
-
使用递归必须要有结束的条件(实际上就是要有一个程序的出口)
-
重复的在干同样的一件事情,但是干的这件事情又受到之前的结果的影响
MapDemo2L2
public class MapDemo2L2 {
public static void main(String[] args) {
int num=print(20);
System.out.println(num);
}
public static int print(int num) {
if(num==1) {
return 1;
}
if(num==2) {
return 1;
}
return print(num-1)+print(num-2);
}
}
File:文件操作类
操作文件
创建一个操作文件的类的对象,该类中支持设置一个字符串,该字符串表示要操作的文件的路径
常见方法:
- exists():判断该文件是否存在,如果存在,则会返回true
- createNewFile():创建文件
- length():获取文件的大小(内容的字节数)
- isHidden():判断该文件是否为隐藏文件
- lastModified():获取文件的修改日期(返回毫秒值)
- isFile():判断file是否是一个文件
- isDirectory():判断file是否是一个目录(文件夹)
File.separator:会自动的根据操作系统来改变"\"的倾向
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* List(add(),set(),get())
* -ArrayList
* -LinkedList
* Set
* -HashSet
* MAP(put(),get()):遍历
* -HashMap
*File:文件操作类
*
*/
/**
*
* @author 30978
*
*/
public class FileDemo1 {
public static void main(String[] args) {
File file=new File("D:"+File.separator+"Demo.txt");
System.out.println(file);
boolean flag=file.exists();
System.out.println(flag);//已创建 true
//createNewFile():创建文件
if(!flag) {
try {
file.createNewFile();
}catch(IOException e){
e.printStackTrace();
}
System.out.println("创建文件成功");
}
//length():获取文件的大小(内容的字节数)
long l=file.length();
System.out.println(l);//38字节大小
//isHidden():判断该文件是否为隐藏文件
file.isHidden();
System.out.println(flag);//true
//lastModified():获取文件的修改日期(返回毫秒值)
l=file.lastModified();
System.out.println(l);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date=new Date();
date.setTime(l);
String str=sdf.format(date);
System.out.println(str);
//isFile():判断file是否是一个文件
flag=file.isFile();
System.out.println(flag);
//isDirectory():判断file是否是一个目录(文件夹)
flag=file.isDirectory();
System.out.println(flag);
}
}
操作目录
-
mkdir:创建目录
-
mkdirs:创建多级目录
-
获取指定目录的所有的子项
- listFiles():获取所有的子项(文件和目录)
- listFiles(FilerFilter f):用来过滤子项的方法
.:表示的是获取当前目录的根目录
文件及目录的删除:
delete():可以用来删除文件和空目录
FileDemo3
/**
* 文件及目录的删除:
delete():可以用来删除文件和空目录
* @author 30978
*
*/
public class FileDemo3 {
public static void main(String[] args) {
File file=new File("D:"+File.separator+"AN");
deleteFile(file);
System.out.println("删除成功");
}
/**
* 创建一个方法专门用来删除多级目录
*/
public static void deleteFile(File file) {
//1.判断该file是不是一个目录
//2.如果是文件则直接删除,如果是目录,则再获取目录中的所有子项
if(file.isDirectory()) {//如果是目录
File[] f=file.listFiles();//获取所有子项
for(File ff:f) {
deleteFile(ff);
}
}
file.delete();//如果是文件,则直接删除
}
/**
* 创建一个多级目录a/b/c/d
* 1.往b目录下面创建一个demo.txt目录
* 2.往c目录中创建一个demo.txt文件
* 3.删除b目录下面所有的东西
*/
}