import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap cm = new TreeMap();
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String s = sc.nextLine();
//字符串转字符数组 char[] chars = s.toCharArray(); //增强for遍历key for (char key : chars) { //如果集合里存在key if (cm.containsKey(key)){ //key存在 Integer value = cm.get(key);//获取到key value++; cm.put(key,value); }else{ //key不存在 cm.put(key,1); } } //遍历 for (Character key : cm.keySet()) { Integer value = cm.get(key); System.out.print(key+"(" + value + ")"); } }
}
一,Properties
1,概述
-Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。
属性列表中的每个键及其对应的值都是一个字符串。
package com.momo.demo;
import com.momo.po.Stu;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws IOException {
Properties ps = new Properties();
// ps.put(new Stu(),"b");
// ps.setProperty("aa","234");
ps.load(new FileInputStream("C:\Users\67823540\Desktop\keda\day15\src\com\momo\demo\a.txt"));
Object o = ps.get("name");
System.out.println(o);
String name = ps.getProperty("name");
System.out.println(name);
System.out.println(ps);
}
}
2,构造方法
Properties()
创建一个没有默认值的空属性列表。
Properties(Properties defaults)
创建具有指定默认值的空属性列表。
3,成员方法
String getProperty(String key)
使用此属性列表中指定的键搜索属性。
String getProperty(String key, String defaultValue)
使用此属性列表中指定的键搜索属性。
void load(InputStream inStream)
从输入字节流读取属性列表(键和元素对)。
void load(Reader reader)
以简单的线性格式从输入字符流读取属性列表(关键字和元素对)。
void loadFromXML(InputStream in)
将指定输入流中的XML文档表示的所有属性加载到此属性表中。
Object setProperty(String key, String value)
致电 Hashtable方法 put 。
二,Collections
1,概述
-是一个集合操作工具类,成员都是静态的
2,成员变量
static List EMPTY_LIST
空列表(不可变)。
static Map EMPTY_MAP
空地图(immutable)。
static Set EMPTY_SET
空集(不可变)。
package com.momo.demo;
import java.util.Collections;
import java.util.List;
public class Demo2 {
public static void main(String[] args) {
/* List list = Collections.EMPTY_LIST;
System.out.println(list);
System.out.println(list.size());
list.add("123");
System.out.println(list);
System.out.println(list.size());*/
}
}
3,成员方法
static boolean addAll(Collection c, T... elements)
将所有指定的元素添加到指定的集合。
static int binarySearch(List> list, T key)
使用二叉搜索算法搜索指定对象的指定列表。
static int binarySearch(List list, T key, Comparator c)
使用二叉搜索算法搜索指定对象的指定列表。
static void copy(List dest, List src)
将所有元素从一个列表复制到另一个列表中。
static >
T max(Collection coll)
根据其元素的 自然顺序返回给定集合的最大元素。
static T max(Collection coll, Comparator comp)
根据指定的比较器引发的顺序返回给定集合的最大元素。
static >
T min(Collection coll)
根据其元素的 自然顺序返回给定集合的最小元素。
static T min(Collection coll, Comparator comp)
根据指定的比较器引发的顺序返回给定集合的最小元素。
static list, T oldVal, T newVal)
将列表中一个指定值的所有出现替换为另一个。
static void reverse(List list)
反转指定列表中元素的顺序。
static void shuffle(List list)
使用默认的随机源随机排列指定的列表。
static >
void sort(List list)
根据其元素的natural ordering对指定的列表进行排序。
static list, Comparator c)
根据指定的比较器引起的顺序对指定的列表进行排序。
static list) 有很多类似的,把不安全的变安全
返回由指定列表支持的同步(线程安全)列表。
package com.momo.demo;
import com.momo.po.Stu;
import java.util.*;
public class Demo3 {
public static void main(String[] args) {
/* ArrayList list = new ArrayList();
Collections.addAll(list,12,45,5,6,78,90,23,90,9,5,7,32);
*//*for (Integer i : list) {
System.out.println(i);
}
list.add(132);*//* System.out.println(list); Collections.sort(list); System.out.println(list); System.out.println(Collections.binarySearch(list, 9));*/ ArrayList<Stu> list = new ArrayList(); list.add(new Stu("aa",11)); list.add(new Stu("ab",12)); list.add(new Stu("cc",10)); System.out.println(list); System.out.println(Collections.max(list)); System.out.println(Collections.min(list, new Comparator<Stu>() { @Override public int compare(Stu o1, Stu o2) { return o1.getAge()-o2.getAge(); } })); // Stu s = new Stu("ab",12); /* Collections.sort(list); System.out.println(list); System.out.println(Collections.binarySearch(list,s)); System.out.println(list);*/ /* Collections.sort(list, new Comparator<Stu>() { @Override public int compare(Stu o1, Stu o2) { return o1.getAge()-o2.getAge(); } }); System.out.println(list);*/ /* Collections.binarySearch(list,s,new Comparator<Stu>(){ @Override public int compare(Stu o1, Stu o2) { return o2.getAge()-o1.getAge(); } }); System.out.println(list);*/ /* ArrayList<Integer> list = new ArrayList(4); list.add(111); list.add(222); list.add(333); ArrayList<Integer> list2 = new ArrayList(6); list2.add(123); list2.add(1); list2.add(13); list2.add(23); Collections.copy(list2,list); System.out.println(list2); System.out.println(list);*/ ArrayList<Integer> list2 = new ArrayList(6); list2.add(2); list2.add(1); list2.add(3); list2.add(6); // Collections.shuffle(list2); Collections.shuffle(list2,new Random(123)); System.out.println(list2); /* Collections.replaceAll(list2,1,111); System.out.println(list2); Collections.reverse(list); System.out.println(list);*/ List<Integer> list3 = Collections.synchronizedList(list2); System.out.println(list3); }
}
4,相关问题
-Collection和Collections的区别?
5,练习
-模拟斗地主洗牌,发牌,看牌
难点在于如何组装一副牌
package com.momo.demo;
import java.util.ArrayList;
import java.util.Collections;
public class Demo4 { public static void main(String[] args) { //三个玩家 ArrayList card = new ArrayList<>(); String[] size = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"}; String[] color = {"?","?","?","?"}; for (int i = 0; i < size.length; i++) { for (int j = 0; j < color.length; j++) { card.add(color[j] + size[i]); } } card.add("大王"); card.add("小王"); //System.out.println(card); //洗牌 Collections.shuffle(card); System.out.println(card); //发牌 for (int i = 0; i < card.size(); i++) { if(i>=card.size()-3){ a4.add(card.get(i)); }else if(i%3==0){ a1.add(card.get(i)); }else if(i%3==1){ a2.add(card.get(i)); }else if(i%3==2){ a3.add(card.get(i)); } } System.out.println("发哥:"+a1); System.out.println("高进:"+a2); System.out.println("刀仔:"+a3); System.out.println("底牌:"+a4); } }
三,异常
1,概述
-就是java程序出现的错误(不正常情况)
-异常也是一个具体存在的事物,java也通过类的形式把这些问题进行了描述(封装)
封装成了各种各样的异常对象。(空指针异常,索引越界异常,类型转换异常....)
-Throwable类是Java语言中所有错误和异常的父类。
2,分类
-Thorwable
Error:错误
Error以及Error的子类都表示严重问题,应用程序不应该试图捕获。
这类问题我们无法解决。和程序代码无关。我们不做处理
内存不够,导致溢出
Exception:异常
编译期异常:除了RuntimeException之外的都是编译期异常
代码写错了,必须改代码,不改代码程序无法执行
运行期异常:RuntimeException和RuntimeException的所有子类
大部分情况下都是因为代码写的不够严谨导致的(一般可以通过加判断,优化代码解决)
还有一部分是我们解决不了(权限不够,能力不够,交给有能力的人来解决)
这类问题我们可以处理:
程序出错后还可以继续执行
也可以不处理
将来jvm会执行默认处理机制,但是程序不会继续执行
3,jvm的默认处理机制
-把异常名称,原因以及出现的位置输出到控制台上
-同时结束程序。
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.momo.demo.Demo6.main(Demo6.java:9)
jvm在执行程序的时候发现违反了数学运算规则,而java把这种(常见)问题都已经
进行过描述了。 当前这个问题,java已经使用ArithmeticException这个类进行描述了
所以当我们在程序中一旦出现了除0运算,jvm就会产生一个该类型的具体对象,
我们没有做处理,就把这个对象抛给了main函数的调用者 jvm
new ArithmeticException("by zero")
最终执行jvm默认处理机制
我们也可以自己处理,程序就可以继续执行
*/
package com.momo.demo;
public class Demo6 {
public static void main(String[] args) {
System.out.println("sdfsdf");
int a = 5;
// int b = 2;
int b = 0;
int c = a/b;
System.out.println(c);
System.out.println("撒旦立刻解放都是垃圾"); }
}
-程序出现问题,我们不处理,最终会执行jvm默认处理机制,程序会结束
这不是我们想要的,我们想要的是即使程序出现问题,也不要影响后面代码的执行
为了能够实现这样的效果,所以我们就需要自己处理异常。
4,异常的两种处理方式
-try...catch...finally
-throws
5,try...catch...finally 完整格式
-try{
可以出现问题的代码
}catch(异常类名 变量名){
针对问题的处理方案
}finally{
释放资源
}
-这个有很多变形格式
try...catch
try...catch...catch...catch
try...catch...catch...catch...finally
try...finally
6,try...catch 处理异常
-一个异常
-多个异常
平级关系
子父关系
-注意:try里面代码越少越好
catch中必须有处理方式,哪怕就是一个输出语句
多个异常
分开处理:一个异常一个try...catch
一起处理:一个try...多个catch
多个异常平级关系,先后无所谓
多个异常存在子父级关系,父类异常必须在最后
能明确异常类型,尽量明确,不要用大的
try里面一旦出现问题,就会立马把问题跑出去,和catch里面进行匹配
一旦有匹配的,就执行对应的处理方式,然后结束try...catch,执行后面代码
package com.momo.demo;
//一个异常
public class Demo6 {
public static void main(String[] args) {
System.out.println("sdfsdf");
int a = 5;
// int b = 2;
int b = 0;
int c = 0; //ctrl+alt+t 快捷键 try { c = a/b; // } catch (Exception e) { //Exception e = new ArithmeticException() } catch (ArithmeticException e) { //ArithmeticException e = new ArithmeticException() System.out.println("不能除0!!!"); } System.out.println(c); System.out.println("撒旦立刻解放都是垃圾"); }
}
package com.momo.demo;
/*
- 多个异常
- 分开处理
- /
public class Demo7 {public static void main(String[] args) {/
int b = 0;
try {
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println("不能除0");
}
int[] arr = {1,2,3}; try { System.out.println(arr[3]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引越界了。。。。"); }
*/
/* int a = 5; int b = 1; int[] arr = {1,2,3}; try { System.out.println(a/b); System.out.println(arr[1]); } catch (ArithmeticException e) { System.out.println("不能除0"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引越界了。。。。"); }*/ int a = 5; int b = 1; int[] arr = {1,2,3}; try { System.out.println(a/b); System.out.println(arr[3]); } catch (Exception e) { System.out.println("服务器忙。。。"); } System.out.println("后面代码。。。"); }
}
package com.momo.demo;
/*
- 多个异常
- 分开处理
- 一起处理
- /
public class Demo7 {public static void main(String[] args) {/
int b = 0;
try {
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println("不能除0");
}
int[] arr = {1,2,3}; try { System.out.println(arr[3]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引越界了。。。。"); }
*/
int a = 5; int b = 1; int[] arr = {1,2,3}; try { System.out.println(a/b); System.out.println(arr[3]); System.out.println("其他代码。。。"); } catch (ArithmeticException e) { System.out.println("不能除0"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引越界了。。。。"); } catch (Exception e) { //Exception e = ? System.out.println("出问题了。。。"); } /* int a = 5; int b = 1; int[] arr = {1,2,3}; try { System.out.println(a/b); System.out.println(arr[3]); } catch (Exception e) { System.out.println("服务器忙。。。"); }*/ System.out.println("后面代码。。。"); }
}
package com.momo.demo;
/*
- 多个异常的另一种处理方式
- try{}catch(异常名1|异常名2... 变量名){}
- 多种异常只能是一种处理方式
- 多个异常必须是平级的
- */
public class Demo8 {
public static void main(String[] args) {
int a = 5;
int b = 1;
int[] arr = {1,2,3};
try {
System.out.println(a/b);
System.out.println(arr[3]);
System.out.println("其他代码。。。");
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("服务器忙");
}
System.out.println("后面代码。。。");
}
}
7,编译期异常的处理
-必须显示处理,否则编译不通过,程序无法执行
package com.momo.demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo9 {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String s = sdf.format(new Date()); String ss = "2020-06:06"; try { Date d = sdf.parse(ss); System.out.println(d); } catch (ParseException e) { System.out.println("解析时出错,格式不匹配。。。"); } System.out.println("后面代码"); }
}
8,Throwable中的常用方法(获取异常信息的方法)
String getMessage()
返回此throwable的详细消息字符串。
void printStackTrace()
将此throwable和其追溯打印到标准错误流。
void printStackTrace(PrintStream s)
将此throwable和其追溯打印到指定的打印流。
void printStackTrace(PrintWriter s)
将此throwable和其追溯打印到指定的打印作者。
String toString()
返回此可抛出的简短描述。
package com.momo.demo;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
- jvm默认处理机制信息:
- Exception in thread "main" java.text.ParseException: Unparseable date: "2020-06:06" at java.base/java.text.DateFormat.parse(DateFormat.java:399) at com.momo.demo.Demo9.main(Demo9.java:16)
getMessage():
Unparseable date: "2020-06:06"
printStackTrace():
java.text.ParseException: Unparseable date: "2020-06:06"
at java.base/java.text.DateFormat.parse(DateFormat.java:399)
at com.momo.demo.Demo9.main(Demo9.java:20)
toString():
- java.text.ParseException: Unparseable date: "2020-06:06"
- */
public class Demo9 {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String ss = "2020-06:06"; try { Date d = sdf.parse(ss); System.out.println(d); } catch (ParseException e) { //ParseException e = new ParseException(); //调用对象的方法,获取异常信息,进行操作 // System.out.println("解析时出错,格式不匹配。。。"); // System.out.println(e.getMessage()); // e.printStackTrace(); // System.out.println(e.toString()); try { e.printStackTrace(new PrintStream("a.txt")); //跳转到 服务器忙 页面。。。 } catch (FileNotFoundException ex) { System.out.println("文件找不到。。。"); } } System.out.println("后面代码");
}
}
9.throws
-定义方法时,需要把可能会出现的问题暴漏出来,让调用者来处理,那么就需要
使用throws 在方法上进行标注
-格式:thorows 异常类名
注意:这个格式必须跟在方法的()后面
到main方法了就不要在抛了,但是后面讲课时我会这样做
-抛编译期异常
调用者必须处理
-抛运行期异常
调用者可以不处理
package com.momo.demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo10 {
public static void main(String[] args) {
System.out.println("程序开始");
/* try {
fun1();
} catch (ParseException e) {
e.printStackTrace();
}*/
try { fun2(); } catch (ArithmeticException e) { e.printStackTrace(); } System.out.println("程序结束"); } //编译期异常 public static void fun1() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String ss = "2020-06-06"; Date d = sdf.parse(ss); System.out.println(d); } //运行期异常 public static void fun2() throws ArithmeticException{ int a = 5; int b = 1; System.out.println(a/b); }
}
10,throws和throw的区别
-throws 在方法()后面,跟的是异常类名,可以根多个用逗号隔开
表示抛出某异常,由调用者来处理
表示一种可能性,并不一定会发生
-throw 在方法内,跟的是异常对象,只能抛一个对象
表示抛出异常,由方法内部语句处理
表示已经抛出了某种异常
package com.momo.demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo10 {
public static void main(String[] args) {
System.out.println("程序开始");
/* try {
fun1();
} catch (ParseException e) {
e.printStackTrace();
}*/
/* try { fun2(); } catch (ArithmeticException e) { e.printStackTrace(); }*/ try { fun3(); } catch (Exception e) { System.out.println("aaa"); } System.out.println("程序结束"); } //编译期异常 public static void fun1() throws ParseException,NullPointerException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String ss = "2020-06-06"; Date d = sdf.parse(ss); System.out.println(d); } //运行期异常 public static void fun2() throws ArithmeticException{ int a = 5; int b = 1; System.out.println(a/b); } public static void fun3() { int a = 5; int b = 0; if(b==0){ throw new ArithmeticException(); }else{ System.out.println(a/b); } }
}
11,到底该如何处理异常?
-原则:
能优化代码就优化代码
能try就try,程序可以继续执行
throws,后面代码不执行
12,finally
-特点
被finally控制的语句一定会执行
除了特殊情况:在执行到finally之前,jvm退出了。
System.exit(0);
-作用:释放资源
-问题:
final,finally,finalize的区别?
如果catch语句中有return,请问finally代码还会执行吗?
会,是在return前还是return后执行?
package com.momo.demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Demo11 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //String ss = "2020-06:06"; String ss = "2020-06-06"; Date d = null; try { System.out.println(4/0); d = sdf.parse(ss); } catch (ParseException | ArithmeticException e) { System.out.println("aaa"); e.printStackTrace(); // System.exit(0); } finally { System.out.println("来了,老弟。。"); sc.close(); } System.out.println(d); } }
package com.momo.demo;
public class Demo12 {
public static void main(String[] args) {
System.out.println(get());
}
public static int get(){ int a = 5; try { System.out.println("1"); System.out.println(a/0); a = 55; } catch (ArithmeticException e) { System.out.println("2"); a = 555; return a; /* * 当代码执行到return a; 这个时候a的值是555,这里的return a 其实是return 555, * 返回值和返回路径已经确定了, * 但是发现后面有finally,所以程序要执行finally中的代码 ,给a这个变量重新赋值 5555 * 完了之后再次回到之前的返回路径 return 555; * */ } finally { System.out.println("3"); a = 5555; return a; /* * 如果在这里也有return,返回的就是 5555 * */ } // return a; }
}
标签:java,int,list,System,println,异常,out From: https://blog.51cto.com/u_16230968/7423631