Day20 队列,栈,Map集合,File文件操作

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));
				}
			}
		}
		
	}
   }
}

递归:方法当中自己调自己

  1. 使用递归必须要有结束的条件(实际上就是要有一个程序的出口)

  2. 重复的在干同样的一件事情,但是干的这件事情又受到之前的结果的影响

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:文件操作类

操作文件

创建一个操作文件的类的对象,该类中支持设置一个字符串,该字符串表示要操作的文件的路径

常见方法:

  1. exists():判断该文件是否存在,如果存在,则会返回true
  2. createNewFile():创建文件
  3. length():获取文件的大小(内容的字节数)
  4. isHidden():判断该文件是否为隐藏文件
  5. lastModified():获取文件的修改日期(返回毫秒值)
  6. isFile():判断file是否是一个文件
  7. 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);
  }  
}

操作目录

  1. mkdir:创建目录

  2. mkdirs:创建多级目录

  3. 获取指定目录的所有的子项

    • 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目录下面所有的东西
    */
}
上一篇:day20.线程2


下一篇:java学习笔记 day20