Java基础中的基础—- Java语法必背规律

简介: Java基础中的基础—- Java语法必背规律

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


目录
相关文章
|
1月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
59 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
27天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
42 1
|
28天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
32 2
|
14天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
27天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
20 1
|
27天前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
20 1
|
28天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
Kotlin语法笔记(28) -Kotlin 与 Java 混编
25 2
|
1月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
43 3
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
20 1
|
1月前
|
Oracle Java 关系型数据库