Java基础进阶(学习笔记)

news2024/11/19 16:33:53

注:本篇的代码和PPT图片来源于黑马程序员,本篇仅为学习笔记

static

static 静态的意思,可以修饰成员变量,也可以修饰成员方法

修饰成员的特点:

被其修饰的成员, 被该类的所有对象所共享

多了一种调用方式, 可以通过类名调用

随着类的加载而加载, 优先于对象存在

class User {
    String name;
    int age;
    static int onLineNumber;
}
public class StaticTest1 {
    public static void main(String[] args) {
        User.onLineNumber++;
        User u1 = new User();
        u1.name = "张三";
        u1.age = 23;
        sout(u1.name + "---" + u1.age

  + "---" + u1.onLineNumber);
        User.onLineNumber++;
        User u2 = new User();
        u2.name = "李四";
        u2.age = 24;
        sout(u2.name + "---" + u2.age

  + "---" + u2.onLineNumber);
    }
}

张三﹣--23---1
李四﹣--24---2

注意事项:

static 方法中只能访问静态成员 (直接访问)

static 中不允许使用 this 关键字

重新认识main方法

public class HelloWorld {
    public static void main(String[] args) {
  System.out.println("HelloWorld");

    }
}
public:  JVM 调用,访问权限足够大
static   JVM 调用,不用创建对象

  因为main方法是静态的,所以测试类中其他方法也需要是静态的

void   JVM 调用,不需要给 JVM 返回值
main   一个通用的名称,虽然不是关键字,但是被 JVM 识别
String[] args :   以前用于接收键盘录入数据的,现在没用

继承

类与类之间产生关系(子父类关系),子类可以直接使用父类非私有的成员

成员变量

public class Fu {
    int num = 10;
}
class Zi extends Fu {
    int num = 20;

    public void method(){
        int num = 30;
        System.out.println(num);            // 30
        System.out.println(this.num);       // 20
        System.out.println(super.num);      // 10
    }
}

成员方法

子类重写父类方法,需要保证方法声明完全一致(方法名,参数,返回值类型需要保持一致)

目标1: 能够独立识别出, 方法是不是重写的方法

- @Override

目标2: 清楚方法重写的使用场景

- 当子类需要父类的方法, 但是觉得父类的方法逻辑不好 (修改 | 增强)

  就可以对父类的方法进行重写

注意

父类中私有方法不能被重写

子类重写父类方法时,访问权限必须大于等于父类

继承特点:

Java只支持单继承,不支持多继承,但支持多层继承

public static void main(String[] args) {
    Student stu = new Student("钢门吹雪", 23, 100);
    sout(stu.getName() + "---" + stu.getAge() +

         "---" + stu.getScore());
}
public class Student extends Person{
    private int score;
    public Student(String name, int age, int score) {
        super(name, age);
        this.score = score;
    }
}
public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

final关键字

final 关键字是最终的意思,可以修饰(方法,类,变量)

final 修饰的特点

修饰方法:表明该方法是最终方法,不能被重写

修饰类:表明该类是最终类,不能被继承

修饰变量:表明该变量是常量,不能再次被赋值

public class Test {
    public static final String schoolName="au";
    private final String name="c";//无意义
    public static void main(String[] args) {
        //final只能赋值一次
        final int a;
        a=12;
        final double r=3.14;
    }
    public static void buy(final double z){
        
    }
}

final class A{}

class C{
    public void test(){
        
    }
}
class D extends C{
    
}

final 修饰变量的细节补充

变量是基本类型:final 修饰指的是基本类型的数据值不能发生改变

变量是引用类型:final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的

成员变量如果被 final 修饰,需要在构造方法结束之前完成赋值

抽象类

抽象类是一种特殊的父类,内部可以编写方法

抽象方法:将共性的行为(方法抽取到父类之后,发现该方法的实现逻辑,无法在父类中给出具体明确,该方法就可以定义为抽象方法。

抽象类:如果一个中存在抽象方法,那么该类就必须声明为抽象类

抽象方法的定义格式:

public abstract 返回值类型 方法名(参数列表);

抽象类的定义格式:

public abstract class 类名{}

注意:

抽象类不能实例化

抽象类存在构造方法

抽象类中可以存在普通方法

抽象类的子类

要么重写抽象类中的所有抽象方法

要么是抽象类

public class Test {
    public static void main(String[] args) {
        Teacher t=new Teacher();
        t.write();
        System.out.println("--------------------------------");
        Student s=new Student();
        s.write();
    }
}
public abstract class People {
    public final void write(){
        System.out.println("\t\t\t\t\t\t《GGB》");
        System.out.println("\t\t哦GGB童话里做英雄");
        System.out.println(writeMain());
        System.out.println("GGGGGBBBB!");
    }
    public abstract String writeMain();
}
public class Student extends People {

    @Override
    public String writeMain() {
        return "啊啊啊啊啊啊啊";
    }
}
public class Teacher extends People {

    @Override
    public String writeMain() {
        return "啦啦啦啦啦啦啦";
    }
}

接口

接口用关键字interface来定义

public interface 接口名 {}

接口不能实例化

接口和类之间是实现关系,通过implements关键字表示

public class 类名 implements 接口名 {}

接口的子类(实现类)

要么重写接口中的所有抽象方法

要么是抽象类

接口

综合案例:

public class Test {
    public static void main(String[] args) {
        ClassManager clazz=new ClassManager();
        clazz.printInfo();
        clazz.printScore();
    }
}
public class Student {
    private String name;
    private char sex;

    public Student() {
    }

    private double score;

    public Student(String name, char sex, double score) {
        this.name = name;
        this.sex = sex;
        this.score = score;
    }
import java.util.ArrayList;

public class ClassManager {
    private ArrayList<Student> students=new ArrayList<>();
    private StudentOperator studentOperator=new StudentOperator1();

    public ClassManager(){
        students.add(new Student("迪丽热巴",'女',99));
        students.add(new Student("古力娜扎",'女',99));
        students.add(new Student("马儿扎哈",'女',80));
        students.add(new Student("卡尔扎巴",'女',60));
    }
    public void printInfo(){
        studentOperator.printAllInfo((students));
    }

    public void printScore(){
        studentOperator.printAverageScore(students);
    }
}
import java.util.ArrayList;

public interface StudentOperator {
    void printAllInfo(ArrayList<Student> students);
    void printAverageScore(ArrayList<Student> students);
}
import java.util.ArrayList;

public class StudentOperator1 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("------------ 全班学生信息如下------------");
        for (int i = 0; i < students.size(); i++) {
            Student s=students.get(i);
            System.out.println("姓名:"+s.getName()+",性别"+s.getSex()+",成绩:"+s.getScore());
        }
        System.out.println("-----------------------------------------");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore=0.0;
        for (int i = 0; i < students.size(); i++) {
            Student s=students.get(i);
            allScore+=s.getScore();
        }
        System.out.println("平均分,"+(allScore)/ students.size());
    }
}
import java.util.ArrayList;

public class StudentOperator2 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("------------ 全班学生信息如下------------");
        int count1=0;
        int count2=0;
        for (int i = 0; i < students.size(); i++) {
            Student s=students.get(i);
            System.out.println("姓名:"+s.getName()+",性别"+s.getSex()+",成绩:"+s.getScore());
            if(s.getSex()=='男'){
                count1++;
            }else {
                count2++;
            }
        }
        System.out.println("男生人数是:"+count1+",女生人数是:"+count2);
        System.out.println("班级总人数是:"+students.size());
        System.out.println("-----------------------------------------");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore=0.0;
        double max=students.get(0).getScore();
        double min=students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            Student s=students.get(i);
            if(s.getScore()>max) max=s.getScore();
            if(s.getScore()<min) min=s.getScore();
            allScore+=s.getScore();
        }
        System.out.println("学生的最高分是:"+max);
        System.out.println("学生的最低分是:"+min);
        System.out.println("平均分,"+(allScore-max-min)/ (students.size()-2));
    }
}

多态

多态的成员访问特点

成员变量:编译看左边(父类),执行看左边(父类)

成员方法:编译看左边(父类),执行看右边(子类)

多态的好处 :提高了程序的扩展性

对象多态 : 将方法的形参定义为父类类型, 这个方法可以接收该父类的任意子类对象

行为多态 : 同一个行为, 具有多个不同表现形式或形态的能力

public class Test {
    public static void main(String[] args) {
        People p1=new Teacher();
        p1.run();
        System.out.println(p1.name);

        People p2=new Student();
        p2.run();
        System.out.println(p2.name);
    }
}
public class People {
    public String name="父类Peoplet的名称";
    public void run(){
        System.out.println("人可以跑~");
    }
}
public class Student extends People{
    public String name="子类Student的名称";
    @Override
    public void run() {
        System.out.println("学生跑得快~~");
    }
}
public class Teacher extends People{
    public String name="Teacher的名称";
    @Override
    public void run() {
        System.out.println("跑的气喘吁吁~~");
    }
}

多态的转型问题

概述:如果被转的引用类型变量,对应的实际类型目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException

关键字 instanceof

使用格式:

对象名 instanceof 类型

判断一个对象是否是一个类的实例

通俗的理解:判断关键字左边的对象,是否是右边的类型,返回boolean类型结果

public class Test {
    public static void main(String[] args) {
        People p1=new Student();
        p1.run();
        
        if(p1 instanceof Student){
            Student s1=(Student) p1;
            s1.test();
        }else {
            Teacher t2=(Teacher) p1;
            t2.teach();
        }
    }
}
public class Student extends People{
    public String name="子类Student的名称";
    @Override
    public void run() {
        System.out.println("学生跑得快~~");
    }
    public void test(){
        System.out.println("学生需要考试");
    }
}
public class Teacher extends People{
    public String name="Teacher的名称";
    @Override
    public void run() {
        System.out.println("跑的气喘吁吁~~");
    }
    public void teach(){
        System.out.println("老师需要教书");
    }
}

接口新特性

JDK8的新特性:接口中可以定义有方法体的方法。(默认、静态)

JDK9的新特性:接口中可以定义私有方法。

JDK8 接口特性

允许在接口中定义非抽象方法,但是需要使用关键字 default 修饰,这些方法就是默认方法

作用:解决接口升级的问题

接口中默认方法的定义格式:

格式:public default 返回值类型 方法名(参数列表) {}

范例:public default void show() {}

注意:

1.默认方法不是抽象方法,所以不强制被重写  (但是可以被重写,重写的时候去掉default关键字)

2.public可以省略,default不能省略

3.如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写

接口中允许定义 static 静态方法

接口中静态方法的定义格式:

格式:public static 返回值类型 方法名(参数列表) {}

范例:public static void show() {}

注意:

1.静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

2.public可以省略,static不能省略

JDK9 接口特性

接口中允许定义 private 私有方法

接口中静态方法的定义格式:

格式1private 返回值类型 方法名(参数列表) {}

范例1private void show() {}

格式2private static 返回值类型 方法名(参数列表) {}

范例2private static void method() {}

public class Test {
    public static void main(String[] args) {
     B b=new B();
     b.test1();
     A.test3();
    }
}
public interface A {
    public default void test1(){
        System.out.println("==默认方法==");
        test2();
    }

    private void test2(){
        System.out.println("==私有方法==");
    }

    public static void test3(){
        System.out.println("==静态方法==");
    }
}
public class B implements A{
}

接口的多继承

作用:便于实现类去实现

public class Test {
    public static void main(String[] args) {

    }
}

interface A{
    void test1();
}
interface B{
    void test2();
}
interface C{}

interface D extends C,B,A{

}
class E implements D{

    @Override
    public void test1() {
        
    }

    @Override
    public void test2() {

    }
}

注意:

1.一个接口继承多个接口,如果多个接口存在方法签名冲突,则此时不支持多继承

2.一个类实现多个接口,如果多个接口存在方法签名冲突,则此时不支持多实现

3.一个类继承了父类,又同时实现接口,父类和接口中有同名的默认方法,会优先使用父类

4.一个类实现多个接口,多个接口中存在同名的默认方法。可以不冲突,这个类重写该方法即可

内部类

创建对象的格式 :

格式:外部类名.内部类名 对象名 = new 外部类对象().new 内部类对象();
范例:Outer.Inner in =
new Outer().new Inner();

public class Test {
    public static void main(String[] args) {
        Outer.Inner in=new Outer().new Inner();
        in.test();
    }
}
public class Outer {
    public class Inner{
        private String name;
        public static String schoolName;
        public void test(){

        }
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }


    }
}

内部类成员访问

内部类中, 访问外部类成员 : 直接访问, 包括私有

外部类中, 访问内部类成员 : 需要创建对象访问

class Outer {
    int num = 150;
    class Inner {
        int num = 110;
        public void show(){
            int num = 78;
            System.out.println(num); // 78
            System.out.println(this.num); // 110
            System.out.println(Outer.this.num); // 150
        }
    }
}

匿名内部类

概述:匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)

前提:需要存在一个接口或类

new 类名 / 接口 () {
   
}

public class Test {
    public static void main(String[] args) {
//        Animal a=new Cat();
//        a.cry();

        Animal a=new Animal(){
            @Override
            public void cry() {
                System.out.println("喵喵喵喵的叫~~~");
            }
        };
        a.cry();
    }

}
//class Cat extends Animal{
//
//    @Override
//    public void cry() {
//        System.out.println("喵喵喵喵的叫~~~");
//    }
//}

abstract class Animal{
    public abstract void cry();
}

枚举

枚举是一种特殊的类

特点:

●枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
●枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
●枚举都是最终类,不可以被继承。
●枚举类中,从第二行开始,可以定义类的其他各种成员。
●编译器为枚举类新增了几个方法,并且枚举类都是继承: java . lang . Enum 类的,从 enum 类也会继承到一些方法。

public class Test {
    public static void main(String[] args) {
        A a1=A.X;
        System.out.println(a1);
        
        B y=B.Y;
        y.go();
    }
}
public enum B {
    X(){
        public void go(){

        }
    },Y(){
        @Override
        public void go() {

        }
    };
    public abstract void go();
}
public enum A {
    X,Y,Z;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



}

枚举的应用场景:做信息标志和分类

public class Test {
  
    public static void main(String[] args) {
        check(Constant2.BOY);
    }
    public static void check(Constant2 sex){
        switch (sex){
            case BOY:
                System.out.println("游戏信息");
                break;
            case GIRL:
                System.out.println("土豪信息");
                break;
        }
    }
}
public enum Constant2 {
    BOY,GIRL;
}

泛型

作用:提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及可能出现异常

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add("kava");
        for (int i = 0; i < list.size(); i++) {
            String e= (String) list.get(i);
            System.out.println(e);
        }
        System.out.println("----------------------------");
        ArrayList<String> list1=new ArrayList<String>();
        list1.add("java1");
        //list1.add(new Cat())

        for (int i = 0; i < list1.size(); i++) {
            String e=list1.get(i);
            System.out.println(e);
        }
    }
}
class Cat{}

泛型类

public class Test {
    public static void main(String[] args) {
        MyArrayList<String> list=new MyArrayList<>();
        list.add("java1");
        list.add("java2");
        String ele= list.get(1);
        System.out.println(ele);
    }
}
public class MyArrayList<E> {
    public boolean add(E e){
        return true;
    }
    public E get(int index){
        return null;
    }
}

泛型接口

public class Test {
    public static void main(String[] args) {
      
    }
}
public class Teacher {
}
public class Student {
}
import java.util.ArrayList;

public interface Data<T> {
    void add(T t);
    ArrayList<T> getByName(String name);
}
public class StudentData implements Data<Student>{
    @Override
    public void add(Student student) {

    }

    @Override
    public ArrayList<Student> getByName(String name) {
        return null;
    }
}
public class TeacherData implements Data<Teacher>{
    @Override
    public void add(Teacher teacher) {

    }

    @Override
    public ArrayList<Teacher> getByName(String name) {
        return null;
    }
}

泛型方法、泛型的通配符和上下限

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        String rs=test("java");
        System.out.println(rs);
        
        Dog d=test(new Dog());
        System.out.println(d);
        
        ArrayList<CAr> cars=new ArrayList<>();
        cars.add(new BENZ());
        cars.add(new BMW());
        go(cars);
        
//        ArrayList<Dog> dogs=new ArrayList<>();
    }
    public static void go(ArrayList<? extends CAr> cars){
        
    }
    public static <T> T test(T t){
        return t;
    }
}

通配符:?,代表一切类型

API

API(Application Programming interface)  应用程序编程接口。

简单来说:就是 Java 帮我们已经写好的一些类和方法,我们直接拿过来用就可以了

Object类

所有的类,都直接或者间接的继承了 Object 类 (祖宗类)

Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。

toString存在的意义

父类 toString() 方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!!

equals存在的意义

父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则。

public class Test {
    public static void main(String[] args) {
        Student s1=new Student("au",23);
        //System.out.println(s1.toString());
        System.out.println(s1);

        Student s2=new Student("au",23);
        System.out.println(s2.equals(s1));
    }

}
import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
//eq
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }



    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 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) {
        this.age = age;
    }
}

protected Object clone() 对象克隆

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
    User u1=new User(1,"zhangsan","wo666",new double[]{99.0,99.5});

        System.out.println(u1.getId());
        System.out.println(u1.getUsername());
        System.out.println(u1.getPassword());
        System.out.println(u1.getScores());
    User u2=(User)u1.clone();
        System.out.println(u2.getId());
        System.out.println(u2.getUsername());
        System.out.println(u2.getPassword());
        System.out.println(u2.getScores());
    }

}
//Cloneable是一个标记接口
public class User implements Cloneable{
    private int id;
    private String username;
    private String password;
    private double[] scores;

    public User() {
    }

    public User(int id, String username, String password, double[] scores) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.scores = scores;
    }
//clone
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double[] getScores() {
        return scores;
    }

    public void setScores(double[] scores) {
        this.scores = scores;
    }
}

public class Test {
    public static void main(String[] args) {
        String s1="auc";
        String s2=null;

        System.out.println(s1.equals(s2));//错误
        System.out.println(Objects.equals(s1,s2));

        System.out.println(Objects.isNull(s1));//false
        System.out.println(Objects.nonNull(s2));//true
    }
}

包装类

包装类就是吧基本类型的数据包装成对象

public class Test {
    public static void main(String[] args) {
      Integer a2=Integer.valueOf(12);
        System.out.println(a2);
        
        Integer a3=12;
        
        int a4=a3;

        ArrayList<Integer> list=new ArrayList<>();
        list.add(12);
        
        int rs= list.get(1);
    }
}
    System.out.println("---------------------------");
        Integer a=23;
        String rs1=Integer.toString(a);
        System.out.println(rs1+1);

        String rs2=a.toString();
        System.out.println(rs2+1);

        String agsStr="29";
        int ageI=Integer.parseInt(agsStr);
        System.out.println(ageI+1);

        String scoreStr="99.5";
//        double score=Double.parseDouble(scoreStr);
        double score=Double.valueOf(scoreStr);
        System.out.println(score+0.5);

StringBuilder

● StringBuilder 代表可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的。

●好处: StringBuilder 比 String 更适合做字符串的修改操作,效率会更高,代码也会更简洁。
 

public class Test {
    public static void main(String[] args) {
        StringBuilder s=new StringBuilder("auc");

        //拼接内容
        s.append(12);
        s.append("n");
        s.append(true);

        s.append(666).append("xxx").append(2323);

        System.out.println(s);
        //反转
        s.reverse();
        System.out.println(s);

        //长度
        System.out.println(s.length());

        //把对象转成String类型
        String rs=s.toString();
        System.out.println(rs);
    }
}

StringBuffer

线性安全,同StringBuffer功能相同

案例:用于返回任意整形数组的内容,要求返回的数组内容格式如:【11,22,33】

public class Test {
    public static void main(String[] args) {
        System.out.println(getArrayData(new int[]{11, 22, 33}));
    }

    public static String getArrayData(int[] arr){
        if(arr==null){
            return null;
        }
        StringBuilder sb=new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                sb.append(arr[i]);
            }else {
                sb.append(arr[i]).append(",");
            }
        }
        sb.append("]");

        return sb.toString();
    }
}

StringJoiner

提供字符串的操作效率,代码更简洁

public class Test {
    public static void main(String[] args) {
        StringJoiner s=new StringJoiner(",","[","]");
        s.add("java1");
        s.add("java2");
        s.add("java3");
        System.out.println(s);
    }
}

Math、System、Runtime

public class Test {
    public static void main(String[] args) {
        System.out.println(Math.abs(-12));
        System.out.println(Math.abs(-3.14));

        System.out.println(Math.ceil(4.00000001));
        System.out.println(Math.ceil(4.0));

        System.out.println(Math.floor(4.9999999));
        System.out.println(Math.floor(4.0));

        System.out.println(Math.round(3.4999));
        System.out.println(Math.round(4.50001));

        System.out.println(Math.max(10, 20));
        System.out.println(Math.min(10, 20));

        System.out.println(Math.pow(2, 3));
        System.out.println(Math.pow(3, 2));

        System.out.println(Math.random());//{0.0,1.0)

        

    }
}

public class Test {
    public static void main(String[] args) {
//        System.exit(0);
        System.out.println("--------------------");

        long time=System.currentTimeMillis();
        System.out.println(time);

        for (int i = 0; i < 1000; i++) {
            System.out.println("输出了"+i);
        }
        long time2=System.currentTimeMillis();
        System.out.println((time2-time)/1000.0+"s");
    }
}

Runtime

public class Test {
    public static void main(String[] args) throws IOException {
        Runtime r=Runtime.getRuntime();

        System.out.println(r.availableProcessors());

        System.out.println(r.totalMemory()/1024.0/1024.0+"MB");

        System.out.println(r.freeMemory()/1024.0/1024.0+"MB");
    }
}

BigDecimal

解决浮点运算问题

public class Test {
    public static void main(String[] args) throws IOException {
       double a=0.1;
       double b=0.2;
       double c=a+b;
        System.out.println(c);
        System.out.println("-------------------");
//
//        BigDecimal a1=new BigDecimal(Double.toHexString(a));
//        BigDecimal b1=new BigDecimal(Double.toHexString(b));
        BigDecimal a1=BigDecimal.valueOf(a);
        BigDecimal b1=BigDecimal.valueOf(b);

        BigDecimal c1=a1.add(b1);
        System.out.println(c1);

        BigDecimal i=BigDecimal.valueOf(0.1);
        BigDecimal j=BigDecimal.valueOf(0.3);
        BigDecimal k=i.divide(j,2, RoundingMode.HALF_UP);
        System.out.println(k);

        double rs=k.doubleValue();
        System.out.println(rs);
    }
}

Date

public class Test {
    public static void main(String[] args) throws IOException {
      Date d=new Date();
        System.out.println(d);

        long time=d.getTime();
        System.out.println(time);

        time+=2*1000;//把时间毫秒值转换成日期对象,2s之后时间是多少
        Date d2=new Date(time);
        System.out.println(d2);

        Date d3=new Date();
        d3.setTime(time);
        System.out.println(d3);
    }
}

SimpleDateFormat

public class Test {
    public static void main(String[] args) throws IOException, ParseException {
      Date d=new Date();
        System.out.println(d);

        long time=d.getTime();
        System.out.println(time);

        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE a");
        String rs=sdf.format(d);
        System.out.println(rs);
        System.out.println("--------------------------");

        //解析字符串时间
        String dateStr="2022-12-12 12:12:11";
        SimpleDateFormat sdf2=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        Date d2=sdf2.parse(dateStr);
        System.out.println(d2);
    }
}

1、SimpleDateFormat 代表什么,有什么作用?

可以把日期对象格式化成我们想要的形式;

可以把字符串的时间形式解析成Date日期对象。

2SimpleDateFormat 的对象如何创建?

public SimpleDateFormat​(String pattern)

3SimpleDateFormat 格式化,以及解析时间的方法是哪些?

public final String format(Date d):格式化日期对象

public Date parse​(String source):解析字符串时间

案例:时间秒杀活动

public class Test {
    public static void main(String[] args) throws IOException, ParseException {
     String start="2023年11月11日 0:0:0";
     String end="2023年11月11日 0:10:0";
     String xj="2023年11月11日 0:01:18";
     String xp="2023年11月11日 0:10:57";

     SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
     Date startDt=sdf.parse(start);
     Date endDt=sdf.parse(end);
     Date xjDt=sdf.parse(xj);
     Date xpDt=sdf.parse(xp);

     long startTime=startDt.getTime();
     long endTime= endDt.getTime();
     long xjTime= xjDt.getTime();
     long xpTime= xpDt.getTime();

     if(xjTime>=startTime && xjTime<=endTime){
         System.out.println("小贾秒杀成功~~");
     }else {
         System.out.println("小贾秒杀失败~~");
     }
     if(xpTime>=startTime && xpTime<=endTime){
            System.out.println("小皮秒杀成功~~");
     }else {
            System.out.println("小皮秒杀失败~~");
     }
    }
}

Calendar

代表的是系统此刻时间对应的日历,通过它可以单独获取、修改时间中的年、月、日、时、分、秒等。

public class Test {
    public static void main(String[] args) {
        Calendar now=Calendar.getInstance();
        System.out.println(now);

        int year=now.get(Calendar.YEAR);
        System.out.println(year);

        Date d=now.getTime();
        System.out.println(d);

        long time=now.getTimeInMillis();
        System.out.println(time);

        now.set(Calendar.MONTH,9);
        System.out.println(now);

        now.add(Calendar.DAY_OF_YEAR,100);
        System.out.println(now);

    }
}

JDK8新增时间API

public class Test {
    public static void main(String[] args) {
        LocalDate ld=LocalDate.now();
        System.out.println(ld);

        int year=ld.getYear();
        int month=ld.getMonthValue();
        int day=ld.getDayOfMonth();
        int dayOfyear=ld.getDayOfYear();//一年中的第几天
        int dayOfWeek=ld.getDayOfWeek().getValue();
        System.out.println(year);
        System.out.println(day);
        System.out.println(dayOfWeek);

        LocalDate ld2=ld.withYear(2099);
        System.out.println(ld2);
        System.out.println(ld);

        LocalDate ld4=ld.plusYears(2);

        LocalDate ld6=LocalDate.of(2099,12,12);
        
    }
}

public class Test {
    public static void main(String[] args) {
        ZoneId zoneId=ZoneId.systemDefault();
        System.out.println(zoneId.getId());

        System.out.println(ZoneId.getAvailableZoneIds());

        ZoneId zoneId1=ZoneId.of("America/El_Salvador");

       ZonedDateTime now=ZonedDateTime.now(zoneId1);
        System.out.println(now);

        ZonedDateTime now1=ZonedDateTime.now(Clock.systemUTC());
        System.out.println(now1);

        ZonedDateTime now2=ZonedDateTime.now();
        System.out.println(now2);

    }
}

 

public class Test {
    public static void main(String[] args) {
        Instant now=Instant.now();

        long second=now.getEpochSecond();
        System.out.println(second);

        int nano=now.getNano();
        System.out.println(nano);

        System.out.println(now);

        Instant instant=now.plusNanos(111);

        

    }
}

 

public class Test {
    public static void main(String[] args) {
        DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

        LocalDateTime now=LocalDateTime.now();
        System.out.println(now);

        String rs= formatter.format(now);
        System.out.println(rs);

        String rs2=now.format(formatter);
        System.out.println(rs2);

        String dateStr="2029年12月12日 12:12:12";
        LocalDateTime ldt=LocalDateTime.parse(dateStr,formatter);
        System.out.println(ldt);
    }
}

public class Test {
    public static void main(String[] args) {
       LocalDate start=LocalDate.of(2029,8,10);
       LocalDate end=LocalDate.of(2029,8,15);

       Period period=Period.between(start,end);

        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

public class Test {
    public static void main(String[] args) {
        LocalDateTime start=LocalDateTime.of(2025,11,11,11,10,10);
        LocalDateTime end=LocalDateTime.of(2025,11,11,11,11,11);
        Duration duration=Duration.between(start,end);

        System.out.println(duration.toDays());
        System.out.println(duration.toHours());
        System.out.println(duration.toMinutes());
        System.out.println(duration.toSeconds());
    }
}

Arrays

public class Test {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50, 60};
        System.out.println(Arrays.toString(arr));

        int[] arr2=Arrays.copyOfRange(arr,1,4);
        System.out.println(Arrays.toString(arr2));

        int[] arr3=Arrays.copyOf(arr,10);
        System.out.println(Arrays.toString(arr3));

        double[] prices={99.8,128,100};
        Arrays.setAll(prices, new IntToDoubleFunction() {
            @Override
            public double applyAsDouble(int value) {
                return prices[value]*0.8;
            }
        });
        System.out.println(Arrays.toString(prices));
    }
    }

Lambda表达式

public class Lambda {
    public static void main(String[] args) {
        Swimming s=() -> {
            System.out.println("学生快乐的游泳~~~");
        };
        s.swim();
    }
}
interface Swimming{
    void swim();
}

方法引用

算法

冒泡排序

public class Test1 {
    public static void main(String[] args) {
        int [] arr={5,2,3,1};

        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-i-1; j++) {
                if(arr[j]>arr[j+1]){
                    int temp=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

选择排序

public class Test1 {
    public static void main(String[] args) {
        int [] arr={5,2,3,1};

        for (int i = 0; i < arr.length-1; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if(arr[i]>arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

二分查找

public class Test1 {
    public static void main(String[] args) {
       int[] arr={7,23,79,81,103,127,131,147};
        System.out.println(binarySearch(arr,81));
    }
    public static int binarySearch(int[] arr,int data){
        int left=0;
        int right=arr.length-1;
        while (left<=right){
            int middle=(left+right)/2;
            if(data<arr[middle]){
                right=middle-1;
            } else if (data>arr[middle]) {
                left=middle+1;
            }else {
                return middle;
            }
        }
        return -1;
    }
}

正则表达式

校验数据是否合法

public class Test1 {
    public static void main(String[] args) {
        System.out.println(checkQQ(null));
        System.out.println(checkQQ("3435556545"));

    }
    public static boolean checkQQ(String qq){
        return qq!=null && qq.matches("[1-9]\\d{5,19}");
    }
}

应用案例

校验用户输入的电话,邮箱,时间是否合法

public class Test1 {
    public static void main(String[] args) {
        checkPhone();
    }

    public static void checkPhone() {
        while (true) {
            System.out.println("请输入您的电话号码(手机|座机):");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();
            if (phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})")) {
                System.out.println("您输入的号码格式正确~~~");
                break;
            } else {
                System.out.println("你输入的号码格式不正确~~~");
            }
        }
    }

public static void checkEmail() {
        while (true) {
            System.out.println("请输入您的邮箱:");
            Scanner sc = new Scanner(System.in);
            String emial = sc.nextLine();
            if (emial.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")) {
                System.out.println("您输入的邮箱格式正确~~~");
                break;
            } else {
                System.out.println("你输入的邮箱格式不正确~~~");
            }
        }
    }

public class Test1 {
    public static void main(String[] args) {
        String s1="古力娜扎ai888888迪丽热巴999a876马儿扎哈4345434rf";
        System.out.println(s1.replaceAll("\\w+", "-"));
    }
}

异常

异常体系

1.异常是什么?

异常是代码在编译或者执行的过程中可能出现的错误。

2.异常的体系结构 ?

Throwable

 Error : 严重级别问题, 通常跟系统有关

Exception : 异常类, 程序常见的错误

3.Exception的分类 ?

l编译时异常、运行时异常。

l编译时异常:没有继承 RuntimeExcpetion 的异常,编译阶段就会出错。

l运行时异常:继承自 RuntimeException的 异常或其子类

编译阶段不报错,运行可能报错

异常的处理方式

异常的默认处理流程

虚拟机会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException

异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机

虚拟机接收到异常对象后,先在控制台直接输出异常信息数据

终止 Java 程序的运行

后续代码没有机会执行了,因为程序已经噶了

自定义异常

自定义异常的分类

1、自定义编译时异常      

定义一个异常类继承Exception.

重写构造器

2、自定义运行时异常

定义一个异常类继承RuntimeException.

重写构造器。

public class ExceptionTest2 {
    public static void main(String[] args) {
        try {
            saveAge(160);
            System.out.println("底层执行成功");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("底层执行失败");
        }
    }
    public static void saveAge(int age){
        if(age>0 && age<150){
            System.out.println("年龄被成功保存:"+age);
        }else {
            throw  new AgellegalRuntimeException("/age is illegal,your age is "+age);
        }
    }
}
public class AgellegalRuntimeException extends RuntimeException{
    public AgellegalRuntimeException() {
    }

    public AgellegalRuntimeException(String message) {
        super(message);
    }
}

public class Test {
    public static void main(String[] args) {
        while (true) {
            try {
                System.out.println(getMoney());
                break;
            } catch (Exception e) {
                System.out.println("请您输入合法的数字!");
            }
        }
    }
    public static double getMoney(){
        Scanner sc=new Scanner(System.in);
        while (true){
            System.out.println("请您输入合法的价格:");
            double money=sc.nextDouble();
            if(money>=0){
                return money;
            }else {
                System.out.println("您输入的价格是不合法的!");
            }
        }
    }
    }

集合

ublic class Test {
    public static void main(String[] args) {
      ArrayList<String> list=new ArrayList<>();
      list.add("java1");
      list.add("java2");
      list.add("java1");
      list.add("java2");
        System.out.println(list);

      HashSet<String> set=new HashSet<>();
      set.add("java1");
      set.add("java2");
      set.add("java1");
      set.add("java2");
      set.add("java3");
        System.out.println(set);

    }
    }

 collection的常用方法

public class Test {
    public static void main(String[] args) {
        Collection<String> c=new ArrayList<>();
        c.add("java1");
        c.add("java2");
        c.add("java1");
        c.add("java2");
        c.add("java3");
        System.out.println(c);

//        c.clear();
//        System.out.println(c);

        System.out.println(c.isEmpty());

        System.out.println(c.size());

        System.out.println(c.contains("java1"));

        System.out.println(c.remove("java2"));
        System.out.println(c);

        Object[] arr=c.toArray();
        System.out.println(Arrays.toString(arr));

        String[] arr2=c.toArray(new String[c.size()]);
        System.out.println(Arrays.toString(arr2));

        System.out.println("------------------------");

        Collection<String> c1=new ArrayList<>();
        c1.add("java1");
        c1.add("java2");
        Collection<String> c2=new ArrayList<>();
        c2.add("java3");
        c2.add("java4");
        c1.addAll(c2);
        System.out.println(c1);
        System.out.println(c2);


    }
}

Collection的遍历方式

迭代器

public class Test {
    public static void main(String[] args) {
        Collection<String> c=new ArrayList<>();
        c.add("ad");
        c.add("ac");
        c.add("au");
        c.add("aq");

        Iterator<String> it=c.iterator();

        while (it.hasNext()){
            String ele=it.next();
            System.out.println(ele);
        }

    }
}

增强for循环

public class Test {
    public static void main(String[] args) {
        Collection<String> c=new ArrayList<>();
        c.add("ad");
        c.add("ac");
        c.add("au");
        c.add("aq");
        System.out.println(c);

        for (String ele : c){
            System.out.println(ele);
        }

    }
}

Lambda表达式

public class Test {
    public static void main(String[] args) {
        Collection<String> c=new ArrayList<>();
        c.add("ad");
        c.add("ac");
        c.add("au");
        c.add("aq");
        System.out.println(c);

        c.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        c.forEach((String s) ->{
                System.out.println(s);

        });

        c.forEach(System.out::println);
    }
}

List集合

特点和方法 

public class Test {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("蜘蛛精");
        list.add("至尊宝");
        list.add("至尊宝");
        list.add("牛夫人");
        System.out.println(list);

        list.add(2,"紫霞仙子");
        System.out.println(list);

        System.out.println(list.remove(2));
        System.out.println(list);

        System.out.println(list.get(3));

        System.out.println(list.set(3, "牛魔王"));
        System.out.println(list);
    }
}

遍历方式

public class Test {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("蜘蛛精");
        list.add("至尊宝");
        list.add("牛夫人");

        for (int i = 0; i < list.size(); i++) {
            String s=list.get(i);
            System.out.println(s);
        }

        Iterator<String> it=list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

        for (String s : list) {
            System.out.println(s);
        }

        list.forEach(s-> {
            System.out.println(s);
        });

    }
}

底层原理

队列
public class Test {
    public static void main(String[] args) {
        LinkedList<String> queue=new LinkedList<>();
        //入队
        queue.addLast("1hao");
        queue.addLast("2hao");
        queue.addLast("3hao");
        queue.addLast("4hao");
        System.out.println(queue);

        //出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue);

    }
}

队列:先进先出,后进后出。

  LinkedList<String> stack=new LinkedList<>();
        //压栈
        stack.addFirst("ike");
        stack.addFirst("2ke");
        stack.push("3ke");
        stack.addFirst("4ke");
        System.out.println(stack);
        //出栈
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack);

栈:后进先出,先进后出。

Set集合

public class Test {
    public static void main(String[] args) {
      Set<Integer> set=new HashSet<>();
      set.add(666);
      set.add(555);
      set.add(555);
      set.add(888);
      set.add(777);
        System.out.println(set);

    }
}

public class Test {
    public static void main(String[] args) {
      Set<Integer> set=new TreeSet<>();
      set.add(666);
      set.add(555);
      set.add(555);
      set.add(888);
      set.add(777);
        System.out.println(set);

    }
}

HashSet底层原理

public class Test {
    public static void main(String[] args) {
        Student s1=new Student("蜘蛛精",25,169.5);
        Student s2=new Student("紫霞",22,166.5);
        System.out.println(s1.hashCode());
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        
    }
}

若想去除重复项,则需重写hashCode()和equals()方法

  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, height);
    }

LinkedHashSet底层原理

TreeSet集合底层原理

 Set<Integer> set1=new TreeSet<>();
        set1.add(6);
        set1.add(5);
        set1.add(5);
        set1.add(7);
        System.out.println(set1);

       Set<Student> students=new TreeSet<>();
        students.add(new Student("蜘蛛精",25,169.5));
        students.add(new Student("紫霞",22,166.5));
        students.add(new Student("至尊宝",26,165.5));
        System.out.println(students);
public class Student implements Comparator<Student> {
    private String name;
    private int age;
    private double height;

    public int compareTo(Student o){
        return this.age-o.age;
    }

    @Override
    public int compare(Student o1, Student o2) {
        return 0;
    }
 Set<Student> students=new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o1.getHeight(),o2.getHeight());
            }
        });

并发异常问题

  Iterator<String> it=list.iterator;
        while (it.hasNext()){
            String name=it.next();
            if(name.contains("李")){
                it.remove();
            }
        }

集合(二)

前置知识

可变参数

public class Test {
    public static void main(String[] args) {
        test();
        test(10);
        test(10,20,30);
        test(new int[]{10,20,30,40});
    }
    public static void test(int...nums){
        System.out.println(nums.length);
        System.out.println(Arrays.toString(nums));
        System.out.println("----------------------------");
    }
}

Collestions

public class Test {
    public static void main(String[] args) {
     List<String> names=new ArrayList<>();
     Collections.addAll(names,"小明","小红","小芳");
        System.out.println(names);

        Collections.shuffle(names);
        System.out.println(names);

        List<Student> students=new ArrayList<>();
        students.add(new Student("蜘蛛精",25,169.5));
        students.add(new Student("紫霞",22,166.5));
        students.add(new Student("至尊宝",26,165.5));
        //Collections.sort(students);

        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o1.getHeight(),o2.getHeight());
            }
        });
        System.out.println(students);


    }
}

综合案例斗地主

public class GameDemo {
    public static void main(String[] args) {
        Room m=new Room();
        m.start();
    }
}
package collection_d1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Room {
    private List<Card> allCards=new ArrayList<>();

    public Room(){
        String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        String[] colors={"♠","♥","♣","♦"};
        int size=0;
        for (String number : numbers) {
            size++;
            for (String color : colors) {
                Card c=new Card(number,color,size);
                allCards.add(c);
            }
        }
        Card c1=new Card("","🃏",++size);
        Card c2=new Card("","😡",++size);
        Collections.addAll(allCards,c1,c2);
        System.out.println("新牌:"+allCards);


    }
    public void start(){
        Collections.shuffle(allCards);
        System.out.println("洗牌后:"+allCards);

        List<Card> Keberan=new ArrayList<>();
        List<Card> Jorden=new ArrayList<>();
        List<Card> LebulanJim=new ArrayList<>();
        for (int i = 0; i < allCards.size(); i++) {
            Card c=allCards.get(i);
            if(i%3==0){
                Keberan.add(c);
            } else if (i%3==1) {
                Jorden.add(c);

            }else if (i%3==2){
                LebulanJim.add(c);
            }
        }
        sortCards(Keberan);
        sortCards(Jorden);
        sortCards(LebulanJim);
        System.out.println("Kobe:"+Keberan);
        System.out.println("Jorden:"+Jorden);
        System.out.println("Zmusi:"+LebulanJim);
        List<Card> lastThreeCards=allCards.subList(allCards.size()-3,allCards.size());
        System.out.println("底牌:"+lastThreeCards);
        Keberan.addAll(lastThreeCards);
        sortCards(Keberan);
        System.out.println("Kebe抢到地主后:"+Keberan);
    }

    private void sortCards(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o2.getSize()-o1.getSize();
            }
        });
    }
}
package collection_d1;

public class Card {
    private String number;
    private String color;
    private int size;

    public Card() {
    }

    public Card(String number, String color, int size) {
        this.number = number;
        this.color = color;
        this.size = size;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    @Override
    public String toString() {
        return color+number;
    }
}

Map集合

   public static void main(String[] args) {
        Map<String,Integer> map=new HashMap<>();
        map.put("手表",100);
        map.put("手表",220);
        map.put("手机",2);
        map.put("Java",2);
        map.put(null,null);
        System.out.println(map);
    }

 public static void main(String[] args) {
        Map<String,Integer> map=new LinkedHashMap<>();
        map.put("手表",100);
        map.put("手表",220);
        map.put("手机",2);
        map.put("Java",2);
        map.put(null,null);
        System.out.println(map);
    }

常用方法

public class MapTest1 {
    public static void main(String[] args) {
        Map<String,Integer> map=new HashMap<>();
        map.put("手表",100);
        map.put("手表",220);
        map.put("手机",2);
        map.put("Java",2);
        map.put(null,null);
        System.out.println(map);

        System.out.println(map.size());

        map.clear();
        System.out.println(map);

        System.out.println(map.isEmpty());

     
        System.out.println(map.get("手机"));

        System.out.println(map.remove("手表"));
        System.out.println(map);

        System.out.println(map.containsKey("手表"));
        System.out.println(map.containsKey("手机"));

        System.out.println(map.containsValue(2));

        Set<String> keys= map.keySet();
        System.out.println(keys);

        Collection<Integer> values=map.values();
        System.out.println(values);

        Map<String,Integer> map1=new HashMap<>();
        map1.put("java1",10);
        map1.put("java2",20);
        Map<String,Integer> map2=new HashMap<>();
        map2.put("java3",10);
        map2.put("java2",222);
        map1.putAll(map2);
        System.out.println(map1);
        System.out.println(map2);
    }
}

遍历方式

public class MapTest1 {
    public static void main(String[] args) {

        //键找值
        Map<String,Double> map=new HashMap<>();
        map.put("蜘蛛精",162.5);
        map.put("蜘蛛精",169.8);
        map.put("紫霞",165.8);
        map.put("至尊宝",169.5);
        map.put("牛魔王",183.6);
        System.out.println(map);

        Set<String> keys=map.keySet();
        System.out.println(keys);
        for (String key : keys) {
            double value=map.get(key);
            System.out.println(key+"====>"+value);
        }
    }
}

public class MapTest1 {
    public static void main(String[] args) {

        //键找值
        Map<String,Double> map=new HashMap<>();
        map.put("蜘蛛精",162.5);
        map.put("蜘蛛精",169.8);
        map.put("紫霞",165.8);
        map.put("至尊宝",169.5);
        map.put("牛魔王",183.6);
        System.out.println(map);

        Set<Map.Entry<String, Double>> entries = map.entrySet();
        for (Map.Entry<String, Double> entry : entries) {
            String key=entry.getKey();
            double value=entry.getValue();
            System.out.println(key+"====>"+value);
        }
    }
    }

public class MapTest1 {
    public static void main(String[] args) {

        //键找值
        Map<String, Double> map = new HashMap<>();
        map.put("蜘蛛精", 162.5);
        map.put("蜘蛛精", 169.8);
        map.put("紫霞", 165.8);
        map.put("至尊宝", 169.5);
        map.put("牛魔王", 183.6);
        System.out.println(map);

        map.forEach((k,v) -> {
            System.out.println(k+"-->"+v);
        });

    }
    }

综合案例

public class MapTest1 {
    public static void main(String[] args) {
        List<String> data=new ArrayList<>();
        String[] selects={"A","B","C","D"};
        Random r=new Random();
        for (int i = 0; i < 80; i++) {
            int index=r.nextInt(4);
            data.add(selects[index]);
        }
        System.out.println(data);

        Map<String,Integer> result=new HashMap<>();

        for (String s : data) {
            if(result.containsKey(s)){
                result.put(s,result.get(s)+1);
            }else {
                result.put(s,1);
            }
        }
        System.out.println(result);
    }
    }

HashMap

LinkedHashMap

TreeMap

集合的嵌套

package collection_d1;

import java.util.*;

public class MapTest1 {
    public static void main(String[] args) {
       Map<String,List<String>> map=new HashMap<>();
       List<String> cities1=new ArrayList<>();
       Collections.addAll(cities1,"南京市","扬州市","苏州市","无锡市","常州市");
       map.put("江苏省",cities1);

        List<String> cities2=new ArrayList<>();
        Collections.addAll(cities2,"武汉市","孝感市","十堰市","宜昌市","鄂州市");
        map.put("湖北省",cities2);

        List<String> cities3=new ArrayList<>();
        Collections.addAll(cities3,"石家庄市","唐山市","邢台市","保定市","张家口市");
        map.put("河北省",cities3);
        System.out.println(map);

        List<String> cities = map.get("湖北省");
        for (String city : cities) {
            System.out.println(city);
        }
        map.forEach((p,c) -> {
            System.out.println(p+"--->"+c);
        });
    }
    }

stream流

public class MapTest1 {
    public static void main(String[] args) {
       List<String> names=new ArrayList<>();
       Collections.addAll(names,"1科比","2詹姆斯","1库里");
        System.out.println(names);

        List<String> list2=names.stream().filter(s -> s.startsWith("1")).filter(a -> a.length()==3).collect(Collectors.toList());
        System.out.println(list2);
    }
    }

常用方法

public class MapTest1 {
    public static void main(String[] args) {
       List<String> names=new ArrayList<>();
       Collections.addAll(names,"张三丰","张无忌","周芷若","赵敏","张强");
        Stream<String> stream = names.stream();

        Set<String> set=new HashSet<>();
       Collections.addAll(set,"刘德华","张曼玉","蜘蛛精","马德","德玛西亚");
        Stream<String> stream1 = names.stream();
        stream1.filter(s -> s.contains("德")).forEach(s -> System.out.println(s));

       Map<String,Double> map=new HashMap<>();
       map.put("古力娜扎",172.3);
       map.put("迪丽热巴",168.3);
       map.put("马儿扎哈",166.3);
       map.put("卡尔扎巴",168.3);
        Set<String> keys = map.keySet();
        Stream<String> ks=keys.stream();

        Collection<Double> values=map.values();
        Stream<Double> vs=values.stream();

        Set<Map.Entry<String,Double>> entries=map.entrySet();
        Stream<Map.Entry<String, Double>> kvs = entries.stream();
        kvs.filter(e ->e.getKey().contains("巴"))
                .forEach(e -> System.out.println(e.getKey()+"-->"+e.getValue()));

        String[] names2={"张翠山","东方不败","唐大山","孤独求败"};
        Stream<String> s1 = Arrays.stream(names2);

public class MapTest1 {
    public static void main(String[] args) {
       List<Student> students=new ArrayList<>();
       Student s1=new Student("zzj",26,172.5);
       Student s2=new Student("zzj",26,172.5);
       Student s3=new Student("zx",23,167.6);
       Student s4=new Student("bjj",25,169.0);
       Student s5=new Student("nmw",35,183.3);
       Student s6=new Student("nfr",34,168.3);
       Collections.addAll(students,s1,s2,s3,s4,s5,s6);
       students.stream().filter(s->s.getAge()>=23 && s.getAge()<=30)
               .sorted((o1, o2) -> o2.getAge()-o1.getAge())
               .forEach(s-> System.out.println(s));

        System.out.println("---------------");
        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight()))
                .limit(3).forEach(System.out::println);
        System.out.println("---------------");

        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight()))
                .skip(students.size()-3).forEach(System.out::println);

        Stream<String> st1 = Stream.of("张三", "李四");
        Stream<String> st2 = Stream.of("张三2", "李四2","王五");
        Stream<String> allSt = Stream.concat(st1, st2);
        allSt.forEach(System.out::println);
    }
    }

public class MapTest1 {
    public static void main(String[] args) {
       List<Student> students=new ArrayList<>();
       Student s1=new Student("zzj",26,172.5);
       Student s2=new Student("zzj",26,172.5);
       Student s3=new Student("zx",23,167.6);
       Student s4=new Student("bjj",25,169.0);
       Student s5=new Student("nmw",35,183.3);
       Student s6=new Student("nfr",34,168.3);
       Collections.addAll(students,s1,s2,s3,s4,s5,s6);

       long size=students.stream().filter(s-> s.getHeight()>168).count();
        System.out.println(size);

        Student s=students.stream().max((o1, o2) -> Double.compare(o1.getHeight(),o2.getHeight())).get();
        System.out.println(s);
    }
    }

 List<Student> students1=students.stream().filter(a->a.getHeight()>170).collect(Collectors.toList());
        System.out.println(students1);

//        Map<String,Double> map=students.stream().filter(a->a.getHeight()>170).distinct()
//                .collect(Collectors.toMap(a->a.getName(),a->a.getHeight()));
//        System.out.println(map);

IO流(一)

File

创建对象

public class FileTest1 {
    public static void main(String[] args) {
        File f1=new File("C:\\Users\\Auc\\Pictures\\Saved Pictures\\pexels-asad-photo-maldives-3601425.jpg");
        System.out.println(f1.length());
        System.out.println(f1.exists());
    }
}

判断文件类型、获取文件信息

public class FileTest1 {
    public static void main(String[] args) {
        File f1=new File("C:\\Users\\Auc\\Pictures\\Saved Pictures\\pexels-asad-photo-maldives-3601425.jpg");

        System.out.println(f1.exists());
        System.out.println(f1.isFile());
        System.out.println(f1.isDirectory());
        System.out.println(f1.getName());
        System.out.println(f1.length());
        long time = f1.lastModified();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println(sdf.format(time));
        File f2=new File("D:\\study\\ab.txt");
        System.out.println(f2.getPath());
        System.out.println(f2.getAbsolutePath());
    }
}

创建文件和删除文件

public class FileTest1 {
    public static void main(String[] args) throws IOException {
        File f1=new File("D:\\study\\auc.txt");
        System.out.println(f1.createNewFile());

        File f2=new File("D:\\study\\acc\\bcc");
        System.out.println(f2.mkdirs());

        System.out.println(f1.delete());
        System.out.println(f2.delete());
    }
}

遍历文件夹

public class FileTest1 {
    public static void main(String[] args) throws IOException {
        File f1=new File("D:\\study\\auc.txt");
        String[] names = f1.list();
        for (String name : names) {
            System.out.println(name);
        }
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file.getAbsolutePath());
        }
    }
}

方法递归

认识递归的形式

public class FileTest1 {
    public static void main(String[] args) throws IOException {

    }
    //直接方法递归
    public static void test1(){
        System.out.println("--test1--");
        test1();
    }
    //间接方法递归
    public static void test2(){
        System.out.println("--test2--");
        test3();
    }
    public static void test3(){
        test2();
    }
}

算法思想

public class FileTest1 {
    public static void main(String[] args){
        System.out.println("5的阶乘:"+f(5));
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }else {
            return f(n-1)*n;
        }
    }
}

public class FileTest1 {
    public static void main(String[] args){
        System.out.println(f(1));
    }
    public static int f(int n){
        if(n==10){
            return 1;
        }else {
            return 2*f(n+1)+2;
        }
    }
}

文件搜索

public class FileTest1 {
    public static void main(String[] args) throws IOException {
        searchFile(new File("c:/"),"QQ.exe");
    }

    /**
     * 去目录下搜素某个文件
     * @param dir 目录
     * @param fileName
     */
   public static void searchFile(File dir,String fileName) throws IOException {
        if(dir==null|| !dir.exists() || dir.isFile()){
            return;
        }
       File[] files = dir.listFiles();

        if(files!=null && files.length>0){
            for (File f : files) {
                if(f.isFile()){
                    if(f.getName().contains(fileName)){
                        System.out.println("找到了"+f.getAbsolutePath());
                        Runtime runtime=Runtime.getRuntime();
                        runtime.exec(f.getAbsolutePath());
                    }
                }else {
                    searchFile(f,fileName);
                }
            }
        }
   }
}

public class FileTest1 {
    public static void main(String[] args) throws IOException {
        File dir=new File("E:\\resource");
        deleteDir(dir);
    }
    public static void deleteDir(File dir){
        if(dir==null || !dir.exists()){
            return;
        }
        if(dir.isFile()){
            dir.delete();
            return;
        }
        File[] files = dir.listFiles();
        if(files==null){
            return;
        }
        if(files.length==0){
            dir.delete();
            return;
        }
        for (File file : files) {
            if(file.isFile()){
                file.delete();
            }else {
                deleteDir(file);
            }
        }
        dir.delete();
    }
}

字符集

public class FileTest1 {
    public static void main(String[] args) throws IOException {
      String data="a我b";
        byte[] bytes = data.getBytes();
        System.out.println(Arrays.toString(bytes));

        byte[] bytes1 = data.getBytes("GBK");
        System.out.println(Arrays.toString(bytes1));

        String s1 = new String(bytes);
        System.out.println(s1);

        String s2=new String(bytes1,"GBK");
        System.out.println(s2);
    }
}

IO流

public class Test1 {
    public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream(("D:\\study\\java\\src\\pra\\itauc"));
        int b1=is.read();
        System.out.println(b1);

        int b2=is.read();
        System.out.println((char)b2);
        
    }
}

public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream(("D:\\study\\java\\src\\pra\\itauc"));
        int b;
        while ((b=is.read())!=-1){
            System.out.printf((char)b);
        }
is.close();

    }

文件字节输入流

public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream(("D:\\study\\java\\src\\pra\\itauc"));
        byte[] buffer=new byte[3];
        int len=is.read(buffer);
        String s = new String(buffer);
        System.out.println(s);
        System.out.println("当前的读取字节数:"+len);

        int len1=is.read(buffer);
        String s1 = new String(buffer,0,len1);
        System.out.println(s1);
        System.out.println("当前的读取字节数:"+len1);


        is.close();

    }

public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream(("D:\\study\\java\\src\\pra\\itauc"));
        byte[] buffer=new byte[3];
        int len;
        while ((len= is.read())!=-1){
            String rs = new String(buffer,0,len);
            System.out.println(rs);

        }


        is.close();

    }
一次读完全部字节

public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream(("D:\\study\\java\\src\\pra\\itauc"));
        File f=new File("D:\\study\\java\\src\\pra\\itauc");
        long size=f.length();
        byte[] buffer=new byte[(int) size];

        int len = is.read(buffer);
        System.out.println(new String(buffer));

        System.out.println(size);
        System.out.println(len);


        is.close();

    }
byte[] buffer=is.readAllBytes();
        System.out.println(new String(buffer));
写字节输出

public class Test1 {
    public static void main(String[] args) throws IOException {
        OutputStream os=new FileOutputStream(("D:\\study\\java\\src\\pra\\auc.cc"),true);
        os.write(97);
        os.write('b');
        byte[] bytes="我爱你中国abc".getBytes();
        os.write(bytes);

        os.write(bytes,0,15);

        os.write("\r\n".getBytes());

        os.close();

    }
}

文件复制
public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream("d:/resource/pictures.png");
        OutputStream os=new FileOutputStream("c:/data/pcitures.png");
        byte[] buffer=new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        os.close();
        is.close();
    }
释放资源的方式
 try {
            System.out.println(10/0);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("===finally执行了一次===");
        }
    }

public static void main(String[] args) throws IOException {
        InputStream is =null;
        OutputStream os=null;
        try {
             is = new FileInputStream("d:/resource/pictures.png");
             os = new FileOutputStream("c:/data/pcitures.png");
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(os!=null)os.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if(is!=null)is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

public static void main(String[] args) throws IOException {
        try (
                InputStream is = new FileInputStream("d:/resource/pictures.png");
                OutputStream os = new FileOutputStream("c:/data/pcitures.png");
                ){

            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

IO流(二)

字符流

文件字符输入流

public static void main(String[] args) throws IOException {
        try (
                FileReader fr = new FileReader("D:\\study\\java\\src\\pra\\auc.cc");
                ){
//            int c;
//            while ((c=fr.read())!=-1){
//                System.out.print((char) c);
//            }
            char[] buffer=new char[3];
            int len;
            while ((len=fr.read(buffer))!=-1){
                System.out.print(new String(buffer,0,len));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

文件字符输入流

public static void main(String[] args) throws IOException {
        try (
                FileWriter fw = new FileWriter("D:\\study\\java\\src\\pra\\auc.cc",true);
                ){
            fw.write('a');
            fw.write("我爱你");
            fw.write("我爱你abcde",0,5);
            fw.write("\r\n");
            
            char[] buffer={'A','u','c',24};
            fw.write(buffer);
            fw.write(buffer,0,2);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

fw.flush();
            fw.close();

缓冲流

public static void main(String[] args) throws IOException {
        try (
                InputStream fr = new FileInputStream("D:\\study\\java\\src\\pra\\auc.cc");
                InputStream bis=new BufferedInputStream(fr);

                OutputStream os=new FileOutputStream("D:\\study\\java\\src\\pra\\itauc");
                OutputStream bos=new BufferedOutputStream(os);

        ){

            byte[] buffer=new byte[1024];
            int len;
            while ((len=fr.read(buffer))!=-1){
                System.out.print(new String(buffer,0,len));
            }
            System.out.println("复制完成");
          
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

try (
                Reader fr = new FileReader("D:\\study\\java\\src\\pra\\auc.cc");
                BufferedReader br=new BufferedReader(fr);
        ){

            char[] buffer=new char[3];
            int len;
            while ((len=br.read(buffer))!=-1){
                System.out.print(new String(buffer,0,len));
            }
            //System.out.println(br.readLine());
//            String line;
//            while ((line=br.readLine())!=null){
//                System.out.println(line);
//            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

public static void main(String[] args) throws IOException {
        try (
                FileWriter fw = new FileWriter("D:\\study\\java\\src\\pra\\auc.cc",true);
                BufferedWriter bw=new BufferedWriter(fw);
        ){
            bw.write('a');
            bw.write("我爱你");
            bw.write("我爱你abcde",0,5);
//            fw.write("\r\n");
            bw.newLine();
            
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

转换流

public static void main(String[] args) throws IOException {
        try(
                InputStream is=new FileInputStream("D:\\study\\java\\src\\pra\\auc.cc");
                Reader isr=new InputStreamReader(is,"GBK");
                BufferedReader br=new BufferedReader(isr);
                ) {
            String line;
            while ((line=br.readLine())!=null){
                System.out.println(line);
            }

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }

public static void main(String[] args) throws IOException {
        try(
                OutputStream os=new FileOutputStream("\"D:\\\\study\\\\java\\\\src\\\\pra\\\\adc.cc\"");
                Writer osw=new OutputStreamWriter(os,"GBK");
                BufferedWriter bw=new BufferedWriter(osw);
                ) {
            bw.write("我爱你中国");
            bw.write("abcd");

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }

打印流

public static void main(String[] args) throws IOException {
        try(
                PrintStream ps=new PrintStream("D:\\study\\java\\src\\pra\\auc.cc", Charset.forName("GBK"));
                ) {
            ps.println("我爱你中国");
            ps.println(97);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }

 public static void main(String[] args) throws IOException {
        try(
                PrintWriter ps=new PrintWriter(new FileOutputStream("\"D:\\\\study\\\\java\\\\src\\\\pra\\\\auc.cc\"",true));
                ) {
            ps.println("我爱你中国");
            ps.println(97);
            
            ps.write(97);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }

数据流

 public static void main(String[] args) throws IOException {
        try(
               DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:\\study\\java\\src\\pra\\auc.cc"));
                ) {
            dos.writeInt(97);
            
            
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }

public static void main(String[] args) throws IOException {
        try(
              DataInputStream dis=new DataInputStream(new FileInputStream("D:\\study\\java\\src\\pra\\auc.cc"));
                ) {
            int i=dis.readInt();
            System.out.println(i);

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }
    }

序列化流

public class User implements Serializable {
    private String loginName;
    private String userName;
    private int age;
    private String password;

    public User() {
    }

    public User(String loginName, String userName, int age, String password) {
        this.loginName = loginName;
        this.userName = userName;
        this.age = age;
        this.password = password;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
public static void main(String[] args) throws IOException {

        try (
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\study\\java\\src\\pra\\auc.cc"));
                ){
            User u=new User("admin","张三",32,"6688xyz");
            oos.writeObject(u);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

public static void main(String[] args) throws IOException {

        try (
                ObjectInputStream oos = new ObjectInputStream(new FileInputStream("D:\\study\\java\\src\\pra\\auc.cc"));
                ){
            User u=(User) oos.readObject();
            System.out.println(u);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

IO框架

特殊文件

Properties属性文件

public static void main(String[] args) throws Exception{
        Properties properties=new Properties();
        System.out.println(properties);

        properties.load(new FileReader("D:\\study\\java\\src\\sac\\src\\users.properties"));
        System.out.println(properties);

        System.out.println(properties.getProperty("张无忌"));

    }
public static void main(String[] args) throws Exception{
        Properties properties=new Properties();
        properties.setProperty("张无忌","minmin");

        properties.store(new FileWriter("D:\\study\\java\\src\\pra\\itauc"),"i saved many users!");
       

    }

XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--注释:放在第一行-->
<users>
    <users id="1">
        <name>张无忌</name>
        <password>minmin</password>
        <data>3&lt;2&amp;&amp;5>4</data>
    </users>
    <users id="2">
        <name>小明</name>
        <password>1234</password>
    </users>
</users>

public class Tesd {
    public static void main(String[] args) throws Exception{
        SAXReader saxReader=new SAXReader();

        Document document = saxReader.read("D:\\study\\java\\src\\sac\\src\\helloworld.xml");

        Element root = document.getRootElement();
        System.out.println(root.getName());

        List<Element> elements = root.elements();
        for (Element element : elements) {
            System.out.println(element.getName());
        }
        Element people = root.element("people");
        System.out.println(people.getText());

        Element user = root.element("user");
        System.out.println(user.elementText("name"));

        System.out.println(user.elementText("password"));
    }
}

读取数据 

public class Tesd {
    public static void main(String[] args) throws Exception{
        StringBuilder sb=new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
        sb.append("<name>").append("点点点").append("</name>");

        BufferedWriter bw=new BufferedWriter(new FileWriter("properties=app/src/book"));
    }
}

日志技术

public static final Logger LOGGER= LoggerFactory.getLogger("Tesd");
    public static void main(String[] args) throws Exception{
        try {
            LOGGER.info("方法开始执行");
        }catch (Exception e){
            LOGGER.error(bug);
        }
       

 

<root level="debug">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE" />
    </root>

多线程

继承Thread类

public class Tesd {
    public static void main(String[] args) {
        Thread t=new MyThread();
       t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程输出:"+i);
        }


    }
}
public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程MyThread输出:"+i);
        }
    }
}

实现Runnable接口

public class Tesd {
    public static void main(String[] args) {
       Runnable target=new MyRunnable();
       new Thread(target).start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程输出:"+i);
        }


    }
}
public class MyRunnable implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程输出:"+i);
        }
    }
}

Callable接口

public class Tesd {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> call = new MyCallable(100);
        FutureTask<String> f1 = new FutureTask<>(call);
        new Thread(f1).start();

        String rs = f1.get();
        System.out.println(rs);

        


    }
}
public class MyCallable implements Callable<String> {
    private int n;

    public MyCallable(int n) {
        this.n = n;
    }

    @Override
    public String call() throws Exception {
        int sum=0;
        for (int i = 0; i <= n; i++) {
            sum+=i;
        }
        return "线程求出了1-"+n+"的和是"+sum;
    }
}

线程安全

public class Tesd {
    public static void main(String[] args) throws ExecutionException{
        Account acc=new Account(100000,"ICBC-110");
        new DrawThread(acc,"小明").start();
        new DrawThread(acc,"小红").start();
    }
}
public class DrawThread extends Thread{
    private Account acc;
    public DrawThread(Account acc,String name){
        super(name);
        this.acc=acc;
    }
    public void run(){
        acc.drawMoney(100000);
    }
}
public class Account {
    private double money;
    private String cardId;

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public Account() {
    }

    public Account(double money, String cardId) {
        this.money = money;
        this.cardId = cardId;
    }

    public void drawMoney(double money) {
        String name=Thread.currentThread().getName();
        if(this.money>=money){
            System.out.println(name+"来取钱"+money+"成功!");
            this.money-=money;
            System.out.println(name+"来取钱后,余额剩余:"+this.money);
        }else {
            System.out.println(money+"来取钱,余额不足");
        }
    }
}

线程同步

同步代码块

 synchronized (this) {
            if(this.money>=money){
                System.out.println(name+"来取钱"+money+"成功!");
                this.money-=money;
                System.out.println(name+"来取钱后,余额剩余:"+this.money);
            }else {
                System.out.println(name+"来取钱,余额不足");
            }
        }

同步方法

public synchronized void drawMoney(double money) {
        String name=Thread.currentThread().getName();
        if(this.money>=money){
            System.out.println(name+"来取钱"+money+"成功!");
            this.money-=money;
            System.out.println(name+"来取钱后,余额剩余:"+this.money);
        }else {
            System.out.println(name+"来取钱,余额不足");
        }
    }

Lock锁

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private double money;
    private String cardId;
    private final Lock lk=new ReentrantLock();

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public Account() {
    }

    public Account(double money, String cardId) {
        this.money = money;
        this.cardId = cardId;
    }

    public  void drawMoney(double money) {
        String name=Thread.currentThread().getName();
        lk.lock();
        try {
            if(this.money>=money){
                System.out.println(name+"来取钱"+money+"成功!");
                this.money-=money;
                System.out.println(name+"来取钱后,余额剩余:"+this.money);
            }else {
                System.out.println(name+"来取钱,余额不足");
            }
        } finally {
            lk.unlock();
        }
        
    }
}

线程池

创建线程池

public class Tesd {
    public static void main(String[] args) throws ExecutionException{
        //public ThreadPoolExecutor(int corePoolSize,
        //                              int maximumPoolSize,
        //                              long keepAliveTime,
        //                              TimeUnit unit,
        //                              BlockingQueue<Runnable> workQueue,
        //                              ThreadFactory threadFactory,
        //                              RejectedExecutionHandler handler)
        ExecutorService pool=new ThreadPoolExecutor(3,5,8, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
    }
}

线程池处理Runnable任务

public class Tesd {
    public static void main(String[] args) throws ExecutionException{
        ExecutorService pool=new ThreadPoolExecutor(3,5,8, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        Runnable target=new MyRunnable();
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);

        pool.shutdown();
    }
}
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"==>输出666");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

线程池处理Callable任务

public class Tesd {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService pool=new ThreadPoolExecutor(3,5,8, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        Future<String> f1 = pool.submit(new Mycallable(100));
        Future<String> f2 = pool.submit(new Mycallable(200));
        Future<String> f3 = pool.submit(new Mycallable(300));
        Future<String> f4 = pool.submit(new Mycallable(400));
        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());
    }
}
import java.util.concurrent.Callable;

public class Mycallable implements Callable<String> {
    private int n;

    public Mycallable(int n) {
        this.n = n;
    }

    @Override
    public String call() throws Exception {
        int sum=0;
        for (int i = 0; i <= n; i++) {
            sum+=i;
        }
        return Thread.currentThread().getName()+"线程求出了1-"+n+"的和是"+sum;
    }
}

Executors工具类实现线程池

 ExecutorService pool = Executors.newFixedThreadPool(3);

网络通信

网络通信三要素

public class Tesd {
    public static void main(String[] args) throws IOException {
        InetAddress ip1 = Inet4Address.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());

        InetAddress ip2 = Inet4Address.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());

        System.out.println(ip2.isReachable(6000));
    }
}

UDP通信

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建客户端对象
        DatagramSocket socket=new DatagramSocket();

        //2、创建数据包对象封装发出去
        byte[] bytes="我是客户端".getBytes();
        DatagramPacket packet=new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),6666);

        //3、开始发送数据包的数据
        socket.send(packet);

        System.out.println("客户端数据发送完毕~");
        socket.close();
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Sever {
    public static void main(String[] args) throws Exception {
        System.out.println("----服务端启动-----");
        //1、创建一个服务端对象注册端口
        DatagramSocket scoket=new DatagramSocket(6666);

        //2、创建一个数据包对象,用于接收数据
        byte[] buffer=new byte[1024*64];
        DatagramPacket packet=new DatagramPacket(buffer,buffer.length);

        //3、开始正式使用数据包来接收客户端发来的数据
        scoket.receive(packet);

        //4、从字节数组中,把接收到的数据直接打印出来
        int len = packet.getLength();
        String rs=new String(buffer,0,len);
        System.out.println(rs);

    }
}

多发多收

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建客户端对象
        DatagramSocket socket=new DatagramSocket();

        Scanner sc=new Scanner(System.in);

        //2、创建数据包对象封装发出去
        while (true) {
            System.out.println("请说:");
            String msg=sc.nextLine();
            if("exit".equals(msg)){
                System.out.println("欢迎下次光临!退出成功");
                socket.close();
                break;
            }
            byte[] bytes=msg.getBytes();
            DatagramPacket packet=new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),6666);

            //3、开始发送数据包的数据
            socket.send(packet);
        }

    }
}
public class Sever {
    public static void main(String[] args) throws Exception {
        System.out.println("----服务端启动-----");
        //1、创建一个服务端对象注册端口
        DatagramSocket scoket=new DatagramSocket(6666);

        //2、创建一个数据包对象,用于接收数据
        byte[] buffer=new byte[1024*64];
        DatagramPacket packet=new DatagramPacket(buffer,buffer.length);

        while (true) {
            //3、开始正式使用数据包来接收客户端发来的数据
            scoket.receive(packet);

            //4、从字节数组中,把接收到的数据直接打印出来
            int len = packet.getLength();
            String rs=new String(buffer,0,len);
            System.out.println(rs);

            System.out.println(packet.getAddress().getHostAddress());
            System.out.println(packet.getPort());
            System.out.println("-----------------");
        }

    }
}

TCP通信

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);
        
        //2、从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os=socket.getOutputStream();
        
        //3、把低级的字节输出流包装成数据输出流
        DataOutputStream dos=new DataOutputStream(os);
        
        //4、开始写数据出去
        dos.writeUTF("在一起");
        dos.close();
        
        socket.close();
    }
}

public class Sever {
    public static void main(String[] args) throws Exception {
        System.out.println("----服务端启动成功----");
        //1、创建SeverSocket的对象,同时为服务端注册窗口
        ServerSocket serverSocket=new ServerSocket(8888);
        
        //2、使用severSocket对象,调用一个accept方法,等待客户端的连接请求
        Socket socket=serverSocket.accept();
        
        //3、从socket通信管道中得到一个字节输入流
        InputStream is=socket.getInputStream();
        
        //4、把原始的字节输入流包装成数据输入流
        DataInputStream dis=new DataInputStream(is);
        
        //5、使用数据输入读取客户端发送过来的消息
        String rs=dis.readUTF();
        System.out.println(rs);
        System.out.println(socket.getRemoteSocketAddress());
        
        dis.close();
        socket.close();
    }
}

多发多收

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.*;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);

        //2、从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os=socket.getOutputStream();

        //3、把低级的字节输出流包装成数据输出流
        DataOutputStream dos=new DataOutputStream(os);
        
        Scanner sc=new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg=sc.nextLine();
            
            if("exit".equals(msg)){
                System.out.println("欢迎你下次光临!退出成功!");
                dos.close();
                socket.close();
                break;
            }
            
            //4、开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;

public class Sever {
    public static void main(String[] args) throws Exception {
        System.out.println("----服务端启动成功----");
        //1、创建SeverSocket的对象,同时为服务端注册窗口
        ServerSocket serverSocket=new ServerSocket(8888);

        //2、使用severSocket对象,调用一个accept方法,等待客户端的连接请求
        Socket socket=serverSocket.accept();

        //3、从socket通信管道中得到一个字节输入流
        InputStream is=socket.getInputStream();

        //4、把原始的字节输入流包装成数据输入流
        DataInputStream dis=new DataInputStream(is);

        while (true) {
            try {
                //5、使用数据输入读取客户端发送过来的消息
                String rs=dis.readUTF();
                System.out.println(rs);
            } catch (IOException e) {
                System.out.println(socket.getRemoteSocketAddress()+"离线了");
                dis.close();
                socket.close();
                break;
            }

        }
    }
}

与多个客户端同时通信

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.*;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);

        //2、从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os=socket.getOutputStream();

        //3、把低级的字节输出流包装成数据输出流
        DataOutputStream dos=new DataOutputStream(os);

        Scanner sc=new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg=sc.nextLine();

            if("exit".equals(msg)){
                System.out.println("欢迎你下次光临!退出成功!");
                dos.close();
                socket.close();
                break;
            }

            //4、开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}
import java.net.*;

public class Sever {
    public static void main(String[] args) throws Exception {
        System.out.println("----服务端启动成功----");
        //1、创建SeverSocket的对象,同时为服务端注册窗口
        ServerSocket serverSocket=new ServerSocket(8888);

        while (true) {
            //2、使用severSocket对象,调用一个accept方法,等待客户端的连接请求
            Socket socket=serverSocket.accept();

            System.out.println("有人上线了:"+socket.getRemoteSocketAddress());

           //3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理
            new SeverReaderThread(socket).start();
        }
    }
}
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class SeverReaderThread extends Thread{
    public SeverReaderThread(Socket socket){
        this.socket=socket;
    }
    private Socket socket;
    @Override
    public void run() {
        try {
            InputStream is=socket.getInputStream();
            DataInputStream dis=new DataInputStream(is);
            while (true){
                try {
                    String msg= dis.readUTF();
                    System.out.println(msg);
                } catch (IOException e) {
                    System.out.println("有人下线了:"+socket.getRemoteSocketAddress());
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

综合案例

群聊
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.*;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);

        //创建独立的线程,负责随机从socket中接收服务端发送来的消息
        new ClinetReaderThread(socket).start();

        //2、从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os=socket.getOutputStream();

        //3、把低级的字节输出流包装成数据输出流
        DataOutputStream dos=new DataOutputStream(os);

        Scanner sc=new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg=sc.nextLine();

            if("exit".equals(msg)){
                System.out.println("欢迎你下次光临!退出成功!");
                dos.close();
                socket.close();
                break;
            }

            //4、开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ClinetReaderThread extends Thread{
    public ClinetReaderThread(Socket socket){
        this.socket=socket;
    }
    private Socket socket;
    @Override
    public void run() {
        try {
            InputStream is=socket.getInputStream();
            DataInputStream dis=new DataInputStream(is);
            while (true){
                try {
                    String msg= dis.readUTF();
                    System.out.println(msg);

                } catch (Exception e) {
                    System.out.println("自己下线了:"+socket.getRemoteSocketAddress());
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
import java.net.*;
import java.util.ArrayList;
import java.util.List;

public class Sever {
    public static List<Socket> onLineSocket=new ArrayList<>();
    public static void main(String[] args) throws Exception {
        System.out.println("----服务端启动成功----");
        //1、创建SeverSocket的对象,同时为服务端注册窗口
        ServerSocket serverSocket=new ServerSocket(8888);

        while (true) {
            //2、使用severSocket对象,调用一个accept方法,等待客户端的连接请求
            Socket socket=serverSocket.accept();
            onLineSocket.add(socket);

            System.out.println("有人上线了:"+socket.getRemoteSocketAddress());

           //3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理
            new SeverReaderThread(socket).start();
        }
    }
}
import java.io.*;
import java.net.Socket;

public class SeverReaderThread extends Thread{
    public SeverReaderThread(Socket socket){
        this.socket=socket;
    }
    private Socket socket;
    @Override
    public void run() {
        try {
            InputStream is=socket.getInputStream();
            DataInputStream dis=new DataInputStream(is);
            while (true){
                try {
                    String msg= dis.readUTF();
                    System.out.println(msg);
                    //分发给客户端接收
                    sendMsgToAll(msg);
                } catch (Exception e) {
                    System.out.println("有人下线了:"+socket.getRemoteSocketAddress());
                    Sever.onLineSocket.remove(socket);
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void sendMsgToAll(String msg) throws Exception{
        //发送给全部在线的管道
        for (Socket onLineSocket : Sever.onLineSocket) {
            OutputStream os = onLineSocket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF(msg);
            dos.flush();
        }
    }

}

Java高级

单元测试

public class StringUntil {
    public static void printNumber(String name){
        if(name==null){
            System.out.println(0);
            return;
        }
        System.out.println("名字长度是:"+name.length());
    }

    public static int getMaxIndex(String data){
        if(data==null){
            return -1;
        }
        return data.length()-1;
    }
}
import org.junit.Assert;
import org.junit.Test;

public class StringUtilTest {
    @Test
    public void testPrintNumber(){
        StringUntil.printNumber("admin");
        StringUntil.printNumber(null);
    }
    @Test
    public void testGetMaxIndex(){
        int index1 = StringUntil.getMaxIndex(null);
        System.out.println(index1);

        int index2 = StringUntil.getMaxIndex("admin");
        System.out.println(index2);

        Assert.assertEquals("方法内部有不过!",4,index2);
    }
}

常见注解

反射

public class Test1class {
    public static void main(String[] args) throws Exception{
        Class c1= Student.class;
        System.out.println(c1.getName());

        System.out.println(c1.getSimpleName());

        Class c2 = Class.forName("com.au.Student");
        System.out.println(c1==c2);

        Student s=new Student();
        Class c3 = s.getClass();
        System.out.println(c3==c2);
    }
}

获取类的构造器

package com.au;

import org.junit.Test;

import java.lang.reflect.Constructor;

public class Test1class {
    public static void main(String[] args) throws Exception{
       @Test
       public void TestGetConstructors(){
           Class c= Cat.class;
            Constructor[] constructor = c.getConstructor();
            for (Constructor constructor : constructor) {
                System.out.println(constructor.getName()+"-->"+constructor.getParameterTypes());
            }
            
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述&#xff1a;加电后bios程序会自检硬件&#xff0c;硬件无故障&#xff0c;会根据第一启动项去找内核&#xff0c;一般来说&#xff0c;第一启动项是硬盘&a…

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的&#xff0c;共有734份文件&#xff0c;包括PDF&#xff0c;PPT&#xff0c;表格&#xff0c;图片&#xff0c;音频等多种格式&#xff0c;可以作为初级日语的学习教材&#xff0c;也是非常适合初学者入门的&#xff0c;可以帮助大家快速的…

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索和广度优先搜索&#xff0c;都是图形搜索算法&#xff0c;它两相似&#xff0c;又却不同&#xff0c;在应用上也被用到不同的地方。这里拿一起讨论&#xff0c;方便比较。 一、深度优先搜索 深度优先搜索属于图算法的一种&#xff0c;是一个针对图和树的遍历算法&…

西城微科|充气泵方案PCBA和芯片

智能充气泵是一种常见的充气工具&#xff0c;它在我们的日常生活中扮演着重要的角色。它主要用于给车辆、自行车、橡皮艇、游泳圈等充气&#xff0c;方便人们在各种场合使用。它简单方便的操作&#xff0c;快速高效的充气速度&#xff0c;以及便携的设计&#xff0c;让我们能够…

ubuntu系统没有网络图标的解决办法

参考文章:https://blog.csdn.net/qq_56922632/article/details/132309643 1. 执行关闭网络服务的命令&#xff0c;关闭网络服务sudo service NetworkManager stop2. 删除网络的状态文件sudo rm /var/lib/NetworkManager/NetworkManager.state3. 修改网络的配置文件sudo vi /etc…

如何避免LLM的“幻觉”(Hallucination)

生成式大语言模型&#xff08;LLM&#xff09;可以针对各种用户的 prompt 生成高度流畅的回复。然而&#xff0c;大模型倾向于产生幻觉或做出非事实陈述&#xff0c;这可能会损害用户的信任。 大语言模型的长而详细的输出看起来很有说服力&#xff0c;但是这些输出很有可能是虚…

Modbus 通信协议 二

Modbus 常用缩写 通用Modbus帧结构 -应用数据单元&#xff08;ADU&#xff09; Modbus数据模型 Modbus ADU 和 PDU 的长度 Modbus PDU结构 串行链路上的 Modbus 帧结构 Modbus 地址规则 ASCLL 模式 和 RTU 模式的比较 RTU 模式 RTU 模式位序列 帧格式 帧的标识与鉴别 CRC 循环冗…

linux系统下sql脚本的执行与导出

terminal中执行 执行 mysql -u [username] -p -D [databasename] < [XXX.sql] 导出 mysql -u [username] -p [datbasename] > [XXX.sql] 导出的数据库名自定义。 mysql -u [username] -p [databasename] [tablename] > [xxx.sql] 导出表名自定义 mysql shell 执行 …

众和策略:沪指震荡跌0.21%,煤炭、电力等板块拉升,核电概念活跃

2日早盘&#xff0c;三大股指盘中震荡走低&#xff0c;创业板指跌逾1%&#xff0c;北证50指数逆市拉升&#xff1b;北向资金大幅流出。 到午间收盘&#xff0c;沪指跌0.21%报2968.7点&#xff0c;深成指跌0.91%&#xff0c;创业板指跌1.38%&#xff0c;北证50指数涨1.33%&…

Java学习路线第六篇:互联网生态(1)

这篇则分享Java学习路线第六part&#xff1a;互联网生态 恭喜你已经成功追到第六章节啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完互联网生态的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 Linux Linux从入门到精通视…

基于电商场景的高并发RocketMQ实战-促销活动推送至用户完整流程、Spring结合RocketMQ的生产者消费者使用

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…

【Apache-2.0】springboot-openai-chatgpt超级AI大脑产品架构图

springboot-openai-chatgpt: 一个基于SpringCloud的Chatgpt机器人&#xff0c;已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图。用户可以在界面上与聊天机器人进行对话&#xff0c;聊天机器人会根据用户的输入自动生成回复。同时也支持画图&a…

【微服务架构】Spring Cloud入门概念讲解

目录 一、单体架构VS微服务架构 1.1 单体应用 单体架构的优点 单体应用的缺点 1.2 微服务“定义” 微服务的特性 微服务的缺点 微服务的适用场景 二、微服务常见概念与核心模块 三、Spring Cloud 工作流程 一、单体架构VS微服务架构 1.1 单体应用 一个归档包&#x…

数据损毁!250 亿美金的 Pinterest,在数据库选型上的翻车经历

原文链接 Pinterest 是一个以图片为主的社交网络&#xff0c;用户可以将图片保存或 "钉 / pin" 在自己的图板上。Pinterest 在 2019 年上市&#xff0c;目前市值 250 亿美金。本文内容主要根据 2012 年 Scaling Pinterest 的分享。 2012 年 1 月&#xff0c;Pinteres…

ARM NEON 指令

NEON指令 按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。 正常指令&#xff1a;生成大小相同且类型通常与操作数向量相同到结果向量。长指令&#xff1a;对双字向量操作数执行运算&#xff0c;生产四字向量到结果。所生成的元素一般是操作数元素宽度到…

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

Qt(三):udp组播的发送与接收

1. 创建UDP套接字 使用QUdpSocket类创建一个UDP套接字。 udpSendnew QUdpSocket(this);udpRecenew QUdpSocket(this); 2. 绑定套接字 绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。 如果要在组播中发送数据&#xff0c;可以将套接字绑定到一个通配符地址&#…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

计算机网络-以太网交换基础

一、网络设备的演变 最初的网络在两台设备间使用传输介质如网线等进行连接就可以进行通信。但是随着数据的传输需求&#xff0c;多个设备需要进行数据通信时就需要另外的设备进行网络互联&#xff0c;并且随着网络传输的需求不断更新升级。从一开始的两台设备互联到企业部门内部…

【OpenCV】在MacOS上源码编译OpenCV

在MacOS上源码编译OpenCV 1. 下载项目源码2. 创建CMake编译文件3. 编译安装4. 案例测试5. 总结 前言 在做视觉任务时&#xff0c;我们经常会用到开源视觉库OpenCV&#xff0c;OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件…