当前位置: 首页 > news >正文

Java---Object和内部类

Object类和内部类

  • 前言:
  • 一、Object类
    • 1.object类初识
    • 2.Object的方法
      • 2.(1).获取对象的信息--toString方法
      • 2.(2).对象比较equals方法
      • 2.(3).hashCode方法
  • 二、内部类
    • 1.内部类初识:
    • 2.内部类的分类:
      • 2.(1).实例内部类
      • 2.(2).静态内部类
      • 2.(3).匿名内部类
      • 2.(4).局部内部类

前言:

上期内容为大家带来了抽象类与接口的知识点的学习,这期内容我将为大家带来了
Object类与内部类的两种类的学习,这其内容是对于类与对象的补充。

一、Object类

1.object类初识

Object类是Java中一个默认提供的类,Java里面内置了object类,其余所有的类都是具有继承关系的,默认继承Object父类,那么也就是所有的对象都是可以使用object的引用来接收。
所以也可以发生了向上转型。

class Person1{}
class Student{}
class Test {public static void main(String[] args) {function(new Person1());function(new Student());}public static void function(Object obj) {System.out.println(obj);}
}

在这里插入图片描述
这个时候我们可以看到打印的是对象所在位置的类型名和哈希值。

在这里插入图片描述
通过API文档,我们可以看到object类中有许多方法,这些方法我们都要全部掌握!
但是我们已经学习了clone方法了,这节我们要掌握三种方法,分别是:toString,hashCode,equals方法
hashCode我们后期在哈希表会再次进行详细的讲解。

2.Object的方法

2.(1).获取对象的信息–toString方法

class Person{public String name;public Person(String name, int age) {this.name = name;this.age = age;}  
}
public class Test {public static void main(String[] args) {Person person1 = new Person("张三",10);System.out.println(person1);Person person2 = new Person("张三",10);System.out.println(person2);
}   

在这里插入图片描述
这个时候我们看到打印的是对象所在位置的类型的名和哈希值
我们看一下Object类中toString方法的源码:
在这里插入图片描述
获取的是对象所在位置的类型的名和哈希值。
如果我们想要打印对象的成员信息,这个时候我们可以重写这个toString方法,去获取对象成员变量的信息。

class Person{public String name;public Person(String name, int age) {this.name = name;this.age = age;}public int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test {public static void main(String[] args) {Person person1 = new Person("张三",10);System.out.println(person1);Person person2 = new Person("张三",10);System.out.println(person2);
}    

既然重写toString方法,那么就会发生了多态。
在这里插入图片描述

2.(2).对象比较equals方法

在Java中,我们要比较两者数据之间的是否一样用等于号来进行,比如我们用==来进行比较,如果两者不一样,则返回假,一样就返回真。

public static void main(String[] args) {int a = 10;int b = 10;System.out.println(a == b);
}
//这个时候我们打印会的是true

那么我们比较两个自定义类型呢?

 public static void main(String[] args) {Person person1 = new Person("张三",10);System.out.println(person1);Person person2 = new Person("张三",10);System.out.println(person2);System.out.println("=========");System.out.println(person1 == person2);
}

在这里插入图片描述
这里表明了两个person不是同一个,为什么会出现这种情况呢?那么我们此时来观察一下他们所处的地址
在这里插入图片描述
我们看到了这两地址也就是哈希值是完全不同的,所以我们可以明白"=="
是比较自定义类型的地址是否是完全相同的。
有一个方法叫做equals,也是比较两个对象是否相同,下面我们可以看看这个方法的源码:
在这里插入图片描述
我们会发现它返回的是也是地址,比较判断对象是否指向了一个同一个地址。
所以直接调用还是会为false

但是我们不想让它比较的是地址,就像上述代码一般,两个张三的实例化,就应该是同一个对象,所以这个时候就要涉及到重写equals方法了。

class Person{public String name;public Person(String name, int age) {this.name = name;this.age = age;}public int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}
}
public class TestDemo {public static void main(String[] args) {Person person1 = new Person("张三",10);System.out.println(person1);Person person2 = new Person("张三",10);System.out.println(person2);System.out.println("=========");System.out.println(person1 == person2);//比较两者实例化后是不是一个person//结果是false//通过直接打印了它们的地址,发现两者的地址不同//所以  时候比较的就是变量中的值System.out.println(person1.equals(person2));}
}

这个时候我们重写equals方法,这个时候的结果就是:true
在这里插入图片描述
上述代码这个重写equals方法是IDEA为我们进行重写的,我们可以自己手动重写一个equals方法
比如:

 @Overridepublic boolean equals(Object obj) {if (obj == null) {//如果是被比较的对象是空类型return false ;}if(this == obj) {//两者指向了一个对象的空间,那么获得的地址是一个,所以两者是一个return true ;}// 不是Person类对象if (!(obj instanceof Person)) {//判断personreturn false ;}Person person = (Person) obj ; // 向下转型,比较属性值,两者的属性是自己定义的,不是object类return this.name.equals(person.name) && this.age==person.age ;}

两者的逻辑是一样的,都可以实现equals方法重写。

结论:所以通过equals方法的比较,我们要明白:如果是以后自定义的类型,那么一定要记住重写equals方法
并且在比较对象中内容是否相同的时候,一定要重写equals方法。

2.(3).hashCode方法

哈希值:hashcode这个方法会帮我们算出一个地址以16进制输出
我们看到对象那个的打印的时候,我们会发现打印了哈希值,也就是这个方法
在这里插入图片描述
hashCode方法,那么我们可以进行查看一下hashCode的源码:
在这里插入图片描述
native的方法代表着我们是本地方法,用C/C++来进行写的方法,所以我们也看不到的这个方法中的具体实现。
比如我们这个时候直接打印一下它们的哈希值:

System.out.println(person1.hashCode());
System.out.println(person2.hashCode());

在这里插入图片描述

我们可以发现两者的哈希值是不同的,但是也代表两者的地址不同,因为我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,所以这个时候我们就需要重写hashCode()方法了
我们在Person类中重写了hashCode方法:

	@Overridepublic int hashCode() {return Objects.hash(name, age);}

这个时候再来比较person1和person2是否相同:
在这里插入图片描述
我们可以看到结果是两者的哈希值是一样的。
如果我们没有重写了hashCode方法,那么就是直接打印的是两者的哈希值。
如果我们判断名字和姓名是一样,那么就不需要重复在开辟空间了,所以我们这个时候可以重写hashcode
所以我们重写的hashcode会发现某些对象出现在堆中同一个位置

后期讲到哈希表的时候便会知道(现实逻辑中的)如果两个一样的对象想放在同一个位置,
此时我就可以利用重写hashcode这个方法来实现
结论:
1、hashcode方法用来确定对象在内存中存储的位置是否相同
2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的
散列码,进而确定该对象在散列表中的位置。

二、内部类

1.内部类初识:

内部类:
在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
关于类,我们深知是一个类只有一个对应的字节码文件,但是如果我们遇到这种内部类,会发现一个类中还有一定的类,我们先写一个内部类,观察一下:

class OutClass{class InnerClass{}
}

通过IDEA打开了本地文件的字节码的文件:
在这里插入图片描述

我们可以看到它有OutClass和OutClass$InnerClass两个字节码文件
所以我们就可以知道内部类是外部类$内部类,当然还有一种是外部类$数字,我们会在后面讲解。

2.内部类的分类:

有三种内部类:静态、实例、匿名、局部 总共三种内部类;
使用频率:实例>静态>匿名>局部

2.(1).实例内部类

实例内部类就是在普通的类中去定义一个类,比如我们定义一个实例内部类:

class OutClass1{public int data1 = 1;public int data2 = 2;public static int data3 = 3;class InnerClass{public int data1 = 11111;public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void test(){System.out.println(data1);System.out.println(data5);System.out.println("内部类的test方法");}}public void test(){System.out.println("外部类的test方法");}
}

我们定义一个实例内部类,这个时候我们来执行这个实例内部类

public class Test2 {public static void main(String[] args) {OutClass1 outClass1 = new OutClass1(); System.out.println(outClass1.data1);System.out.println("================");InnerClass innerClass = new InnerClass();}
}     

这时候就会显示报错:
在这里插入图片描述
所以实例内部类不能同正常的类去进行实例化,我们应该注意,用外部类访问内部类
所以我们用外部类名去访问内部类:

OutClass1 outClass1 = new OutClass1(); 
OutClass1.InnerClass innerClass = outClass1.new InnerClass();//我们用对象名去调用内部类名
innerClass.test();//上述这种写法是把outClass的对象名给其去调用
//我们也可以直接把对象引用:
OutClass1.InnerClass innerClass2 = new OutClass1().new InnerClass();
innerClass2.test();

当内部类数据成员和外部类数据成员是同名的时候,会怎么样?,让我们来进行看一下:

在这里插入图片描述
这次执行成功了,但是我们会发现了外部类与内部类均有data1,但是我们发现打印的是内部类中的data1,
这个时候就是前面所讲的就近原则,Java的编译器进行检查的时候,发现内部类的data1与其位置最近,那么优先访问它
那么我们要访问外部的data1呢?我们可以加上引用,

class InnerClass{public int data1 = 11111;public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void test(){System.out.println(data1);System.out.println(this.data1);//我们加上了this引用,这个时候表明这个data1是哪一类中的System.out.println(OutClass1.this.data1);   System.out.println(data5);System.out.println("内部类的test方法");}
}

在这里插入图片描述

这个this就表明当前谁在调用这个内部类的成员变量,然后我们用外部类的this
那么可能会有人说,在外部类的方法中去访问内部类的成员,我们可以先来看一下:
在这里插入图片描述
//这个时候IDEA也就会自动爆红,显示出错,但是我们也可以来运行一下代码,但是也会发现它们会报错;
在这里插入图片描述
因为这个data4是在内部类中,我们没有内部类的实例化,外部类是无法访问的其内部类中的成员变量的
所以我们需要先进行内部类的实例化才可以执行这个代码:

public void test(){System.out.println("外部类的test方法");//访问内部类成员:/*System.out.println(data4);//这就报错了*/InnerClass innerClass = new InnerClass();System.out.println(innerClass.data4);
}

这个时候我们会发现内部类在外部类中的实例化的时候居然与普通的类进行实例化是一样的

总结:
获取实例内部类的对象的时候,依赖于外部类的对象;
要获得实例内部类对象,一定要先有外部类对象的访问。

这个时候我们前面的代码在内部类中提到了一个静态成员变量data6这个时候我们可以看一下这个代码行的结果:

//外部类中也有静态成员
class InnerClass{public int data1 = 11111;public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void test(){System.out.println(data1);System.out.println(data5);System.out.println("内部类的test方法");}
}

等待我们执行完成后会发现出现了错误,
在这里插入图片描述

因为static修饰的成员是不依赖于类本身,并且是最先执行的,而实例内部类确实需要依赖于外部类的对象,实例内部类是没有独立的储存空间来储存静态成员,如果直接用static修饰的话,会造成外部类的执行在加载的时候,导致访问静态成员会比较混乱,静态成员是属于类的,所以用final修饰我们可以确定是一个常量,并且表示对于开发者和编译器来说这只有一个这样的静态成员

所以我们最后应该写成:

public static final int data6 = 6;

通过类名进行访问,我们可以得到这样的结果:
在这里插入图片描述

2.(2).静态内部类

静态内部类就是在普通的类中用static来定义一个类

class OutClass2 {public int data1 = 1;public int data2 = 2;public static int data3 = 3;static class InnerClass{public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void test(){System.out.println(data1);System.out.println("内部类的test方法");}}
}

这个时候我们看到这个静态类中还有非静态成员,但是我们用类名访问只能是静态成员和静态方法,所以我们还需要把这个静态类进行实例化:

public class Test2 {public static void main(String[] args) {OutClass2.InnerClass innerClass = new OutClass2.InnerClass();innerClass.test();}
}

虽然我们把静态内部类进行实例化,但是我们还需要访问内部类中的静态成员最好还是用类名进行访问
我们执行完了这个程序后,发现了报错,我们在静态内部类无法直接访问外部类的非静态成员变量
在这里插入图片描述
所以我们也可以在静态内部类中进行实例化外部类,从而去访问它的成员变量

static class InnerClass{public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void test(){OutClass2 outClass2 = new OutClass2();System.out.println(outClass2.data1);System.out.println(data4);System.out.println(data5);System.out.println(data6);System.out.println("内部类的test方法");}
}

执行完后我们可以看到,可以直接打印出来
在这里插入图片描述
我们会看到两个特殊的变量:静态变量data3和data6两者
在外部类中也可以直接用内部类的类名访问其中的静态成员变量data6
但是我们在静态内部类中可以直接访问外部类中的静态成员变量data3

static class InnerClass{public int data4 = 4;private int data5 = 5;public static int data6 = 6;public void test(){System.out.println(data3);}
}

在这里插入图片描述

在静态内部类中我们可以直接访问外部类中的静态成员变量,非静态成员需要将外部类进行实例化,才可以进行访问。

2.(3).匿名内部类

匿名内部类是没有类名的一种类,但是前提也是根据接口,来实现的
那么我们需要首先定义一个接口:

interface A{void testA();
}
public class Test2 {public static void main(String[] args) {new A(){@Overridepublic void testA() {System.out.println("X!");}}}
}

这种方式就是匿名内部类,这时候我们发现这个类没有名字,实现了接口A,也重写了接口A中的方法
那么这种类怎么去调用呢?
我们可以在尾大括号后加入了.testA(),便可以调用这个类
在这里插入图片描述
当然我们可以像类一样去进行接口的**“实例化”**,得到了也是匿名内部类,

public class Test2 {public static void main(String[] args) {int val = 10;A a = new A() {@Overridepublic void testA() {System.out.println("值:" + val);}};a.testA();System.out.println(val);}
}

去定义一个接口,去实现这个方法,但是我们依旧发现了这个类没有名字
正常类应该有class来定义,这里面的类没有用class来定义,所以它依旧是匿名内部类
在这里插入图片描述
如果我们这个时候去修改val的值,会发生什么呢?

public class Test2 {public static void main(String[] args) {int val = 10;val = 100;A a = new A() {@Overridepublic void testA() {System.out.println("值:" + val);}};a.testA();System.out.println(val);}
}

在这里插入图片描述
可是执行完之后我们发现它报错了。

因为在匿名内部类当中能够访问的是没有被修改过的数据
这种限制叫做变量的捕获
所以默认在匿名内部类中能访问的是被final修饰的变量,隐式的

2.(4).局部内部类

局部内部类:定义在方法的内部
它不能被public,static等访问限定符修饰
编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
这种类只能在方法体中使用:

public class Test4 {public void func(){class Inner{public int data = 1;}Inner inner = new Inner();System.out.println(inner.data);}public static void main(String[] args) {Test4 test4 = new Test4();test4.func();System.out.println();}
}

在这里插入图片描述
我们在日常中很少用到局部内部类,所以我们在这里不太过深入进行讲解。

好了,感谢大家的支持,这期的内容就先到这里了,当然如果某些地方的不足,欢迎大家在评论区中指正!

相关文章:

Java---Object和内部类

Object类和内部类 前言:一、Object类1.object类初识2.Object的方法2.(1).获取对象的信息--toString方法2.(2).对象比较equals方法2.(3).hashCode方法 二、内部类1.内部类初识:2.内部类的分类:2.(1).实例内部类2.(2).静态内部类2.(3).匿名内部…...

【OSPF协议深度解析】从原理到企业级网络部署

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心配置实现案例1:单区域基础配置案例2:多区域配置案例3:安全认证配置 运行…...

linux tar命令详解。压缩格式对比

1.压缩格式对比 压缩格式命令选项文件扩展名压缩率速度无压缩-cvf.tar无最快gzip-czvf.tar.gz中等较快bzip2-cjvf.tar.bz2较高较慢xz-cJvf.tar.xz最高最慢 9. 更多参考 【Linux基础】文件压缩tar命令指南tar压缩方式对比...

C++和Lua混和调用

为什么要C/C 流行的语言,学习人员多高性能,对于嵌入式设备则是省电大量的第三方库 为什么要Lua C缺点:编译慢,调试难,学习难度大Lua优点: 最快的脚本语言可以编译调试与C/C结合容易Lua是对性能有要求的必…...

Cadence高速系统设计流程及工具使用

上一章已经谈到,在Cadence的高速设计流程中,有两个重要的工具SigXP和Constrain Manager(CM约束管理器)。SigXP是仿真分析工具和约束生成工具,我们就是使用这个工具对关键信号进行仿真的。SI工程师通过对仿真结果的分析…...

Unity:AddTorque()(增加旋转力矩)

目录 什么是 AddTorque()? 第一性原理出发:什么是 Torque(力矩)? Torque 公式 Unity 中 AddTorque 的工作原理 参数属性 🔍 Linear Drag(线性阻力) 线性阻力模拟的现实情况&…...

嵌入式硬件设计全解析:从架构到实战

一、嵌入式硬件设计核心架构与系统组成​ 1. 处理器选型与架构设计​ (1)处理器类型与应用场景​ 处理器类型​ 代表架构 / 型号​ 典型应用场景​ 核心优势​ 微控制器(MCU)​ ARM Cortex-M3/M4、STM32F 系列​ 低功耗控制、小型设备​ 集成外设、低功耗、低成本​ 微处…...

R7打卡——糖尿病预测模型优化探索

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.检查GPU import torch.nn as nn import torch.nn.functional as F import torchvision,torch# 设置硬件设备,如果有GPU则使用,没有…...

win10开了移动热点,手机无法连接,解决办法(chatgpt版)

提问: win10连着网线上网,有无线网卡intel Wireless-AC 9560网卡 可以用电脑开移动热点给手机连接吗?如何设置?我现在可以开热点,但是手机连不上,显示正在获取ip地址后就连不上了 chatgpt回答&#xff1a…...

下载core5compat 模块时,被禁止,显示 - servese replied: Forbbidden. -->换镜像源

怎么解决? --->换镜像源 方法 1:使用命令行参数指定镜像源 在运行 Qt 安装器时,通过 --mirror 参数指定镜像源: # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…...

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《用无人机仿真玩转PID控制:MATLAB四旋翼仿真建模全攻略》

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-✈️ 用无人机仿真玩转PID控制:MATLAB四旋翼仿真建模全攻略 🚁 欢迎来到这篇超级详细的MATLAB四旋翼无人机仿真教程!无论你是控制理论爱好者、无人机发烧友,还是M…...

GESP2024年3月认证C++八级( 第二部分判断题(1-5))

孙子定理参考程序&#xff1a; #include <iostream> #include <vector> using namespace std;// 扩展欧几里得算法&#xff1a;用于求逆元 int extendedGCD(int a, int b, int &x, int &y) {if (b 0) {x 1; y 0;return a;}int x1, y1;int gcd extende…...

PHP的现代复兴:从脚本语言到企业级服务端引擎的演进之路-优雅草卓伊凡

PHP的现代复兴&#xff1a;从脚本语言到企业级服务端引擎的演进之路-优雅草卓伊凡 一、PHP的历史误解与现实真相 1.1 被固化的陈旧认知 当卓伊凡浏览知乎上关于PHP的讨论时&#xff0c;发现大量回答仍然停留在十年前的刻板印象中。这些误解包括但不限于&#xff1a; “PHP只…...

手表功能RunModeTasks

RunModeTasks 功能解释 “RunModeTasks 执行特定于当前模式的功能 根据模式控制作行为”这句话是指 OV-Watch 智能手表项目中的一组任务&#xff0c;这些任务负责管理设备的运行模式并根据不同模式控制设备的行为。 主要组成部分 RunModeTasks 主要由以下三个部分组成&#…...

Qt6.8中进行PDF文件读取和编辑

1.环境配置 在 .pro 文件中添加 PDF 模块依赖&#xff1a; QT core gui pdf # 添加 pdf 模块 注意&#xff1a;独立 pdf 模块的起始版本是Qt 5.15&#xff0c;建议需要 PDF 功能的开发者优先选择此版本或更高版本 2.读取PDF 文件 核心类&#xff1a;QPdfDocument&#xf…...

Barrett Reduction算法优化:更紧的界限消除冗余的减法

1. 引言 Barrett Reduction 是一种被广泛使用的模 m m m 运算算法。在zkSecurity 受NEAR团队所委托的&#xff08;针对RustCrypto: NIST P-256 (secp256r1) elliptic curve——https://github.com/RustCrypto/elliptic-curves/tree/master/p256&#xff09;进行的 Rust p256 …...

Node.js 是什么?

Node.js 是什么? Node.js 是一个基于 Chrome V8 JavaScript 引擎 的 跨平台 JavaScript 运行时环境,用于在服务器端运行 JavaScript 代码。它使开发者能够使用 JavaScript 编写后端(服务端)程序,而不仅仅局限于浏览器端(前端)。 1. Node.js 的核心特点 (1) 基于 Chrom…...

数据结构中 数组、链表、图的概念

数据结构是计算机存储、组织数据的方式&#xff0c;数组、链表和图是三种常见的数据结构&#xff0c;下面为你详细介绍它们的概念&#xff1a; 数组 数组是一种线性数据结构&#xff0c;它由一组相同类型的元素组成&#xff0c;这些元素存储在连续的内存位置上。每个元素都可…...

基于PPO的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 在上一篇使用了DDPG算法完成自动驾驶小车绕圈任务之后&#xff0c;继续学习了PPO算法&…...

Three.js + React 实战系列 - 客户评价区细解教程 Clients 组件✨(回答式评价 + 评分星级)

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦&#xff01;&#xff01;谢谢大家&#xff01;&#xff01;&#xff01; 在这篇博客中&#xff0c;我们将实现一个简洁的 Hear from My Clients 客户评价区域。这个区块在个人主页中可以突显用户体验和专业度&#xff0c;帮…...

2048游戏(含Python源码)

前言 相关参考游戏&#xff1a; 像素飞机大战&#xff08;含Python源码&#xff09;-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147693018?spm1001.2014.3001.5501使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例-CSDN博客https://blog.csdn.n…...

百度golang开发一面

讲一下数据库的事务机制&#xff1f;acid特性是靠什么实现的&#xff1f; 持久性 redo log 原子性 undo log 隔离性 MVCC或next-lock锁 四个隔离级别是什么&#xff0c;分别解决什么问题&#xff1f; 可串行化实现原理 mysql锁机制&#xff1f;介绍锁的类型&#xff0c;以及原理…...

【Springboot知识】Springboot计划任务Schedule详解

文章目录 Spring Boot 定时任务从原理到实现详解一、核心原理分析1. 架构分层2. 核心组件3. 线程模型 二、基础实现步骤1. 添加依赖2. 主类配置3. 定时任务类 三、高级配置技巧1. 自定义线程池2. 动态配置参数3. 分布式锁集成&#xff08;Redis示例&#xff09; 四、异常处理机…...

大模型推理--从零搭建大模型推理服务器:硬件选购、Ubuntu双系统安装与环境配置

自从大模型火了之后就一直想自己组装一台机器去深入研究一下大模型&#xff0c;奈何囊中羞涩&#xff0c;迟迟也没有行动。在下了很大的勇气之后&#xff0c;终于花了接近4万块钱组装了一台台式机&#xff0c;下面给大家详细介绍一下我的装机过程。 1.硬件配置 研究了一周&am…...

如何使用QWidgets设计一个类似于Web Toast的控件?

如何使用QWidgets设计一个类似于Web Toast的控件&#xff1f; 前言 ​ 笔者这段时间沉迷于给我的下位机I.MX6ULL做桌面&#xff0c;这里抽空更新一下QT的东西。这篇文章是跟随CCMoveWidget一样的文章&#xff0c;尝试分享自己如何书写这份代码的思考的过程&#xff0c;和笔者…...

博图V20编译报错:备不受支持,无法编译。请更改为受支持的设备。

使用高版本博图打开低版本博图的工程文件时&#xff0c;hmi编译报错不通过&#xff0c;报错提示&#xff1a;备不受支持&#xff0c;无法编译。请更改为受支持的设备。 原因&#xff1a;当前版本的博图软件没有或不支持该组态设备的固件版本。 解决办法&#xff1a;1、安装报错…...

凸性(Convexity)

凸性&#xff08;Convexity&#xff09;是一个跨学科的重要概念&#xff0c;广泛应用于数学、优化理论、金融等领域。其核心含义是描述某种结构&#xff08;如函数、集合&#xff09;在特定条件下的“无凹陷”性质。 1. 数学中的凸性 1.1 凸函数与凹函数 在数学分析中&#…...

Vuex使用指南:状态管理

一、什么是状态管理&#xff1f;为什么需要 Vuex&#xff1f; 1. 状态管理的基本概念 在 Vue 应用中&#xff0c;状态指的是应用中的数据。例如&#xff1a; 用户登录状态购物车中的商品文章列表的分页信息 状态管理就是对这些数据的创建、读取、更新和删除进行有效管理。 …...

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…...

【Python】Python好玩的第三方库之二维码生成,操作xlsx文件,以及音频控制器

前言 &#x1f31f;&#x1f31f;本期讲解关于python的三种第三方库的使用介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么…...

VTK 交互类介绍

基本概念 交互器(Interactor): 处理用户输入事件的基础类 交互样式(InteractorStyle): 定义具体的交互行为 Widgets: 可交互的UI组件,如滑块、按钮等 Picker: 用于选择场景中的对象 常用交互类 类名功能描述vtkRenderWindowInteractor渲染窗口交互器vtkInteractorStyle交互样式…...

在Window10 和 Ubuntu 24.04LTS 上 Ollama 在线或离线安装部署

Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;服务框架&#xff0c;旨在通过轻量化、跨平台的设计&#xff0c;简化大模型在本地环境中的部署与应用。其基于 Go 语言开发&#xff0c;通过 Docker 容器化技术封装模型运行环境&#xff0c;提供类似命令行工具的交…...

语音合成之十一 提升TTS语音合成效果:低质量数据清洗、增强与数据扩增

低质量数据清洗、增强与数据扩增 1. 引言&#xff1a;TTS的基石——数据质量2. 基础&#xff1a;TTS数据准备工作流2.1 规划&#xff1a;定义蓝图2.2 执行&#xff1a;从原始数据到训练就绪格式2.3 最佳实践与可复现性 3. 攻克缺陷&#xff1a;低质量语音数据的清洗与增强3.2 手…...

RGB三原色

本文来源 &#xff1a; 腾讯元宝 ​​RGB三原色&#xff08;红绿蓝&#xff09;详解​​ RGB&#xff08;Red, Green, Blue&#xff09;是光学的三原色&#xff0c;通过不同比例的混合可以产生人眼可见的绝大多数颜色。它是现代显示技术&#xff08;如屏幕、投影仪&#xff09…...

BUUCTF 大流量分析(一) 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki BUUCTF:大流量分析&#xff08;一&#xff09; 题目描述&#xff1a; 某黑客对A公司发动了攻击&#xff0c;以下是一段时间内我们…...

虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅

虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅1.电源管理2.显卡优先设置3.拯救者支持FnQ性能模式切换&#xff0c;建议开发前切至“野兽模式”或高性能模式。4.NVIDIA 驱动设置5.VS2022中…...

suna工具调用可视化界面实现原理分析(一)

这是一个基于React构建的工具调用侧边面板组件&#xff0c;主要用于展示和管理自动化工具调用流程。以下是代码功能解析及关键组件分析&#xff1a; 一、核心功能模块 多工具视图切换系统 • 动态视图加载&#xff1a;通过getToolView函数根据工具名称&#xff08;如execute-c…...

【将你的IDAPython插件迁移到IDA 9.x:核心API变更与升级指南】

文章目录 将你的 IDAPython 插件迁移到 IDA 9.x&#xff1a;核心 API 变更与升级指南为什么 API 会变化&#xff1f;关键不兼容性一&#xff1a;数据库信息访问 (inf_structure)关键不兼容性二&#xff1a;窗口/视图类型判断 (BWN_* 和 form_type)其他可能的 API 变更迁移策略建…...

《Python星球日记》第31天:Django 框架入门

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、Django…...

读《人生道路的选择》有感

读完戴维坎贝尔的《人生道路的选择》&#xff0c;深有感触&#xff0c;虽然只有短短的108也&#xff0c;但作者强调了在复杂的生活环境之中“选择”的重要性。这也是我想要探讨的话题&#xff0c;选择到底会对我们人生产生怎样的影响。 在我们人生当中&#xff0c;确实有许多的…...

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程&#xff0c;编译过程中会用到OpenCV、OpenCV_Contrib、Toolkit、Cmake、VS2022等工具&#xff0c;最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases/#&#xff0…...

STC单片机与淘晶驰串口屏通讯例程之01【新建HDMI工程】

大家好,我是『芯知识学堂』的SingleYork,今天笔者给大家一起学习这款“SYK-0806-A2S1”控制板与淘晶驰串口屏通讯的例程,本例使用的是淘晶驰的4.3寸电阻触摸屏TJC4827T143_011R_I_P20,分辨率为480272,详细参数大家可以查看这个屏的手册。 先来看下本例程整体的效果: 那么…...

PE文件结构(导出表)

导出表 什么是导出表&#xff1f; 导出表是PE文件中记录动态链接库&#xff08;DLL&#xff09;对外提供的函数或数据的列表&#xff0c;包含函数名称、序号和内存地址等信息&#xff0c;供其他程序调用 我们写一个dll来查看一下导出函数 int exportFunc1(int a, int b) {ret…...

网络安全自动化:精准把握自动化边界,筑牢企业安全防

在当今数字化时代&#xff0c;网络攻击的威胁日益严峻&#xff0c;企业网络安全的重要性不言而喻。随着海量资产与复杂架构的出现&#xff0c;网络安全自动化成为了众多企业关注的焦点。网络安全维护看似简单的修补系统、删除旧账户、更新软件&#xff0c;在大型企业中却极易变…...

实战设计模式之中介者模式

概述 中介者模式是一种强大且灵活的设计模式&#xff0c;适用于需要优化对象间通信的场景。中介者模式通过引入一个中介对象&#xff0c;来封装一系列对象之间的交互。在没有中介者的情况下&#xff0c;这些对象之间可能会直接相互引用&#xff0c;导致系统中的类紧密耦合&…...

价格识别策略思路

该策略是一种基于价格形态和市场条件的交易算法&#xff0c;旨在通过识别特定的价格模式来生成买入和卖出信号。 价格形态识别 策略的核心在于识别价格的高点和低点形态。通过比较当前周期及其前几个周期的最高价和最低价&#xff0c; 策略定义了一系列条件来判断价格是否形成了…...

Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)

先来看一个具体应用&#xff1a;假设我们有一个App&#xff0c;App中有一个退出应用的按钮&#xff0c;点击该按钮后并不是立即退出&#xff0c;而是先弹出一个对话框&#xff0c;询问用户是否确定要退出&#xff0c;用户点了确定再退出&#xff0c;点取消则不退出&#xff0c;…...

【NLP】32. Transformers (HuggingFace Pipelines 实战)

&#x1f916; Transformers &#xff08;HuggingFace Pipelines 实战&#xff09; 本教程基于 Hugging Face 的 transformers 库&#xff0c;展示如何使用预训练模型完成以下任务&#xff1a; 情感分析&#xff08;Sentiment Analysis&#xff09;文本生成&#xff08;Text …...

[ 设计模式 ] | 单例模式

单例模式是什么&#xff1f;哪两种模式&#xff1f; 单例模式就是一个类型的对象&#xff0c;只有一个&#xff0c;比如说搜索引擎中的索引部分&#xff0c;360安全卫士的桌面悬浮球。 饿汉模式和懒汉模式&#xff1a;饿汉模式是线程安全的&#xff0c;懒汉模式不是线程安全的…...

用网页显示工控仪表

一.起因 现在工控也越来越多的使用web页面来显示电压,电流,温度,转速等物理量.本例使用js控制网页显示速度仪表. 二.代码 <html> <head><script type"text/javascript">var ctx;var px0;var movePoint{x0:0,x1:0};function init(){drawFace();m…...