javaSE(八)

版权声明:博主原创,转发请私信。 https://blog.csdn.net/YooFale/article/details/82938871

1.HashSet

在父类AbstractCollection中重写了toString方法。

原理:

当HashSet使用add()方法存储对象的时候,先调用对象的hashCode()方法得到一个哈希值,然后在集合中查找是否有哈希值相同的对象,如果没有就直接存入集合,如果有就调用equals()方法进行比较,如果是true,就不存入,false就存入集合中。

自定义对象存入集合中如何去重?

自定义对象必须重写hashCode和equals方法。

hashCode:属性相同的对象返回值必须相同,属性值不同的对象返回值尽量不同。

equals:返回值是true就不存储,返回值是false再存储。

一般自动生成hashCode和toString方法。

主要需要重写:

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

为什么prime给的值是31?

1.是质数,除了1只能被自己整除。

2.不大不小,太大会超过int取值范围,太小会容易被重复。

3.好算,2的五次方减一。

2.LinkedHashSet

底层是链表实现的,是Set集合中唯一一个能保证存取顺序一致的对象。同时因为是hashSet的子类,所以也是保证元素唯一的。

但是效率相比其他会略低一点。

3.TreeSet

TreeSet主要用于排序,按照规定的顺序进行排序,同时还能保证元素的唯一性。

javabean中需要实现comparable接口,重写compareTo方法。

返回值为0,只有一个元素,返回值为正数,输入输出顺序相同,返回值为负数,倒序输出。

compareTo返回结果产生影响的原因?

二叉树结构,左小右大。在存储的时候,正数是大于,在右边存储,从小取到大就是依次取出。0是等于,不存,所以只有一个。

负数是小于,存储的数越来越小,从小到大取就是倒序。

4.TreeSet的两种排序

TreeSet自然排序,依赖于javabean中的compareTo方法,首先javabean实现了compareable接口,所以需要重写compareTo方法,compareTo重写如下:

@Override
	public int compareTo(Person o) {
		int length = this.name.length() - o.name.length();// 姓名长度为主
		int num = length == 0 ? this.name.compareTo(o.name) : length;// 姓名为主
		return num == 0 ? this.age - o.age : num;// 年龄为主
	}

	// @Override
	// public int compareTo(Person o) {
	// int to = this.name.compareTo(o.name); // 姓名为主
	// return to == 0 ? this.age - o.age : to; // 年龄为主
	// }

	// @Override
	// public int compareTo(Person o) {
	// int num = this.age - o.age; //年龄为主
	// return num == 0 ? this.name.compareTo(o.name) : num; //姓名为主
	// }

分别是依照不同标准,多次使用三元运算符进行比较。

TreeSet比较器排序,实现按照字符串长度排序。

public class Demo3_TreeSet {

	public static void main(String[] args) {
		// demo1();
		// demo2();
		// demo3();
		TreeSet<String> treeSet = new TreeSet<>(new compareByLen());
		treeSet.add("aaaaa");
		treeSet.add("kfc");
		treeSet.add("cba");
		treeSet.add("nba");
		treeSet.add("z");
		System.out.println(treeSet);
	}

	public static void demo3() {
		TreeSet<Person> treeSet = new TreeSet<>();
		treeSet.add(new Person("aaaa", 15));
		treeSet.add(new Person("adid", 15));
		treeSet.add(new Person("aaaaa", 15));
		treeSet.add(new Person("aaaaaa", 25));
		treeSet.add(new Person("aaaaaa", 18));
		System.out.println(treeSet);
	}

	public static void demo2() {
		// 测试比较姓名和年龄
		TreeSet<Person> treeSet = new TreeSet<>();
		treeSet.add(new Person("张三", 12));
		treeSet.add(new Person("李四", 16));
		treeSet.add(new Person("王五", 16));
		treeSet.add(new Person("赵六", 15));
		treeSet.add(new Person("胡七", 17));
		System.out.println(treeSet);
	}

	public static void demo1() {
		TreeSet<String> treeSet = new TreeSet<>();
		treeSet.add("a");
		treeSet.add("a");
		treeSet.add("b");
		treeSet.add("c");
		treeSet.add("d");
		System.out.println(treeSet);
	}

}

class compareByLen implements Comparator<String> {
	@Override
	public int compare(String s1, String s2) {
		int num = s1.length() - s2.length();
		return num == 0 ? s1.compareTo(s2) : num;
	}

}

最下方的类实现了comparator接口,需要重写里面的两个方法,但是以为compareByLen是Object的子类,Object中已经有了equals方法,所以相当于重写过了一个,只用重写另一个。用comparator实现只需要在新建treeset的时候将实现comparator接口的子类传入就可以了。

TreeSet的自然排序和比较器排序,有比较器排序优先比较器排序。

5.Set在实际需求中的应用

一般要求中有去处重复就使用HashSet.

留下重复但是排序的就是用TreeSet,实现代码如下:

	public static void sort(List<String> list) {
		//1,创建TreeSet集合对象,因为String本身就具备比较功能,但是重复不会保留,所以我们用比较器
		TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {

			@Override
			public int compare(String s1, String s2) {
				int num = s1.compareTo(s2);					//比较内容为主要条件
				return num == 0 ? 1 : num;					//保留重复
			}
		});

确保其相等的时候也不返回0即可

 程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.

案例代码:

public class Test6 {

	/**
	 * 程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.
	 * 
	 * 1,创建Scanner对象,键盘录入
	 * 2,创建TreeSet集合对象,TreeSet集合中传入比较器
	 * 3,无限循环不断接收整数,遇到quit退出,因为退出是quit,所以键盘录入的时候应该都以字符串的形式录入
	 * 4,判断是quit就退出,不是将其转换为Integer,并添加到集合中
	 * 5,遍历TreeSet集合并打印每一个元素
	 */
	public static void main(String[] args) {
		//1,创建Scanner对象,键盘录入
		Scanner sc = new Scanner(System.in);
		//2,创建TreeSet集合对象,TreeSet集合中传入比较器
		TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer i1, Integer i2) {
				//int num = i2 - i1;					//自动拆箱
				int num = i2.compareTo(i1);
				return num == 0 ? 1 : num;
			}
		});
		//3,无限循环不断接收整数,遇到quit退出,因为退出是quit,所以键盘录入的时候应该都以字符串的形式录入
		while(true) {
			String line = sc.nextLine();				//将键盘录入的字符串存储在line中
			if("quit".equals(line)) {
				break;
			}
			//4,判断是quit就退出,不是将其转换为Integer,并添加到集合中
			Integer i = Integer.parseInt(line);
			ts.add(i);
		}
		
		// 5,遍历TreeSet集合并打印每一个元素
		for (Integer integer : ts) {
			System.out.println(integer);
		}
	}

}

需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。

javabean代码:

package com.heima.bean;

public class Student {
	private String name;
	private int math;
	private int chinese;
	private int english;
	private int num;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(String name, int math, int chinese, int english) {
		super();
		this.name = name;
		this.math = math;
		this.chinese = chinese;
		this.english = english;
		this.num = english + math + chinese;
	}

	public int getNum() {
		return num;
	}

	@Override
	public String toString() {
		return " [学生姓名为:" + name + ", 数学成绩为:" + math + ", 语文成绩为:" + chinese + ", 英语成绩为:" + english + ", 总成绩为:" + num
				+ "]";
	}

}

功能实现代码:

package com.heima.test;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

import com.heima.bean.Student;

public class Test7 {
	/**
	 * * A:案例演示
	 * 需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
	 * 
	 * 分析:
	 * 1,定义一个学生类
	 * 成员变量:姓名,语文成绩,数学成绩,英语成绩,总成绩
	 * 成员方法:空参,有参构造,有参构造的参数分别是姓名,语文成绩,数学成绩,英语成绩
	 * toString方法,在遍历集合中的Student对象打印对象引用的时候会显示属性值
	 * 2,键盘录入需要Scanner,创建键盘录入对象
	 * 3,创建TreeSet集合对象,在TreeSet的构造函数中传入比较器,按照总分比较
	 * 4,录入五个学生,所以以集合中的学生个数为判断条件,如果size是小于5就进行存储
	 * 5,将录入的字符串切割,用逗号切割,会返回一个字符串数组,将字符串数组中从二个元素转换成int数,
	 * 6,将转换后的结果封装成Student对象,将Student添加到TreeSet集合中
	 * 7,遍历TreeSet集合打印每一个Student对象
	 */
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请按照如下格式(姓名,语文成绩,数学成绩,英语成绩)录入学生信息:");
		TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {

			@Override
			public int compare(Student s1, Student s2) {
				int a = s2.getNum() - s1.getNum();
				return a == 0 ? 1 : a;
			}
		});
		while (set.size() < 5) {
			String line = sc.nextLine();
			String[] split = line.split(",");
			int chinese = Integer.parseInt(split[1]);
			int math = Integer.parseInt(split[2]);
			int english = Integer.parseInt(split[3]);
			set.add(new Student(split[0], chinese, math, english));
		}
		for (Student student : set) {
			System.out.println(student);
		}
	}

}

6.Map类

特点:

1.map是将键映射到值的对象。

2.一个映射不能包含重复的键。

3.每个键最多只能映射到一个值。

Map和Collection接口有什么区别?

Map是双列的,Collection是单列的。(set底层是map,set相当于把value数字隐藏掉。)

Map的键唯一,Collection的子体系set是唯一的

Map集合的数据结构针对键有效,跟值无关。Collection集合的数据结构仅针对元素有效。

Map集合的功能概述

map的常用方法中,put如果以前的键没有值,返回的是null,如果以前的键有值,那么返回以前的值。

map集合的遍历

第一种是先取键后遍历

案例代码:

// Set<String> set = map.keySet();
		// Iterator<String> iterator = set.iterator();
		// while (iterator.hasNext()) {
		// String next = iterator.next();
		// Integer integer = map.get(next);
		// System.out.println(next + "=" + integer);
		// }
		System.out.println(map);

		for (String key : map.keySet()) {
			System.out.println(key + "=" + map.get(key));
		}

keySet取出所有的键放在Set中,然后通过迭代器或者foreach遍历每个键,再取出对应的值。

第二种是取出键值对,依次遍历

案例代码:

	for (Entry<String, Integer> entry : map.entrySet()) {
			System.out.println(entry.getKey() + "=" + entry.getValue());
		}
	}

	public static void demo1(HashMap<String, Integer> map) {
		Set<Entry<String, Integer>> entrySet = map.entrySet();
		Iterator<Entry<String, Integer>> iterator = entrySet.iterator();
		while (iterator.hasNext()) {
			Entry<String, Integer> next = iterator.next();
			System.out.println(next.getKey() + "=" + next.getValue());
		}

先调用entrySet()取出键值对,再通过方法取出键值对中的键或者值

7.LinkedHashMap

因为是list所以有序。

8.TreeMap

不使用比较方法,直接输出,会报如下错误:

Exception in thread "main" java.lang.ClassCastException: com.heima.bean.Student cannot be cast to java.lang.Comparable

也是两种比较方法。

一个是javabean实现比较接口,一个是构造时候传入比较器

9.嵌套HashMap

案例代码如下:

public static void main(String[] args) {
		HashMap<Student, String> c1 = new HashMap<>();
		c1.put(new Student("张三", 18), "北京");
		c1.put(new Student("李四", 19), "上海");
		c1.put(new Student("王五", 20), "广州");
		c1.put(new Student("赵六", 21), "深圳");
		HashMap<Student, String> c2 = new HashMap<>();
		c2.put(new Student("张三子", 31), "北京");
		c2.put(new Student("李四儿", 41), "上海");
		c2.put(new Student("王五环", 51), "广州");
		c2.put(new Student("赵六六", 61), "深圳");
		HashMap<HashMap<Student, String>, String> hm = new HashMap<>();
		hm.put(c1, "少年组");
		hm.put(c2, "老年组");
		for (HashMap<Student, String> group : hm.keySet()) {
			String name = hm.get(group);
			for (Student student : group.keySet()) {
				String place = group.get(student);
				System.out.println("该学生的姓名为:" + student.getName() + ",年龄为:" + student.getAge() + ",坐标在:" + place + ",是"
						+ name + "的成员。");
			}
		}

10.Hashtable

和Vector命运一样,在1.2基本被HashMap抛弃。但是可以发现,Hashtable的命名都不规范,因为JDK1.0还没规定,直到JDK1.2才开始进行命名规范。

相同点:底层都是哈希算法,都是双列集合

不同点:

1.Hashtable在JDK1.0出现,线程安全效率低。HashMap在JDK1.2出现,线程不安全但是效率高。

2.Hashtable不能存储null键或者null值。HashMap可以存储null键或者null值。

当hashtable存储null的时候,会报错:

Exception in thread "main" java.lang.NullPointerException

11.Collections工具类

        public static <T> void sort(List<T> list)
        public static <T> int binarySearch(List<?> list,T key)
        public static <T> T max(Collection<?> coll)
        public static void reverse(List<?> list)
        public static void shuffle(List<?> list)

排序,二分法查找,最大值,反转序列,打乱顺序。

在二分法查找的时候,如果没有,返回的是如果插入会在的位置的负数再减一。例如在acde中查找b,如果有b,就在1位置插入,负数一下再减一,就是负二。所以返回值是负二。

12.斗地主发牌

案例代码:


public class Test3 {

	/**
	 * * A:案例演示
	 * 模拟斗地主洗牌和发牌并对牌进行排序的代码实现
	 * 
	 *  分析:
	 * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去
	 * 2,洗牌
	 * 3,发牌
	 * 4,看牌
	 */
	public static void main(String[] args) {
		//1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去
		String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
		String[] color = {"红桃","黑桃","方片","梅花"};
		HashMap<Integer, String> hm = new HashMap<>();					//存储索引和扑克牌
		ArrayList<Integer> list = new ArrayList<>();					//存储索引
		int index = 0;
		
		//拼接扑克牌并索引和扑克牌存储在hm中
		for(String s1 : num) {											//获取数字
			for(String s2 : color) {									//获取颜色
				hm.put(index, s2.concat(s1));
				list.add(index);										//将索引0到51添加到list集合中
				index++;
			}
		}
		//将小王添加到双列集合中
		hm.put(index, "小王");
		list.add(index);												//将52索引添加到集合中
		index++;
		hm.put(index, "大王");
		list.add(index);												//将52索引添加到集合中
		
		//2,洗牌
		Collections.shuffle(list);
		//3,发牌
		TreeSet<Integer> gaojin = new TreeSet<>();
		TreeSet<Integer> longwu = new TreeSet<>();
		TreeSet<Integer> me = new TreeSet<>();
		TreeSet<Integer> dipai = new TreeSet<>();
		
		for(int i = 0; i < list.size(); i++) {
			if(i >= list.size() - 3) {
				dipai.add(list.get(i));							//将三张底牌存储在底牌集合中
			}else if(i % 3 == 0) {
				gaojin.add(list.get(i));
			}else if(i % 3 == 1) {
				longwu.add(list.get(i));
			}else {
				me.add(list.get(i));
			}
		}
		
		//看牌
		lookPoker(hm, gaojin, "高进");
		lookPoker(hm, longwu, "龙五");
		lookPoker(hm, me, "冯佳");
		lookPoker(hm, dipai, "底牌");
	}
	/*
	 * 看牌
	 * 1,返回值类型void
	 * 2,参数列表HashMap,TreeSet,String name
	 */
	public static void lookPoker(HashMap<Integer, String> hm,TreeSet<Integer> ts ,String name) {
		System.out.print(name + "的牌是:");
		for(Integer i : ts) {						//i代表双列集合中的每一个键
			System.out.print(hm.get(i) + " ");
		}
		System.out.println();
	}
}

建立索引,将索引的顺序打乱,发至每个人手中,再依照每个人手中的索引取到对应的牌。

13.泛型固定下边界

? extend E   泛型固定上边界

泛型固定上边界用于子类进入父类,父类引用指向子类对象。更多的是放进去操作。

? super E     泛型固定下边界

泛型固定下边界用于子类使用父类的比较器等,依旧是父类引用指向子类对象。更多的是取出来操作。

案例代码:

	public static void demo2() {
		TreeSet<Student> treeSet = new TreeSet<>(new CompareByAge());
		treeSet.add(new Student("张三", 19));
		treeSet.add(new Student("李四", 20));
		TreeSet<BaseStudent> treeSet2 = new TreeSet<>(new CompareByAge());
		treeSet2.add(new BaseStudent("王五", 27));
		treeSet2.add(new BaseStudent("赵六", 22));
		System.out.println(treeSet2);
	}

	public static void demo1() {
		// 泛型固定上边界,BaseStudent是Student的子类,上边界为Student
		ArrayList<Student> list = new ArrayList<>();
		list.add(new Student("张三", 17));
		list.add(new Student("李四", 18));
		ArrayList<BaseStudent> list2 = new ArrayList<>();
		list2.add(new BaseStudent("王五", 19));
		list2.add(new BaseStudent("赵六", 20));
		list.addAll(list2);
		System.out.println(list);
	}

14.异常及JVM默认处理方式

throwable只有两个子类,Error和Exception。error比exception严重得多。

Java中的异常被分为两大类:编译时异常和运行时异常。

所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常

正确的查找异常方式:APi中查找异常,在控制台中由下向上依次查找。

15.try...catch...finally

try:检测异常

catch:捕获异常

finally:释放资源

try里面是进行检测,出现问题,产生了一个对象,该对象很明显数据类型无法捕获,就被try监测到,假设该对象是ArithmeticException,catch本质上就是方法,传入异常时ArithmeticException a = new ArithmeticException,接着执行语句,没传入参数,catch方法里面的语句就不执行。

JDK7中如何处理多个异常?

中间加 | 即可

异常处理的信息

    getMessage()

            获取异常信息,返回字符串。

   toString()

            获取异常类名和异常信息,返回字符串。

   printStackTrace() (一般默认是这个)

            获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

throws和throw的区别

throws

              用在方法声明后面,跟的是异常类名

               可以跟多个异常类名,用逗号隔开

              表示抛出异常,由该方法的调用者来处理

throw

              用在方法体内,跟的是异常对象名

              只能抛出一个异常对象名

              表示抛出异常,由方法体内的语句处理

案例代码:

public void setAge(int age) throws AgeOutOfBoundsException {
		if(age >0 && age <= 150) {
			this.age = age;
		}else {
			//Exception e = new Exception("年龄非法");
			//throw e;
			throw new AgeOutOfBoundsException("年龄非法");
		}
	}

16.finally类

finally的特点

被finally控制的语句体一定会执行

特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))

finally的作用

用于释放资源,在IO流操作和数据库操作中会见到

finally关键字的特点及作用 

return语句相当于是方法的最后一口气,那么在他将死之前会看一看有没有finally帮其完成遗愿,如果有就将finally执行后在彻底返回

案例代码:

public static void main(String[] args) {
		try {
			System.out.println(10/0);
		} catch (Exception e) {
			System.out.println("除数为零了");
			System.exit(0);								//退出jvm虚拟机
			return;
		} finally {
			System.out.println("看看我执行了吗");
		}
	}

}

面试题:

final,finally和finalize的区别?

final修饰的类不能被继承

修饰的方法不能被重写

修饰的变量不能被赋值

finally是try语句中的一个语句体,不能被单独使用,主要是用来释放资源。

finalize:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

有return,finally里面的方法还会执行吗?在return前还是后?

案例代码:

class Demo {
	public int method() {
		int x = 10;
		try {
			x = 20;
			System.out.println(1/0);
			return x;
		} catch (Exception e) {
			x = 30;
			return x;
		} finally {
			x = 40;
			//return x;					千万不要在finally里面写返回语句,因为finally的作用是为了释放资源,是肯定会执行的
										//如果在这里面写返回语句,那么try和catch的结果都会被改变,所以这么写就是犯罪
		}
	}
}

输出30.很明显,代码是会执行的,在return前,准确来说,在中间。x=30,此时建立return通道,将x=30打包好,准备返回,检查了一下finally里面的语句,那么x就等于40了,但是此时30已结在通道里了,只能发送。

17.自定义异常

案例代码:

public class Demo1_Exception {

	public static void main(String[] args) throws Exception {
		Person p = new Person();
		p.setAge(-17);
	}

}

class Person {
	private String name;
	private int age;

	public Person() {
		super();

	}

	public Person(String name, int age) {
		super();
		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) throws AgeOutOfBoundsException {
		if (age > 0 && age <= 150) {
			this.age = age;
		} else {
			// Exception e = new Exception("年龄非法");
			// throw e;
			throw new AgeOutOfBoundsException("年龄非法");
		}
	}

}

自定义的AgeOutOfBoundsException异常:

class AgeOutOfBoundsException extends Exception {

	public AgeOutOfBoundsException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public AgeOutOfBoundsException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

}

异常的注意事项:

子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)

如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常

如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

如何使用异常处理

原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws

 区别:

                后续程序需要继续运行就try

                 后续程序不需要继续运行就throws

如果JDK没有提供对应的异常,需要自定义异常。

try...catch案例代码:

public class Test1 {
	/**
	 * 键盘录入一个int类型的整数,对其求二进制表现形式
	 * 如果录入的整数过大,给予提示,录入的整数过大请重新录入一个整数BigInteger
	 * 如果录入的是小数,给予提示,录入的是小数,请重新录入一个整数
	 * 如果录入的是其他字符,给予提示,录入的是非法字符,请重新录入一个整数
	 * 
	 * 分析:
	 * 1,创建键盘录入对象
	 * 2,将键盘录入的结果存储在String类型的字符串中,存储int类型中如果有不符合条件的直接报错,无法进行后续判断
	 * 3,键盘录入的结果转换成int类型的数据,是正确的还是错误的
	 * 4,正确的直接转换
	 * 5,错误的要进行对应判断
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入想要转换的整数:");
		while (true) {
			String nextLine = sc.nextLine();
			try {
				int num = Integer.parseInt(nextLine);
				System.out.println(Integer.toBinaryString(num));
				break;
			} catch (Exception e) {
				try {
					new BigInteger(nextLine);
					System.out.println("您输入的整数太大了,请重新输入:");
				} catch (Exception e1) {
					try {
						new BigDecimal(nextLine);
						System.out.println("您输入的是小数,请重新输入:");
					} catch (Exception e2) {
						System.out.println("您输入的是非法字符,请重新输入:");
					}
				}
			}
		}
	}

}

18.File类

构造方法:

         File(String pathname):根据一个路径得到File对象

         File(String parent, String child):根据一个目录和一个子文件/目录得到File对象

         File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象

创建功能

         public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了

         public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了

         public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来

重命名和删除功能

         public boolean renameTo(File dest):把文件重命名为指定的文件路径

         public boolean delete():删除文件或者文件夹

重命名注意事项

         如果路径名相同,就是改名。

         如果路径名不同,就是改名并剪切。

删除注意事项:

         Java中的删除不走回收站。

         要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹

判断功能

         public boolean isDirectory():判断是否是目录

         public boolean isFile():判断是否是文件

         public boolean exists():判断是否存在

         public boolean canRead():判断是否可读

         public boolean canWrite():判断是否可写

         public boolean isHidden():判断是否隐藏

获取功能

         public String getAbsolutePath():获取绝对路径

         public String getPath():获取路径

         public String getName():获取名称

         public long length():获取长度。字节数

         public long lastModified():获取最后一次的修改时间,毫秒值

         public String[] list():获取指定目录下的所有文件或者文件夹的名称数组

         public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

需要注意的是:

         windows下文件路径间隔符是\,在实际书写中要\\,因为\是转移字符。mac下为/。

         windows下默认都是可读的,所以文件设置setReadble为false无效。mac下可以

检索文件夹下jpg结尾的文件:

public static void main(String[] args) {
		File dir = new File("/Users/yoofale/Desktop/假装是D盘/666");
		File[] files = dir.listFiles();
		for (File file : files) {
			if (file.isFile() && file.getName().endsWith(".txt")) {
				System.out.println(file);
			}
		}
	}

用listFiles而不是list的原因,listFiles获得的都是文件,可以直接操作。

或者可以直接文件名过滤器:

		String[] list = dir.list(new FilenameFilter() {

			@Override
			public boolean accept(File dir, String name) {
				File file = new File(dir, name);
				return file.isFile() && file.getName().endsWith(".txt");
			}
		});
		for (String string : list) {
			System.out.println(string);
		}

猜你喜欢

转载自blog.csdn.net/YooFale/article/details/82938871