Java 基础重点知识-(Java 语言特性、数据类型、常见类、异常)

news2024/11/19 5:30:26

文章目录

  • Java 语言特性
    • 形参和实参的区别是什么?
    • 值传递和引用传递的区别?
    • Java 是值传递还是引用传递?
    • final 的作用是什么?
    • final finally finalize 有什么不同?
    • static 的作用是什么?
    • static 和 final 的区别是什么?
  • Java 数据类型
    • Java基本数据类型有几种? 各占多少位?
    • 基础类型和包装类型有什么区别?
    • 自动装箱和自动拆箱了解吗? 有什么区别?
      • Integer 的缓存机制
  • Java 常见类
    • Object 类的常见方法有哪些?
    • == 和 equals() 的区别?
    • 为什么要有 hashCode ?
    • 为什么重写 equals() 时要重写 hashCode() 方法?
    • 深拷贝和浅拷贝有什么区别?
    • 深拷贝有几种实现方式?
      • 实现 Cloneable 接口, 重写 clone 方法
      • 使用JSON字符串转换
      • 还可以使用第三方库实现深克隆
    • String StringBuffer StringBuilder 有什么区别?
    • Java 中的 String 为什么不可变?
  • Java 异常
    • 介绍 Java 的异常体系
      • 受检异常和未受检异常的区别是什么?
      • 如何自定义异常?

Java 语言特性

形参和实参的区别是什么?

  • 形参就是形式参数, 就是定义方法的时候使用的参数, 是用来接收调用者传递的参数的.
  • 实参就是实际参数, 是用于传递给方法时使用的参数, 在传递时需要进行赋值.

简单来说就是, 形参是用来接收值用的参数, 而实参是传递值时用的参数.

值传递和引用传递的区别?

  • 值传递就是在调用方法的时候, 将实际参数拷贝一份传递给方法, 这样在方法中修改形式参数的时候, 不会影响到实际参数.
  • 引用传递也叫地址传递, 就是在调用方法的时候, 将实际参数的地址传递给方法, 这样在方法种修改形式参数就会影响到实际参数.

Java 是值传递还是引用传递?

Java 不管传递的是基本数据类型还是引用数据类型, 都是值传递, 没有引用传递

  • 传递基础数据类型的时候, 实参和形参都是存储在不同的栈帧内, 修改形参的栈帧数据, 不会影响实参的数
  • 传递引用数据类型的时候, 形参和实参指向同一个地址的时候, 修改形参的内容就会影响到实参, 当形参和实参的地址不一样时, 就不影响.

final 的作用是什么?

final 表示不可变性, 可以用来修饰 类, 方法, 变量, 修饰类时, 表示这个类不能被继承, 修饰方法时, 表示这个方法不能被重写, 修饰变量时, 表示这个变量不能被修改.

  • 使用 final 修饰的变量在初始化后就不能被修改了, 这就能确保变量的值不变, 避免了意外的修改, 提高了代码可靠性. (不可变性)
  • 使用 final 修饰就不可变了, 在多线程情况下是线程安全的.(线程安全)
  • 由于 final 变量的值不变, 编译器可以在编译的时候进行一些优化, 比如在循环中提前计算表达式的结果, 缓存变量值等, 从而提高了运行效率.(性能优化)
  • 被 final 修饰的变量, 具有强有力的可见性, 当一个线程在写 final 的值时, 其他线程能立马看见. 而不会出现脏读的情况.(不存在可见性问题)
  • 通过 final 修饰, 明确表示这个变量是一个常量, 不应该被修改, 这也提高了代码的可读性, 让其他开发人员容易理解.(代码的可读性)

final finally finalize 有什么不同?

  • final 表示不可变性, 可以用来修饰 类, 方法, 变量, 修饰类时, 表示这个类不能被继承, 修饰方法时, 表示这个方法不能被重写, 修饰变量时, 表示这个变量不能被修改.
  • finally 是用于在 try-catch 后面的一个代码块, 无论是否有异常抛出, 都会执行到这个代码块, 比如 关闭 JDBC 连接.
  • finailze 是 Object 类的一个方法, 用于在对象被垃圾回收之前的一些清理工作, 但是垃圾回收的时机是不确定的, 所以 finalize 的执行时机也是不确定的, 在 JDK 9 之后标位弃用.

static 的作用是什么?

用一句话来说, 方便在没有创建对象的时候进行调用.
也就是说, 被 static 修饰的不需要通过创建对象的方式去调用, 可以直接通过类名去访问.

static 可以用来修饰 类(内部类), 方法, 变量, 代码块.

  • static 修饰的成员被所有对象共享.
  • static 修饰的成员优于对象存在, 在类加载时候就有了.
  • 直接通过类名调用.
  • 修饰的数据时共享数据, 对象中存储的特有数据.

static 和 final 的区别是什么?

它们是两个不同的关键字, 有着不同的作用和含义.

  • static 表示创建一个静态成员(内部类, 方法, 变量, 代码块).
  • final 表示 不可变性, 可以用来修饰类, 方法, 变量.

主要区别有:

  • static 修饰的变量可以被修改, 而 final 修饰的变量不能被修改.
  • static 修饰的变量可以被初始化多次, 而 final 修饰的变量只能被初始化一次(创建的时候初始化或在构造方法中初始化)
  • static 修饰的变量在类加载的时候初始化, 而 final 修饰的变量在对象创建的时候初始化.

Java 数据类型

Java基本数据类型有几种? 各占多少位?

Java 中基本数据类型有 8 种.
在这里插入图片描述

基础类型和包装类型有什么区别?

  • 包装类型可以表示 null 值, 而基本数据类型不行, 比如在接口传参中, 如果使用包装类即使前端不传参也不会报错, 如果使用基础类型, 前端忘记传参就会报错.
  • 包装类可以用于泛型, 而基础数据类型不能, 泛型要求不能使用基础数据类型, 使用基础类型会报错, 因为泛型在编译的时候, 会进行类型擦除, 最后只保留原始类型, 原始类型只能是 Object 或其子类.
  • 包装类中提供更多的功能和方法, 基础数据类型是没有的, 比如说 数学运算, 比较大小等.

自动装箱和自动拆箱了解吗? 有什么区别?

  • 自动装箱就是 基础类型转换成包装类型的过程.
  • 自动拆箱就是 包装类型转换成基础类型的过程.
public class AutoBoxingUnboxingExample {
    public static void main(String[] args) {
        // 自动装箱:将基本数据类型转换为对应的包装类对象
        int primitiveInt = 10;
        Integer boxedInt = primitiveInt; // 自动装箱
        
        // 自动拆箱:将包装类对象转换为对应的基本数据类型
        Integer boxedInteger = 20;
        int unboxedInt = boxedInteger; // 自动拆箱
        
        System.out.println("Boxed Integer: " + boxedInt);
        System.out.println("Unboxed int: " + unboxedInt);
    }
}

那么底层是怎么实现的呢?

我们进行反编译

public class AutoBoxingUnboxingExample {
    public AutoBoxingUnboxingExample() {
    }

    public static void main(String[] var0) {
        int primitiveInt = 10;
        Integer boxedInt = Integer.valueOf(primitiveInt);  // 自动装箱
        
        Integer boxedInteger = Integer.valueOf(20);
        int unboxedInt = boxedInteger.intValue();  // 自动拆箱
        
        System.out.println("Boxed Integer: " + boxedInt);
        System.out.println("Unboxed int: " + unboxedInt);
    }
}

通过反编译我们可以知道 自动装箱是通过 Integer.valueOf() 实现的, 自动拆箱是通过 Integer.intValue() 实现的.

Integer 的缓存机制

在 Java 中, Integer 类实现了一个简单的缓存机制, 对于在范围 -128 到 127 之间的整数, 会进行缓存, 以便重复使用相同值的 Integer 对象, 从而节省内存和提高性能.

public class IntegerCacheExample {
    public static void main(String[] args) {
        // 测试缓存范围内的整数
        Integer integer1 = 100;
        Integer integer2 = 100;
        System.out.println("integer1 == integer2: " + (integer1 == integer2));
         // 输出 true,因为范围在 -128 到 127 之间的整数被缓存

        // 测试超出缓存范围的整数
        Integer integer3 = 200;
        Integer integer4 = 200;
        System.out.println("integer3 == integer4: " + (integer3 == integer4)); 
        // 输出 false,因为超出缓存范围的整数没有被缓存
    }
}

Java 常见类

Object 类的常见方法有哪些?

Java Object 类是所有类的父类, 也就是说 Java 的所有类都继承了 Object 类, 可以使用 Object 的所有方法.
位于 java.lang 包中, 在编译的时候会自动导入.

  • protected Object clone()
    创建并返回一个对象的克隆

  • boolean equals(Object obj)
    比较两个对象是否相等

  • protected void finalize()
    当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。

  • Class<?> getClass()
    获取对象的运行时对象的类

  • int hashCode()
    获取对象的 hash 值

  • void notify()
    唤醒在该对象上等待的某个线程

  • void notifyAll()
    唤醒在该对象上等待的所有线程

  • String toString()
    返回对象的字符串表示形式

  • void wait()
    让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

  • void wait(long timeout)
    让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。

  • void wait(long timeout, int nanos)
    与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。。

具体信息可看 Object 类

== 和 equals() 的区别?

  • == 是操作符, 用于基础数据类型的时候, 是比较两个变量的值是否相同, 用于引用数据类型的时候, 是比较两个对象的引用是否相同.
  • equals() 是Object 类的一个方法, 默认是用来比较两个对象的引用是否相同, 但是在大部分时候都被重写为比较两个对象的值是否相同.

通常情况下, 我们会使用 == 比较两个基本数据类型是否相等和两个对象的引用是否相同, 使用 equals() 来比较两个对象的值是否相同(前提是重写了 equals() 方法).

为什么要有 hashCode ?

hashCode 的作用是获取哈希值, 这个哈希值的作用就是确定对象在哈希表中的索引位置, 这个HashCode 和 equals 共同协作来判断两个对象想否相等, 主要就是突出性能.

当我们比较两个对象是否相等的时候, 我们就可以先使用 hashCode 进行比较, 如果比较是 ture , 就可以使用 equals 再次确定两个对象是否相等, 如果比较结果是 true, 那么这两个对象就是相等的, 否则就不相等, 这就大大提高了对象比较的性能.

那为什么不直接使用 hashCode 就确定两个对象是否相等呢?
这是因为不同对象的 hashCode 可能相同;但 hashCode 不同的对象一定不相等,所以使用 hashCode 可以起到快速初次判断对象是否相等的作用。

为什么重写 equals() 时要重写 hashCode() 方法?

在 Java 中, 如果两个对象根据 equals() 判断相等, 那么他们的 hashCode() 也必须相等, 这是因为使用哈希数据结构(HashMap, HashSet 等)时, hashCode() 的返回值被用来确定对象在哈希表中的索引位置, 如果两个对象被 equals() 判断是相等时, hashCode() 却不相等, 这就会导致在哈希数据结构中无法正确的找到对象.

深拷贝和浅拷贝有什么区别?

  • 浅拷贝就是只拷贝栈内存中的数据, 不拷贝堆内存中的数据, 也就是浅拷贝只会拷贝原型对象, 不会拷贝引用对象.
  • 深拷贝就是既拷贝栈内存中的数据, 也拷贝堆内存中的数据, 也就是深拷贝既拷贝原型对象, 也拷贝引用对象.

在这里插入图片描述

在这里插入图片描述
更多信息深拷贝与浅拷贝的实现原理

深拷贝有几种实现方式?

实现 Cloneable 接口, 重写 clone 方法

class Address {
    private String city;

    public Address(String city) {
        this.city = city;
    }

    // 实现深拷贝的 clone 方法
    @Override
    public Object clone() {
        return new Address(this.city); // 创建新的 Address 对象并返回
    }

    public String getCity() {
        return city;
    }
}

class Person implements Cloneable {
    private String name;
    private int age;
    private Address address;

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 实现深拷贝的 clone 方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        // 克隆 Person 对象
        Person clonedPerson = (Person) super.clone();
        // 克隆 Address 对象
        clonedPerson.address = (Address) address.clone();
        return clonedPerson;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public Address getAddress() {
        return address;
    }
}

public class DeepCopyExample {
    public static void main(String[] args) {
        try {
            // 创建一个 Person 对象
            Address address = new Address("New York");
            Person originalPerson = new Person("Alice", 30, address);

            // 克隆该对象
            Person clonedPerson = (Person) originalPerson.clone();

            // 输出克隆后的对象的属性值
            System.out.println("Cloned Person: " + clonedPerson.getName() + ", " + clonedPerson.getAge() + ", " + clonedPerson.getAddress().getCity());

            // 修改原始对象的属性值
            originalPerson.getName().replace("Alice", "Bob");
            originalPerson.getAge() = 25;
            originalPerson.getAddress().setCity("Los Angeles");

            // 输出原始对象和克隆对象的属性值,验证克隆是深拷贝
            System.out.println("Original Person: " + originalPerson.getName() + ", " + originalPerson.getAge() + ", " + originalPerson.getAddress().getCity());
            System.out.println("Cloned Person: " + clonedPerson.getName() + ", " + clonedPerson.getAge() + ", " + clonedPerson.getAddress().getCity());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

Java中最常见的实现方式是通过实现 Cloneable 接口的方式来实现深拷贝.
缺点是比较麻烦,需要所有实体类都实现Cloneable接口,并重写clone方法。如果实体类中新增了一个引用对象类型的属性,还需要添加到clone方法中。

使用JSON字符串转换

import com.google.gson.Gson;

class Address {
    private String city;

    public Address(String city) {
        this.city = city;
    }

    // Getter 和 Setter 方法

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // Getter 和 Setter 方法

    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;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

public class DeepCopyUsingJSON {
    public static void main(String[] args) {
        // 创建一个 Person 对象
        Address address = new Address("New York");
        Person originalPerson = new Person("Alice", 30, address);

        // 使用 Gson 序列化和反序列化实现深克隆
        Gson gson = new Gson();
        String json = gson.toJson(originalPerson);
        Person clonedPerson = gson.fromJson(json, Person.class);

        // 修改原始对象的属性值
        originalPerson.setName("Bob");
        originalPerson.setAge(25);
        originalPerson.getAddress().setCity("Los Angeles");

        // 输出原始对象和克隆对象的属性值,验证克隆是深拷贝
        System.out.println("Original Person: " + originalPerson.getName() + ", " + originalPerson.getAge() + ", " + originalPerson.getAddress().getCity());
        System.out.println("Cloned Person: " + clonedPerson.getName() + ", " + clonedPerson.getAge() + ", " + clonedPerson.getAddress().getCity());
    }
}

还可以使用第三方库实现深克隆

String StringBuffer StringBuilder 有什么区别?

  • String 是线程安全的不可变字符串类, 每次修改都会创建一个新的对象.
  • StringBuffer 是线程安全的可变字符串, 它提供了 append() 或 add() 方法, 进一步提高了性能, 修改时不再创建新的对象.
  • StringBuilder 是线程不安全的可变字符串, 在能力上, 和StringBuffer 没有本质区别, 但是它去掉了线程安全部分, 有效减小了开销.

Java 中的 String 为什么不可变?

  • 能使 Java 节省大量的内存空间, 多个引用可以指向同一个字符串,(在字符串常量池中)
  • 第二个重要原因是安全性, 不可变字符串可以防止恶意代码通过修改字符串来破坏系统安全, 比如说, 在进行密码检验的时候, 攻击者可以通过修改字符串来绕过密码验证.
  • 线程安全, 不可变字符串是线程安全的, 在多线程环境下使用没有问题.

Java 异常

介绍 Java 的异常体系

异常主要分为 Exception 和 Error 两种, 它们都继承了 Throwable 类, Exception 又分为 运行时异常, 和非运行时异常.

  • 运行时异常, 就是RunTimeException类及其子类的异常, 在编译的时候不会检查的异常, 比如说空指针异常, 下标越界异常等, 程序中可以选择捕获处理, 也可以选择不捕获处理, 在编译时能顺利通过, 但是在运行的时候, 会被系统抛出.
  • 非运行时异常, 就是RunTimeException之外的异常, 就是必须要处理的异常, 不处理编译就不能通过, 比如 IOException, SQLException 自定义异常等.
  • Error 是虚拟机内部错误, 比如系统错误, 栈内存溢出错误(递归层数太多等), 堆溢出错误(创建的对象太多等) , 一般是运行环境中的严重问题, 也可能是因为程序员代码的问题(比如递归调用自身),
    在这里插入图片描述

受检异常和未受检异常的区别是什么?

  • 受检异常就是可查异常, 编译器要求必须处理的异常, 除了 RunTimeException 和其子类的异常意外, 其他的 Exception 及其子类都属于 受检异常, 必须进行捕获处理, 不然编译不能通过.
  • 未受检异常就是不可查异常, 编辑器不要求强制处理的异常, 包括 RunTimeException(运行时异常) 和 Error (错误)

如何自定义异常?

  1. 自定义异常类,然后继承自Exception 或者 RunTimeException
  2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因
// 自定义异常类
class CustomException extends Exception {
    // 构造方法
    public CustomException(String message) {
        super(message);
    }
}

// 使用自定义异常的示例
public class SimpleCustomExceptionExample {
    // 抛出自定义异常的方法
    public static void checkValue(int value) throws CustomException {
        if (value < 0) {
            throw new CustomException("Value cannot be negative");
        }
        // 其他处理逻辑
    }

    public static void main(String[] args) {
        try {
            checkValue(-1);
        } catch (CustomException e) {
            // 捕获自定义异常并处理
            System.out.println("Error message: " + e.getMessage());
        }
    }
}

异常机制详解-点击跳转

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

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

相关文章

Kasm Workspaces:云端工作的革命

工具用途 &#x1f6e0;️ Kasm Workspaces 是一款强大的开源容器流平台&#xff0c;它能够将云桌面、Web隔离以及OSINT工作负载直接交付到您的Web浏览器中。这意味着您可以通过任何地点的浏览器安全地访问您的工作环境&#xff0c;包括各种应用程序和桌面。&#x1f30d; 主…

【C语言】自定义类型联合和枚举讲解超详细

人生只有回不去的过去&#xff0c;没有过不去的当下。 &#x1f493;&#x1f493;&#x1f493; 目录 •&#x1f319;知识回顾 &#x1f34b;知识点一&#xff1a;联合体 • &#x1f330;1.联合体类型的声明 • &#x1f330;2.联合体的特点 • &#x1f330;3.相同成员的结…

Linux操作系统预备 —— 冯·诺伊曼体系结构

一&#xff0c;什么是冯诺伊曼体系结构&#xff1f;&#xff08;是什么&#xff1f;&#xff09; 上面的图就是冯诺伊曼体系结构的总体简略图&#xff0c;不着急&#xff0c;我们一个一个来看&#xff1a; 1.1 输入输出设备 人们要想用计算机处理数据&#xff0c;首先就要把要…

数据链路层(计算机网络)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。本文的撰写目的不是为了应试&#xff0c;且受限于个人水平&#xff0c;可能和标准答案有所出入&#xff0c;请自行甄别&#xff0c;…

Scikit-Learn回归树

Scikit-Learn回归树 1、决策树1.1、什么是决策树1.2、决策树学习的步骤1.3、决策树算法 1、决策树 决策树&#xff08;DTs&#xff09;是一种用于回归和分类的有监督学习方法。通常&#xff0c;决策树用于分类问题&#xff1b;当决策树用于回归问题时&#xff0c;称为回归树。回…

2024.阳光能源追光计划暨大陆考察团交流分享会

近日大陆考察团抵达香港&#xff0c;受到了本司热情接待和安排。公司于4月27日下午举办了阳光能源追光计划主题交流会。 会上公司营销部总监张超&#xff0c;分享了阳光能源近几年的能源发展之路及公司新推出的追光计划&#xff0c;得到了大陆考察交流团团长杨国均先生的高度赞…

【c++】反向迭代器的探究实现

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 在list中我们实现了正向的迭代器&#xff0c;学习完优先级队列后&#xff0c;我们也对适配器模式有了一个深刻的理解&#xff0c;这篇文章基于这种模式下&#xff0c;实现各类容器的反向迭…

基于STC12C5A60S2系列1T 8051单片机的Proteus中的单片机发送一帧或一串数据给串口调试助手软件接收区显示出来的串口通信应用

基于STC12C5A60S2系列1T 8051单片机的Proteus中的单片机发送一帧或一串数据给串口调试助手软件接收区显示出来的串口通信应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列…

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B>A>C&#xff0c;开放度&#xff1a;AB<C。 以下为A-C题选题建议及初步分析&#xff1a; A题&#xff1a;钢板最优切割路径问题 l 难度评估&#xff1a;中等难度。涉及数学建模和优化算法&#xff0c;需要设计最优的…

windows驱动开发-电源管理

驱动程序收到的电源IRP的主功能码是IRP_MJ_POWER 以及四个次要代码: IRP_MN_POWER_SEQUENCE 驱动程序将此 IRP 作为优化发送&#xff0c;以确定其设备是否实际进入了特定的电源状态。 对此 IRP 的支持是可选的。 若要发送此 IRP&#xff0c;驱动程序必须调用 IoAllocateIrp …

鸿蒙准备1

鸿蒙心路 感慨索性&#xff0c; 看看鸿蒙吧。打开官网相关介绍 新建工程目录结构 感慨 最近面试Android应用开发&#xff0c;动不动就问framework的知识&#xff0c;什么touch事件的触发源是啥&#xff08;eventHub&#xff09;&#xff0c;gc流程是啥&#xff0c;图形框架是什…

SpringCloudStream 3.x rabbit 使用

1. 前言 今天带来的是SpringCloudStream 3.x 的新玩法&#xff0c;通过四大函数式接口的方式进行数据的发送和监听。本文将通过 rabbitMQ 的方式进行演示 3.x版本后是 可以看到 StreamListener 和 EnableBinding 都打上了Deprecated 注解。后续的版本更新中会逐渐替换成函数式…

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统&#xff0c;你都会看到一些登录消息、警告或关于你已登录服务器的信息&#xff0c;如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…

深度学习之基于Matlab NN的伦敦房价预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 房价预测是房地产领域的一个重要问题&#xff0c;对于投资者、开发商以及政策制定者等都具有重要的指…

【写作吗。月入过万,8年写作路,10w+订阅创作者的18条建议】

Tom Kuegler &#xff1a;62k粉丝的medium独立作者&#xff0c;全网累计10w人订阅。他不是高深莫测&#xff0c;有资源背景的大V&#xff0c;也不是有运营团队的流量博主&#xff0c;而是从零开始&#xff0c;坚持不断写作的最普通创作者之一。 通过写作&#xff0c;他收入过万…

SpirngBoot整合快递100

目录 一、注册快递100 二、技术文档地址 三、需要认证的key和comcumer 四、spring boot 整合快递 100使用 4.1 引入快递100和hutool的依赖 4.2 将key和comcumer写入application.properties文件中 4.3 新建一个modle,用于将查出来的json数据转成对象 4.4 新建一个controll…

【yolov8】yolov8剪枝训练流程

yolov8剪枝训练流程 流程&#xff1a; 约束剪枝微调 一、正常训练 yolo train model./weights/yolov8s.pt datayolo_bvn.yaml epochs100 ampFalse projectprun nametrain二、约束训练 2.1 修改YOLOv8代码&#xff1a; ultralytics/yolo/engine/trainer.py 添加内容&#…

机器学习高频问答题总结

机器学习问答题总结 第一章 线性回归1.什么是线性回归&#xff1f;解释主要原理2.解释线性回归中最小二乘法的原理吗&#xff1f;3.如何评估线性回归模型的性能&#xff1f;4.线性回归中正则化的目的是什么吗&#xff1f;L1正则化和L2正则化有什么不同&#xff1f; 第二章 逻辑…

深入解析yolov5,为什么算法都是基于yolov5做改进的?(一)

YOLOv5简介 YOLOv5是一种单阶段目标检测算法&#xff0c;它在YOLOv4的基础上引入了多项改进&#xff0c;显著提升了检测的速度和精度。YOLOv5的设计哲学是简洁高效&#xff0c;它有四个版本&#xff1a;YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x&#xff0c;分别对应不同的模型大小…