1、indexOf题目,若需要寻找 子串"ab"的所有出现索引,
规律: 1、定义查找的起始索引start,从0开始 int start = 0; 2、每次从起始索引查找。 int index = 字符串.indexOf("ab",start); 3、查找完毕,起始索引 = 找到的索引+1 start = index+1;
2、遍历中,判定当前是否为最后一个元素。
if(i==arr.length-1){ //最后一个元素 }
3、若要将现在时间,向后推 1天 /1周 /1年
规律: 1、获取当前毫秒值 getTime(); 2、当前毫秒值+1天 /1周 /1年 当前毫秒值+1000L*60*60*24; 当前毫秒值+1000L*60*60*24*7; 当前毫秒值+1000L*60*60*24*365; 3、设置毫秒值 setTime(毫秒值);
4、补0操作
String m = 值 <= 9 ? "0" + 值 : "" + 值;
5、涉及到 两个字符串日期 进行时间差值运算(相差多少天、相差多少年)
步骤: 字符串--SimpleDateFormat--》日期--getTime()--》毫秒值-- 未来日期-过去日期 --》天 (1000/60/60/24) 字符串--SimpleDateFormat--》日期--getTime()--》毫秒值-- 未来日期-过去日期 --》年 (1000/60/60/24/365)
6、日历类的月份设置 月份-1
日历类对象.set(2019,12-1,31,23,59,59);
7、
//字符串 转 日历类 【常见】
//字符串---》日期---》日历 String str3 = "2019年11月11号"; SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd号"); Date d3 = sdf3.parse(str3); Calendar c3 = Calendar.getInstance(); c3.setTime(d3); //日历类 转 字符串【常见】 //日历===》日期====》字符串 Calendar c4 = Calendar.getInstance(); Date d4 = c4.getTime(); SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy年MM月dd号"); String str4 = sdf4.format(d4);
8、Calendar日历注意:
设置月份 真实月份-1 获取月份 获取月份+1
9、指定日期是星期几
Calendar c = Calendar.getInstance(); c.setTime(date); //4、获取星期几 int day = c.get(Calendar.DAY_OF_WEEK); 周日 1 周一 2 ..... 周六 7 switch
10、计算某个程序运行时间:
//1、记录程序开始前的毫秒值 //2、开始运行程序 //3、记录程序结束后的毫秒值 //4、运行时间 = 结束后-开始前 long startTime=System.currentTimeMillis();//获取开始时间 /* 测试程序代码; */ long endTime=System.curr entTimeMillis();//获取结束时间 System.out.println("运行时间是:"+(startTime-endTime)+"ms");//输出运行时间
11、基本数据类型作为参数和返回值:传递真正数据。
相当于方法A把数据复制了一份传递给方法B,方法A和B各操作各自的数据
引用数据类型作为参数和返回值:传递地址值。 因为方法A将地址传递给方法B,导致A和B两个方法 操作同一个堆内存对象
12、自定义类,若需要调用ArrayList集合的contains方法,自定义类需要idea生成hashCode和equals方法
若姓名和性别相同,为同一个人,
Person类中要在生成两个方法时,同时勾选name和sex
类似的集合有: ArrayList contains LinkedList contains HashSet add HashMap containsValue containsKey put LinkedHashMap containsValue containsKey put
13、Person p1 = new Person(“小宝”,“007”,“传智专修学院A302”);
//需要打印: 小宝-007-传智专修学院A302
System.out.println(p1);// p1.toString() 默认打印:地址 在于写:toString方法
14、
·数字类型之间有转换:
byte short int long float double
小转大: 例如: int ----> double 隐式自动转换 大转小: 例如: double ---> int 强制手动转换 例如: double a = 10.5; int b = (int)a; 特殊:+= double a = 10.5; int b = 1; b+=a;//隐式强制转换 ·基本数据类型---》字符串: ①【频繁】 ""+基本数据类型 ② String 返回值 = String.valueOf(基本数据类型); ③ 基本数据类型.toString(基本数据类型); 【频繁】 基本数据类型.toString(); ·字符串---》基本数据类型: 如果出现了不能转换的字符,直接报错。 int x = Integer.parseInt(字符串);//只能转整数 double x = Double.parseDouble(字符串);//只能转小数,转整数 小数位会补0 boolean x = Boolean.parseBoolean(字符串);//只能转布尔
15、普通for:进行遍历中,添加/删除 元素
增强for:进行正向逐个遍历(不能修改集合的长度-添加/删除不能进行)
迭代:进行遍历中 删除 元素
16、
去重复判断:
HashSet集合, add方法,返回false,说明为重复元素
HashMap集合: get方法,返回值不为null,说明为重复元素
containsKey, 返回值为true,说明集合中存在该key,key是重复的
containsValue,返回值为true,说明集合中存在该value,value是重复的
17、
切割步骤: //1、获取字节数组 byte[] arr = str.getBytes("utf-8"); //2、定义切割的起始索引,默认0 int startIndex = 0; //3、定义变量,保存一次切割几个字节 (切割长度) int len = 2; //4、循环( 起始索引没有超过 数组的最大索引,就能继续切割 ) while (startIndex<=arr.length-1){ //若 起始索引+长度 > 最大索引,会导致索引越界 if(startIndex+len>arr.length-1){ FileUtils.writeByteArrayToFile(new File("文件"),arr,startIndex,arr.length-startIndex); }else{ //正常切割 FileUtils.writeByteArrayToFile(new File("文件"),arr,startIndex,len); } //切割完成,起始索引需要向后推移 startIndex += len; } 切割技巧总结: 1、循环条件: startIndex<=arr.length-1 2、当会出现索引越界时,从起始索引,切割到数组最后: 数组长度-起始索引 3、切割结束,起始索引向后推移: 起始索引+=切割长度; 合并步骤: 1、查找并获取要合并的碎片文件集合 2、按指定顺序遍历碎片文件集合 【难点】 3、遍历一个碎片文件,就变为字节数组,追加写入合并文件 遍历结束,文件合并结束 合并三要素: ①确保获取的文件集合正确 ②确保碎片是按指定顺序遍历 ③确保是追加方式写入合并文件 合并示例代码: public static void main(String[] args) throws IOException { //1、获取当前目录下,所有扩展名是 x 的文件,不用查找子目录 Collection<File> list = FileUtils.listFiles(new File("./"), new String[]{"x"}, false); //2、遍历获取的文件 for (File file : list) { //3、遍历中,每个文件变为字节数组,以追加方式写入合并文件 //3.1、获取当前文件的字节数组 byte[] arr = FileUtils.readFileToByteArray(file); //3.2、把字节数组以追加方式写入合并文件 FileUtils.writeByteArrayToFile(new File("测试题10.png"),arr,true); } }
18、文件复制(仅作了解)
//1、定义输入流、输出流 FileInputStream fis = new FileInputStream(""); FileOutputStream fos = new FileOutputStream(""); //2、定义字节数组,长度是1024 byte[] arr = new byte[1024];//1kb //3、定义每次读取的数据长度 int len = -1; //4、while循环 while((len = fis.read(arr))!=-1){ fos.write(arr); } //5、关流倒着关 fos.close(); fis.close();
19、方法重写:
返回值类型说明:子类的返回值类型可以 和 父类相同甚至更窄。
Object -----X1 -----X2 -----X3 父类返回值类型:X1 子类返回值类型:X1 X2 X3
20、
·(调用成员方法)如何判断this:
最初调用方法时,调用方法的对象是谁,在此次执行中,this表示的就是谁
·(调用成员变量、构造方法)如何判断this:
this关键字在哪个类,就表示哪个类的内容
·关键字如何执行成员方法: 在类中未找到该方法,去父类中寻找。若父类也找不到,继续去父类的父类中寻找; 若整个继承树都没有该方法,直接编译报错 ·关键字如何执行变量: 就近原则:局部》》本类成员变量》》父类成员变量 若整个继承树都找不到该变量,编译报错 ·关键字调用构造方法: 构造方法的第一句若无this或super,Java自动补super() Object无参构造一定执行 this或super调用构造方法,只能出现在构造方法的第一句,只能出现一次 ·super表示当前类父对象(直接找super代码所在类的 父类即可)
21、多态转换规律:
Person父,Student子
大 小
继承树上,越往上,越大。 最大的类:Object
小转大(Student--》Person):自动转换,子当父用。 两方存在 继承关系 或 实现关系,就可以通过编译 大转小(Person--》Student):手动强转。 父当子用, 仅做回自己时(或做回自己的向上类型【接口、父类】),可以执行成功 注:不能转为无关类型 或 无法做回自己的向下类型 例如:Student stu1 = new Student(); Person per1 = stu1; //做回自己 Student stu2 = (Student) per1;
22、多态中变量、常量、方法的使用规律:
·成员变量、static成员变量、常量、static方法: 编译是否报错,看左边,执行效果如何,看左边-------------》【编译看左,执行看左】 例如:Person父,Student子 Person p2 = new Student(); 调用成员变量,看Person中是否存在该成员变量,决定编译是否报错 执行效果,看Person中该变量的值,决定了执行效果 ·非static成员方法: 编译是否报错,看左边,执行效果如何,看右边-------------》【编译看左,执行看右】
23、instanceof 判断为true有三种情况:
对象就是该数据类型
对象和类型之间存在继承关系(向上判断)
对象和类型之间存在实现接口关系(向上判断)
24、聚合关系:
一对多:一个A中有多个B
A类{ private ArrayList blist = new ArrayList<>(); //get set方法 }
一对一:一个A中有一个B A类{ private B类 b; //get set 方法 }
25、代码块:
如果类中有静态代码块、构造代码块、构造方法 执行顺序: 第一次使用该类: 先所有的静态代码块----》再所有的构造代码块----》最后执行构造方法 第N次使用该类: 再所有的构造代码块----》最后执行构造方法 存在父子继承关系时: 第一次使用该类:父静态代码块--》子静态代码块---》父构造代码块---》父构造方法----》子构造代码块----》子构造方法 第N次使用该类: 父构造代码块---》父构造方法----》子构造代码块----》子构造方法
26、访问权限:
一个内容,定修饰符之前要考虑:
任意地方用:public 当前类内部用:private 仅 子类能用 并且 同包也能用:protected 仅 同包能用:无修饰符
27、迭代器删除元素:
固定代码:
Iterator it = 集合.iterator(); while (it.hasNext()){ 类型 值 = it.next(); if(条件判断){ //符合要求,进行删除 it.remove(); } }
28、快速数字排序:
从小到大: Collections.sort(集合);
从大到小: Collections.sort(集合); Collections.reverse(集合);
1、排序:【必考点,非难点】
外比较器:Comparator Collections的sort方法的参数中(频率极高)
compare 返回值:负数,就会交换两个元素
Collections.sort(待排序的集合,new Comparator(){ @Overried public int compare(Object o1,Object o2){ //升序 从小到大 //return o1-o2; //降序 从大到小 //return o2-o1; } }); 内比较器:Comparable 需要让排序类,实现该接口(频率低) compareTo 返回值:负数,就会交换两个元素 //升序 从小到大 //return this-o2; //降序 从大到小 //return o2-this; 注意: 若 无法直接返回int值,就进行if判断,判断何时返回 正数,何时返回负数
2、
静态内部类访问:Outer.Inner x = new Outer. Inner();
成员内部类访问:Outer.Inner x = new Outer().new Inner();
记录:Inner前若有new ,必须连接前面的()
3、异常处理机制:
·抓住异常,悄悄处理:try … catch
一般用于处理常见异常,出现了该异常,知道应该做哪些处理。 例如: 用户登录时,若用户名为空,提示:请输入用户名 String username = null; try{ username.split(","); }catch(Exception e){ System.out.println("请输入用户名"); } ·不管异常,抛出去: 方法() throws 非运行时异常 一般用于处理异常时,不明确/不知道 拿到某个异常该做什么。 例如: 用户查询,查询 用户.txt 文件,查询并展示所有用户信息 分析:若 用户.txt文件找不到,会报FileNotFoundException, 但题目没有说明,遇到该异常应如何处理,应该抛出去。 public static void main(String[] args) throws FileNotFoundException{ List<String> xlist = FileUtils.readLines(new File("用户.txt"),"utf-8"); }
4、
throws: 写在方法声明上
一个抛出多个异常,用逗号分隔
用法:抛出异常
注意:throws一般抛出非运行时异常,
运行时异常不用throws,默认方法抛出
throw: 写在方法体中 一次抛出一个异常,一般抛出后,方法会结束 用法:用来生成新异常 注意: throw生成的异常,可以是异常树上的任意异常
5、编码技巧:方法返回数据:
注意:
方法只能有一种数据被返回:
要么是方法返回值,要么是抛出的异常
例如:控制台输入一个整数,若整数大于10,返回true,否则返回false
·`方法返回值:传递任意类型数据 示例代码: public static void main(String[] args){ boolean f = run1(); } public static boolean run1(){ int x = new Scanner(System.in).nextInt(); if(x>10){ return true; }else{ return false; } } ·`异常信息:仅能传递 字符串 数据 示例代码: public static void main(String[] args){ boolean f; try{ run1(); }catch(Exception e){ String str = e.getMessage(); f = Boolean.parseBoolean(str); } } public static void run1(){ int x = new Scanner(System.in).nextInt(); if(x>10){ throw new RuntimeException("true"); }else{ throw new RuntimeException("false"); } }
6、finally规律:
finally外的代码是否执行,主要看当前try…catch…finally中是否有执行throws或return
若出现,则无法执行finally外的代码,因为方法被结束了
7、继承中的异常抛出和返回值类型
子类抛出异常/子类返回值类型 ≤ 父类抛出异常/父类返回值类型 例如: Object ------X1 ------X2 ------X3 返回值类型:父X1 子X1、X2、X3 抛出异常:父X1 子X1、X2、X3