Bootstrap

Java系统学习

一.计算机的演变

黑色命令行界面转变------>为可视化界面

在windows系统中的界面就是cmd

cmd:命令行形式的操作电脑方式

二.CMD

启动:win+R 打开命令,输入cmd,再点击回车键

cmd常见快捷键

1)盘符 + :    例如:E:   进入E盘

2)dir   显示当前文件下的所有文件

3)cd+文件名   进入一个文件

4)cd ..      回退上一级目录

5)cd  目录1\目录2

6)cd  \  一次性回到盘符目录

7)cls  清屏

8)exit

三.Java的下载与安装

下载网址:www.oracle.com

java程序运行分三步:

1.在记事本上写好对应的程序语句    a.java

2.打开cmd命令 ,进入这个程序文件的目录,然后通过  javac  a.java  命令编译该文件,得到一个.class文件

3.还是在cmd命令下,通过Java a的命令,即可执行该语句(注意这里的文件没有后缀名)

配置环境变量

目的:

具体步骤:

四.Java的特性

五:Java的键盘输入

注意:不要讲nextInt 和nextLine混用,不然在输入nextInt的时候nextLine接受不到数据

六:java跨平台的原理

 java程序是先经过编译成.class文件,然后在虚拟机中运行,而不是在windows,mac,linux系统中运行,所以它支持跨平台

七:Java基础概念

1.JRE和JDK

JRE:java Running Environment  java运行环境

JDK: java Develop kit   java 开发工具

 JDK>JRE>JVM

制表符:\t

'

八:数据的存储

计算机的三种存储数据:文本,图片,声音

1.文本的存储

2.图片

3.声音 

首先:所有的数据类型都是二进制存储的

进制间的转换

九:数据类型

数据类型:基本数据类型,引用数据类型

1.基本数据类型

 注意点:

1.在定义一个long类型的时候,如果数据很大,要在数字后面加上L

例如:long a=111111111L;

2.float类型的数据,在定义的数值后面需要加上F

float a=10.63F

十.标识符

标识符:给类,变量,方法起的名字

命名规则:

十一:键盘录入

键盘录入介绍:Scanner

十二:IDEA

1.下载:直接百度IDEA,在官网下载即可

2.IDEA项目结构

 3.重要的设置

1)字体大小设置

2)注释的颜色修改

3)自动导包

 4)提示忽略大小写

 5)设置IDEA背景图片

4.常见项目操作

关闭项目

十三:运算符

分类:

1.算术运算符

注意点:1.当使用除法的时候,10/3只取整数,得3

             2.小数参与运算,结果不一定精确   10/3.0=3.333334

算数类型转换

分类:隐式类型转换和强制转换


隐式转换的规律


 强制转换 

问题:大转小会出现数据的不安全,比如int a=300   如果强转为byte,那就会出现错误

还有一种特殊的情况:字符+数字   

这时候字符是对应着ASCII码表来查询的,字符参与运算时,会自动将字符和ASCII表进行转换

两个关键对应:A 65 ;a  97 

自增自减运算符

注意点:  int  a=10; 

1.System.out.println(++a);//11

2.System.out.println(a++);//10

结果是不一样的,a++表示先运算,再给a+1

                            ++a表示先给a+1,再参与运算

数值运算符: 

 +=.-=这些运算符都隐藏了强制转换

关系运算符

逻辑运算符

这4个运算符两边的条件都需要执行,所以效率低下

  ^异或运算:符号两边相同即为false,不同即为true

   !:逻辑非,也就是取反

短路逻辑运算符 :&& ,  ||

这个运算符代表A&&B  如果A为false.那么就不用去判断B了.这样就能提高代码执行效率

三元表达式

int num=10>20?50:60;

用一个变量去接受参数就可以了

注意:这个地方

前面的式子是作判断,如果是true,那么就取值第一个,false取值就是后面一个

十四:原码,反码,补码

1.原码 

2.反码

当数是正数,数的原码,反码,补码都是相同的;

如果是负数,那么除了首位,后面的都取反,补码会在末尾+1,这样是为了避免反码有0000000,1111111两种出现0的情况.

3.补码

正数的时候和原码,反码是一样的,如果是负数,则在末尾+1

不同类型的10在不同数据类型的区别

计算机中所有数据都是按照补码形式存储的

 0&1=false  只有两边都为1才为true.0&任何数都是0,1&任何数都是它本身

十五:流程控制语句

1.顺序结构

程序按照每句的行号进行运行

2.分支语句

if(判断条件){

程序体:

}

在if语句中,如果满足判断条件,那么就执行程序体中的语句

if(判断条件){

程序体1:

}else{

程序体2;

}

3.第三种if结构

if(){

}

else if(){

}

else{}

switch分支语句

 case穿透:如果在各个执行语句没有写break的话,那么就会结束switch语句,

jdk12新特性

简化了case语句 

循环语句

1.for循环

for(循环初始条件;循环判断条件;循环控制条件)

2.while循环

 

典型案例

 

循环条件控制语句

如果要跳过某次循环,那么就用continue语句,

 如果要结束当前循环,直接使用break语句.

生成随机数

 

十六:数组:

概念:一种容器,可以同时存储多个同种类型数据

数组的定义

int[] nums=new int{1,2,3};

或者 int[] nums={1,2,3};

如果我们去创建一个数组,然后直接打印它,那么会出现一串字符,这个字符信息就是这个数组的地址信息,

数组元素的获取:索引

相关注意点

1.索引也称为下标,从0开始

2..length代表数组的长度

3.arr.fori   快捷语句,可以快速遍历

数组的动态初始化

 默认初始化数值

数组常见异常:

数组越界异常

Java内存分配

 栈:所有的方法都会放在栈里面执行

堆:所有new出来的对象都会放在堆中,然后会返回一个地址值

十七:方法

方法:程序中最小的执行单元

作用:提高代码复用性,提高可维护性

重要概念:形参,实参

形参:定义在方法上的参数

实参:调用方法输入的参数

返回值:直接将方法执行的结果返回

方法的完整定义

 方法的注意事项

1.方法不调用就不执行

2.方法里面不能再定义方法         

方法的重载:

同一个类中,方法名相同,形参不同,即构成方法的重载,与返回值类型无关

return和break的关系

return是针对方法来说的,如果执行return,那么方法就直接结束,

break是针对循环的,如果循环体执行break.那么循环结束

方法应用时的基本传递方式

方法首先会被放在虚拟机的方法栈中,依次执行main方法中的程序,方法执行顺序是先进后出

基本数据类型和引用数据类型

基本数据类型:将数据存储在自己的空间内,方法栈中

引用数据类型:内存中存储的是地址值,而实际对象是存在在堆中的

在方法中参数的引用 

如果传递的是引用数据类型,那么方法就会对堆中的数据进行更改,也就是说两个方法改的是同一个值

十八.面向对象

面向对象的思想:其实这种思想和我们平时生活是类似的,比如人洗衣服,运动,人的身高,体重,这些都是以人为核心,通过人这个对象才能去查询对应的属性和方法,

类和对象

类:对有共同特征的对象的集合

对象:具体存在的一个东西

必须要先创建类,才能获取对象

创建对象的方法:类名  对象名=new 类名()

两种类的

1.javaBean类,用来描述某一类的相关信息,无main方法

2.测试类,包含main方法的类

注意点:一个类文件中可以创建多个类,但是public修辞的类只能有一个

封装

设计对象的方法,正确的设计属性和方法,从而直接调用

private关键字

成员变量和局部变量

成员变量:定义在类上的

局部变量:定义在方法内的变量

构造方法的注意事项

javaBean的快速构建

1.安装ptg插件

2.创建好一个类,然后设置对应的属性

右键鼠标,选择ptg然后,生成方法,构造方法

 

方法执行的流程

 首先这个类文件会被加载成为.class文件放在方法区中,然后执行main方法,如果new了一个对象,那么会把对象创建在堆中,对象信息中会存放对应的方法地址,栈区会存放对象的地址,

当对象要调用方法,栈会根据地址值找到堆中的对象,然后这个对象会找到方法区中对应的方法

如果没有指针指向堆中的对象,那么对象就会被回收

基本数据类型和引用数据类型

this关键字

String占位符

System.out.printf("%s你好呀%s", "张三", "李四");

注意是printf   有多少个占位符,那么后面就要接上多少个字符串

十九.API和字符串

API:Application Programming interface

应用程序接口,简单来说就是别人写好的东西,我们不用自己编写,直接使用即可

即java已经封装的各种类 

字符串

String

注意点:String是不可变的,它的值在创建之后就不能再被更改

创建String的方式

字符串内容的比较

对一个字符串,取其任意个字符,用charAt()方法 

char类型的数据在参与运算的时候,会自动转换成int类型,根据ASCII表作运算

StringBuilder

概念:可以看做是一个容器,用来存放多个数据,主要用来拼接字符串

常见方法


StringJoiner(如果一个字符串中间由间隔符号组成,那么推荐使用)

 在创建对象的时候就已经指定了拼接的中间连接符号,

主要方法

字符串的原理

 

二十:集合

集合和数组的区别

1.长度,数组是定长的,集合长度可变

2.存储的数据类型:数组可以存基本类型和引用类型,而集合只能存储引用数据类型

ArrayList的成员方法

包装类:能够将基本数据类型转换为包装类,然后就可以加入到集合中去了 

两个代码的知识点

1.如果我们在循环语句里面嵌套了switch语句,那么break是采用的就近原则,

如果我们要用break控制外面的循环, 这时候我们可以给外面的循环加一个标记.

 2.如果要停止虚拟机,则可以采用System.exit(0)方法停止虚拟机

static关键字

当一个类被加载的时候,那么类的静态变量也会被加载到堆内存中,也称之为静态存储区,这时候所有的对象都可以去获取这个静态变量

 

工具类:帮助我们做一些事情的类

在创建工具类后,构造方法要设置为私有

虽然我们在使用静态方法的时候是直接调用的,实际是省略了this关键字

静态方法注意点

1.静态方法没有this关键字:其实每次对象去调用方法的时候,虚拟机会将该对象赋值给this,然后用this去调用方法,所以在非静态方法下,每次调用的this都是和对象相关的

2.静态方法只能调用静态方法

3.非静态方法可以访问所有

二十一:继承

关键字:extends

什么是继承:继承是面向对象的三大特征之一,即子类能继承父类的信息

继承的格式:public class extends A(){}

子类的特点:1.子类能够继承父类的所有属性和方法

                     2.子类还能延伸出新的属性和方法

继承的特点:java支持单继承,不支持多继承,但是支撑多层继承

注意点

1.每个类都直接或者间接继承自Object,任何子类都可以调用父类和间接父类的属性和方法

2.子类只能访问父类中非私有的数据

子类到底能继承父类的哪些内容:

1.子类能继承父类所有的成员变量

2.但构造方法不能继承,

3.成员方法只能继承非私有的

 子类继承父类的方法是有限制的

成员变量的访问规则:就近原则,同样的变量名字,先访问子类的变量

成员方法的访问同样遵循就近原则

方法的重写

 方法重写的本质:虚方法的覆盖

方法重写的注意事项

在继承中的构造方法访问特点

在创建子类对象的时候,会先创建父类对象,因为必须先加载父类对象中的属性和方法,才能被子类进行调用.

子类构造方法的第一句默认是super(),

this和super

二十二:多态:同种类型的对象,表现出不同的形式

比如创建了一个人的对象,在不同场景下发挥学生,老师,管理员的功能

多态的表现形式:父类对象  对象名=子类对象;

多态的前提:

1.继承

2.父类引用指向子类对象

3.方法的重写

多态调用成员变量和成员方法的规则

多态的优势

1.首先是对应的不同子类对象可以调用不同的子类方法

2.其次设计方法的时候,可以将父类作为形参,这样就可以接受多种的子类对象

多态的弊端:如果子类对象中有父类中没有的新方法,那么

instanceof关键字

a instanceof b :a对象是不是b类的

instanceof 的jkd14新特性:

package:包,用来管理我们的代码

全类名:包名+类名

导包的规则

final关键字

 

导入一个模块的方法

权限修辞符 

代码块

1.局部代码块

在方法内部定义一个代码块,目的是让变量尽快消失,代码块执行完毕,则变量消失

2.构造代码块:写在成员变量的位置,在构造方法执行之前执行

3.静态代码块:格式:static{} ,当类加载时即执行,且只执行一次

二十三.抽象类

1.格式:public  abstract class  类名(){}
2.注意点:

1)抽象类不能实例化

2)抽象类中不一定有抽象方法,有抽象方法的一定是抽象类

3)抽象类可以有构造方法

抽象方法是没有方法体的,并且抽象方法在子类中必须实现

什么情况下会用抽象类:在团队开发中,需要规定某个方法的格式,将该方法设置为抽象方法,那么不同子类在实现实现这个抽象方法的时候就有统一的格式

二十四:接口

1.定义:public interface 接口名字{}

2.接口的实现关键字: implements

接口能够多实现

接口成员的特点

1.默认修辞符:public

2.没有构造方法

3.接口方法在jdk8之前默认是public abstract 修辞,后面可以定义实例方法

jdk8新增有方法体的方法

 

 

设计模式:解决问题的套路

适配器设计模式:

有一个接口定义了非常多的方法,这时候如果创建一个类A去实现它,那么就产生了太多不必要的方法实现,这时候我们可以创建一个类B(类B一般设置为抽象类)去实现这个接口,然后用A去继承B接口,这样就能只针对我们想要的方法进行重写

二十五:内部类

内部类中外部类不能访问内部类的变量,但是内部类能随意访问外部类的成员变量.

如果要访问外部类中的变量,需要在外部类的方法中创建一个内部类的对象,通过对象去调用属性

内部类的分类

1.成员内部类

在类中再创建一个类

 2.静态内部类

3.最重要的匿名内部类

二十六:常见的API

Math

常见方法

 开平方根 sqrt(),开立方根 cbrt();\

System

runtime:需要先创建runtime对象,然后才能调用相关方法 ,即Runtime.getRuntime

object

equals方法,a.equals(b),会先判断b是不是string类型的,如果不是,直接返回false,如果是,再判断内容

public class Demo1 {
    public static void main(String[] args) {
        //1.BigInter的第一种创建方式,第一个参数为指定随机数的大小为2的4次方
        BigInteger bigInteger=new BigInteger(4,new Random());
        System.out.println(bigInteger);
        //2.获取一个指定大小的数
        BigInteger bigInteger1=new BigInteger("1000");
        System.out.println(bigInteger1);
        //3.获取规定进制的最大整数
        BigInteger bigInteger3=new BigInteger("1110011",2);
        System.out.println(bigInteger3);

    }
}

bigInteger的方法

Bigdecimal:用于表示精确小数

方法

二十五:正则表达式

作用:1.用来校验字符串是不是满足一定的规律

         2.用来查找我们要找的内容

规则

 \转义字符

    //  转义字符
        System.out.println("\"");
     System.out.println("C:\\itcast\\javaSE");

\\代表第一个\将第二个\转义为正常的\

简单记忆:java中\\就代表一个\ 

简单案例

package regex;

public class Demo {
    public static void main(String[] args) {
         String s="643904304";
        System.out.println(s.matches("[0-9]\\w{5,10}"));


        //存在a
        System.out.println("a".matches("[abc]"));
        System.out.println("ab".matches("[abc][bcd]"));


        //不存在a
        System.out.println("a".matches("[^abc]"));
        //如果前面有两个字符,那么后面匹配的规则就有多少个[];

        //匹配a-zA-Z
        System.out.println("a".matches("[a-zA-Z]"));

        //如果要写两个范围的交集,要用&&
        System.out.println("a".matches("[a-z&&[A-Z]]"));


        //匹配任意一个字符
        System.out.println("唉y".matches(".."));

        //匹配\\d
        System.out.println("10".matches("\\d\\d"));

        //  \\w只能代表一个英文或者数字
        System.out.println("a".matches("\\w"));

        // \\W代表非单词字符
        System.out.println("a".matches("\\W"));


        // {6,}代表某个数至少出现6次
        System.out.println("abcdef".matches("\\w{6,}"));
        System.out.println("abcdef".matches("[a]{1}"));

    }
}

在工作中,一般不需要我们去写正则表达式,只需要在百度或者其他渠道去匹配就好了,这里推荐一个插件any-rule

 

爬虫:用来在文本中找到我们要查找的内容

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo3 {
    public static void main(String[] args) {
        String str="java自充面世以来,已经冲java7更新到java18了";
        //指定爬虫规则,即正则表达式规则
        Pattern p = Pattern.compile("java\\d+");
        
        //找到对应的索引
        Matcher matcher = p.matcher(str);
        
        //通过索引找到符合条件的段落
        
        while (matcher.find()) {
            //找到匹配的字符串,按照索引进行截取
            String group = matcher.group();
            System.out.println(group);
        }

    }
}

二十六:常用API

1.时间类 

SimpleDatefornat

Calender类:抽象类.不能直接创建对象

  

jdk8的新时间

包装类:将基本数据类型包装起来,然后转换成引用数据类型

 1.包装类如果要进行数值运算,是需要拆箱的,也就是说将其转换为基本类型,但是在jdk5之后,就引入了自动装箱和自动拆箱

当我们用Scanner键盘录入的时候,如果点击空格,回车就会停止输入,所以应该用nextLine方法避免该情况

算法:

1.查找

顺序查找:将数组中的元素按照索引依次查找,直至找到对应的元素

二分查找:在有序的数组中,每次查找排除一半的数字

2..排序算法

冒泡排序:相邻元素两两比较,小的放左边,大的放右边,第一轮循环能找到最大值,每轮都能找到剩下数据中的最大值

3.插入排序:先将一个数组分为两部分,第一部分是有序的,第二部分无序,依次将无序部分的每一个数与有序部分每个数进行比较,然后找到对应的位置插入进去

4.递归算法

方法A里面引用了A方法,一定要设置出口

5.快速排序

Arrays:操作数组的工具类

 Arrays的sort方法可以直接对Integer类型的数组做正序或者倒序的排序

package Arrays;

import java.util.Arrays;
import java.util.Comparator;

public class Demo2 {
    public static void main(String[] args) {
        Integer[] arr={3,4,1,2,5,6,7};

        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        System.out.println(Arrays.toString(arr));

    }
}

lambda表达式

 格式

 lambda表达式的限制:只有函数式接口才能使用

 lambda表达式的省略规则

二十七:集合进阶

分为两大类:

体系结构

collection的主要方法

 Collection 是一个接口,不能直接创建对象,我们需要通过多态的方式创建其子类对象  

集合遍历的三种通用方式

由于set集合没有索引,所以不能使用fori形式遍历

迭代器遍历

package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Demo2 {
    public static void main(String[] args) {
        Collection<String> collection=new ArrayList<>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        collection.add("ddd");
        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }


    }
}

增强for遍历:简化迭代器遍历

package collection;

import java.util.ArrayList;
import java.util.Collection;

public class Demo3 {
    public static void main(String[] args) {
        Collection<String> collection=new ArrayList<>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        collection.add("ddd");
      for (String s:collection){
          System.out.println(s);
      }
       

    }
}

lambda遍历

List

List遍历选型

二十八:数据结构

概念:计算机底层存储,组织数据的方式

1.栈:先进先出

2.队列:先进先出,后进后出

3.数组:通过索引查找数据,查询快,删除慢(数据会前移)

4.链表:每个节点包含数据和指针,链表查询慢.增删快

ArrayList的底层原理

LinkedList底层原理

 

泛型

好处:1.统一了数据类型

         2.将运行时的问题提前到了编译阶段

泛型的细节

 

泛型的使用场景

 

 

 

泛型的通配符:可以指定泛型的范围

? extends A  代表A和A的子类才能作为形参执行到方法里面

? super   B  代表B和B的父类才能作为形参执行

 

二叉树

 二叉树的遍历方式

 

平衡二叉树:每个节点的左右子树高度差不超过1

 

 

红黑树 

 

 

 

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;