二、数据类型、运算符
1. 数据的表示详解
1.1 算术运算符
整数在计算机中的存储原理先从最基本的算术运算符开始学习,算术运算符有 + - * / %
,其中*
表示乘法,/
表示除法,%
表示取余数
需要我们注意以下几点
/: 两个整数相除,结果也是一个整数
%: 表示两个数相除,取余数
其实任何数据在计算机中都是以二进制表示的。那这里肯定有人问,什么是二进制啊?所谓二进制其实就是一种数据的表示形式,它的特点是逢2进1。
数据的表示形式除了二进制(逢2进1),八进制(逢8进1)、还有十进制(逢10进1)、十六进制(逢10进1)等
1.二进制中只有0和1两个数
首先十进制的0和二进制的0是一样的,十进制的1和二进制的1也是 一样的。但是十进制中 有2,但是二进制中就没有2了2.那么二进制是如何表示十进制的2呢?
1
+ 1
——————————
10 这里两个1相加,结果为2,由于二进制满2进1,所以最终结果103.那么二进制是如何表示十进制的3呢?
前面我们已经知道二进制10表示十进制的2,那么二进制10+1就表示十进制的3啊!
10
+ 1
—————————
11 十进制的3对应的二进制是114.那么二进制是如何表示十进制4的呢?
前面我们已经知道二进制11表示十进制的4,那么11+1就表示十进制的5啊
11
+ 1
—————————
100 十进制的5对应的二进制是100你找到规律了吗? 你能不能依次写出5的二进制、6的二进制?
- 除2取余法
1.怎么做呢?
答:让十进制数据连续除以2,直到商为0,余数反转2.举例1:把十进制6转换为二进制
商 余数
6/2 3 0
3/2 1 1
1/2 0 1
然后把余数反转:6对应的二进制是1103.举例2: 把十进制13转换为二进制
商 余数
13/2 6 1
6/2 3 0
3/2 1 1
1/2 0 1
然后把余数反转:10对应的二进制是11014.练习1:你能把十进制7转换为二进制吗?
自己试试吧!
- 计算机的最小存储单位
前面我们已经知道计算机表示数据是用二进制来的, 这里我又要抛出一个问题来了! 我现在想要在计算机中存储一个整数6,转换为二进制是110,那么计算机中只是存110吗三位数字吗? 其实不是的,计算机中最小的存储单位是字节(Byte),一个字节占8位(bit),也就是说即使这个数据不足8位也需要用8位来存储。
我们随便找到一个文件,看文件的属性,可以看到文件的大小都是以字节为单位的。
1.2 字符在计算机中的存储原理
字符在计算机中是如何存储的呢?
其实字符并不是直接存储的,而是把每一个字符编为一个整数,存储的是字符对应整数的二进制形式。美国人搞了一套字符和整数的对应关系表,叫做ASCII编码表。
ASCII编码表中字符编码的规律:
1.字符0对应48,后面的1,2,3,4...9 对应的十进制整数依次往后顺延
2.字符a对应97,后面的b,c,d,e...z 对应的十进制整数依次往后顺延
3.字符A对应65,后面的B,C,D,E...Z 对应的十进制整数依次往后顺延
需要注意的是,在ASCII编码表中是不包含汉字的。汉字在其他编码表中。
1.3 图片视频声音的存储原理
- 图片的存储
通过上面的学习我们已经知道整数和字符是如何存储的,最终都是要转换为二进制数据的, 那图片、声音、视频又是如何存储的呢?
我们从图片开始,如果你把一张图片不断的放大,你会看到有马赛克的效果。你会发现图片中的每一个细节是由一个一个的小方格组成的,每一个小方格中其实就是一种颜色。任何一种颜色可以使用三原色来表示,简称RGB,其中R(红色),G(绿色),B(蓝色),而RGB中每一种颜色又用一个字节的整数来表示,最小值是0最大值是255。
RGB(0,0,0)表示黑色
RGB(255,255,255)表示白色
RGB(255,0,0) 表示红色
RGB(255,255,0) 表示红色和绿色混合为黄色
RGB(255,0,255) 表示红色和蓝色混合为紫色
...
你在画图板的颜色编辑器中可以通过指定RGB的值,来调整得到任意的颜色。一张图片实际上就是有很多个小方块的颜色组成的,而每一种颜色又是由RGB三原色的整数表示的,整数最终会转换为二进制进行存储。
- 视频的存储
实际上视频和图片是一样的,把多张图片连续播放,在一秒钟内连续播放24张以上,由于人眼存在视觉暂留现象,人眼感受不到画面切换的时间间隔,就认为是连续的视频了。
- 声音的存储
了解过物理的同学肯定知道,声音是以波的形式传播的。我们可以把声波在表示在一个坐标系上,然后在坐标系上取一些点,把这些点的坐标值以二进制的形式存储到计算机中,这就是声音的存储原理。
1.4 数据的其他表示形式
- 二进制到十进制的转换
前面学习了十进制可以转二进制,采用的是除2取余法,那么我们反过来能不能把二进制转换为十进制呢?
这里给大家介绍一种计算方式叫做:8421码
为了便于理解,我们先在看一下十进制怎么转十进制,主要是为了让大家看到演化过程
1.十进制转十进制
比如我们把12345进行分解:
12345 = 10000 + 2000 + 300 + 40 + 5
= 1*10^4 + 2*10^3 + 3*10^2 + 5*10^0
我们发现:
在十进制中如果把十进制的每一位从右往左从0开始编一个号,假设这一位数字是a, 那么这一位数表示的值就是:a*10^n;----------------------------------------------------------------------二2.二进制转十进制:
类比十进制:
如果把二进制的每一位从从右往左0开始编一个号用n表示,假设二进制的每一位是a,
那么这一位表示的十进制值是:a*2^n1)假设二进制的每一位都是1:
128 64 32 16 8 4 2 1 每一位表示的十进制:a*2^n
7 6 5 4 3 2 1 0 编号:n
1 1 1 1 1 1 1 1 二进制的每一位:a二进制 十进制
11111111 = 1*2^7 + 1*2^6 + 1*2^5 + ... + 1*2^0
= 128 + 64 + 32 + ... + 1
= 2552)假设二进制的为0010001
128 64 32 16 8 4 2 1 每一位表示的十进制:a*2^n
7 6 5 4 3 2 1 0 编号:n
0 0 1 0 0 0 0 1 二进制的每一位:a二进制 十进制
00001101 = 0*2^7 + 0*2^6 + 1*2^5 + ... + 1*2^0
= 0 + 0 + 32 + ... + 1
= 333)8421码:从右往左给二进制的每一位数依次按照1 2 4 8...标记
128 64 32 16 8 4 2 1
0 0 1 0 0 0 0 1
-----------------------------
只需要将1位上的数字加起来,就是二进制对应的十进制二进制 十进制
00001101 = 8+4+1
= 130000111 = 4+2+1
= 70001111 = 8+4+2+1
= 25
- 二进制转八进制
前面我们说计算机中数据都是采用二进制来存储的,但是二进制阅读和编写起来都不太方便。为了便于阅读和书写,又推出了八进制、十六进制。
1.运算规则:
把二进制的每三位一组合,然后对每三位用8421码进行计算,最后拼接到一起
原因:因为111,的值是7, 再大满7就需要往进位了。 2.把二进制11001110转换为八进制数据
01 100 001 二进制每三位一组合
1 4 1 每一组进行8421码运算
----------
八进制:141
- 二进制转十六进制
1.运算规则:
把二进制的每四位一组合,然后对每四位用8421码进行计算,最后拼接到一起
原因:因为1111,的值是15, 再大1满16了就需要往进位了。 2.举例:把二进制11001110转换为十六进制数据
0110 0001 二进制每四位一组合
6 1 每一组进行8421码运算
----------
十六进制:613.练习:把111100转换为十六进制
0011 1100
3 12 由于十六进制中有a,b,c,d,e,f分别表示10,11,12,13,14,15
-----------
十六进制:3c
1.5 不同进制在Java程序中的书写格式
System.out.pirntln('a'+1); //98
System.out.pirntln(0b01100001); //97
System.out.pirntln(0141); //97
System.out.pirntln(0x61); //97
2. 数据类型详解
在前面的课程中,我们学过了变量的定义,在定义变量时我们是要声明数据类型的,这里的数据类型是用来规定变量存储什么类型的数据**。
比如这里的就是限制变量只能存储整数; 除了int这种数据类型Java还提供了很多其他的数据类型。Java的数据类型整体上来说分为两大类: 基本数据类型、引用数据类型。
我们今天主要学习基本数据类型,基本数据类型一共有4类8种,每一种数据类型占用的内存空间不一样,能够表示的数据范围也不一样。如下图所示
需要我们注意的是,随便写一个整数或者小数的字面量,它也是有默认数据类型的
- 比如23,它默认就为int类型;如果加上后缀L,则为long类型;
- 比如23.8,它默认为double类型;如果加上后缀F,则为float类型;
下面定义各种类型的变量,将这8种基本数据类型都用一下。
public class TypeDemo1 {public static void main(String[] args) {// 目标:掌握8种基本数据类型,用来定义变量。// 1、整型byte number = 98;System.out.println(number);short number2 = 9000;int number3 = 12323232; // 默认// 注意:随便写一个整型字面量,默认是int类型的,73642422442424虽然没有超过long的范围,但是它超过了本身int的范围了。// 如果希望随便写一个整型字面量是long类型的,需要在其后面加上L/llong number4 = 73642422442424L;// 2、浮点型//注意://随便写一个小数字面量,默认当成double类型对待的,//如果希望这个小数是float类型的,需要在后面加上:F/ffloat score1 = 99.5F;double score2 = 99.8; // 默认定义方案。// 3、字符型char ch1 = 'a';char ch2 = '中';char ch3 = '国';// 4、布尔型boolean b1 = true;boolean b2 = false;// 引用数据类型:String.// String代表的是字符串类型,定义的变量可以用来记住字符串。String name = "黑马";System.out.println(name);}
}
2.1 数据类型转换
2.1.1 自动类型转换
各位同学,接下来我们来学习类型转换的知识。为什么要学习类型转换呢?因为在我们实际开发中可能存在将某种类型变量的值,赋值给另一个类型的变量;也可能存在多种数据类型的数据一起运算的情况。
在以上情况中,其实都会涉及到类型转换。类型转换的形式总体分为2种,一种是自动类型转换,一种是强制类型转换。 这里先学习自动类型转换
- 什么是自动类型转换呢?
答:自动类型转换指的是,数据范围小的变量可以直接赋值给数据范围大的变量
byte a = 12;
int b = a; //这里就发生了自动类型转换(把byte类型转换int类型)
- 自动类型转换的原理是怎样的?
答:自动类型转换其本质就是在较小数据类型数据前面,补了若干个字节
除了byte和int之间的转换之外,其他类型也可以转换,转换顺序如下图所示
下面我们通过代码演示一下,自动类型转换的各种形式。
public class TypeConversionDemo1 {public static void main(String[] args) {// 目标:理解自动类型转换机制。byte a = 12;int b = a; // 发生了自动类型转换了System.out.println(a);System.out.println(b);int c = 100; // 4double d = c;// 8 发生了自动类型转换了System.out.println(d);char ch = 'a'; // 'a' 97 => 00000000 01100001int i = ch; // 发生了自动类型转换了 => 00000000 00000000 00000000 01100001System.out.println(i);}
}
- 表达式的自动类型转换
自动类型转换还有另外一种形式,就是表达式的自动类型转换。所谓表达式指的是几个变量或者几个数据一起参与运算的式子。
如果同一个表达式中,出现不同类型的变量或者数据一起运算,这种情况下运算结果是一个什么数据类型呢?需要遵守下面的两条运算规则:
1.多种数据类型参与运算,其结果以大的数据类型为准
2.byte,short,char 三种类型数据在和其他类型数据运算时,都会转换为int类型再运算
接下来我们来看代码演示,自己试一试
public class TypeConversionDemo2 {public static void main(String[] args) {// 目标:掌握表达式的自动类型转换机制。byte a = 10;int b = 20;long c = 30;long rs = a + b + c;System.out.println(rs);double rs2 = a + b + 1.0;System.out.println(rs2);byte i = 10;short j = 30;int rs3 = i + j;System.out.println(rs3);// 面试笔试题: 即使两个byte运算,结果也会提升为intbyte b1 = 110;byte b2 = 80;int b3 = b1 + b2;System.out.println(b3);}
}
2.1.2 强制类型转换
前面我们学习了自动类型转换,我们知道可以将数据类型小的数据可以直接赋值给数据范围大的变量。 那反过来,能不能将数据范围大的数据直接赋值给数据范围小的变量呢? 答案是会报错。
因为数据范围大的数据,赋值给数据范围小的变量,它有可能装不下;就像把一个大桶的水倒入一个小桶中,有溢出的风险。
- 什么是强制类型转换
但是你强行将范围大的数据,赋值给范围小的变量也是可以的,这里就需要用到强制类型转换。下面是强制类型转换的格式
目标数据类型 变量名 = (目标数据类型)被转换的数据;
下面是强制类型转换的代码演示
public class TypeConversionDemo3 {public static void main(String[] args) {// 目标:掌握强制类型转换。int a = 20;byte b = (byte) a; // ALT + ENTER 强制类型转换。System.out.println(a);System.out.println(b);int i = 1500;byte j = (byte) i;System.out.println(j);double d = 99.5;int m = (int) d; // 强制类型转换System.out.println(m); // 丢掉小数部分,保留整数部分}
}
- 强制类型转换的原理
强制类型转换的原理,其实就是强行把前面几个字节砍掉,但是有数据丢失的风险。
3. 运算符
计算机是用来处理数据的,处理数据就少不了对数据的计算,想要对数据进行计算就必须用到运算符。
运算符就是参与运算的符号。Java提供的运算符有很多种,可以分为算术下面几种
- 基本算术运算符
- 自增自减运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 三元运算符
3.1 算术运算符
先从最基本的算术运算符开始学习,算术运算符有 + - * / %
,其中*
表示乘法,/
表示除法,%
表示取余数
需要我们注意以下几点
/: 两个整数相除,结果也是一个整数
%: 表示两个数相除,取余数
需要我们注意的是:+符号除了用于加法运算,还可以作为连接符。+符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串。
下面通过代码演示一下各种算术运算符的运算效果
public class OperatorDemo1 {public static void main(String[] args) {// 目标:掌握基本的算术运算符的使用。int a = 10;int b = 2;System.out.println(a + b);System.out.println(a - b);System.out.println(a * b); // 20System.out.println(a / b); // 5System.out.println(5 / 2); // 2.5 ==> 2System.out.println(5.0 / 2); // 2.5int i = 5;int j = 2;System.out.println(1.0 * i / j); // 2.5System.out.println(a % b); // 0System.out.println(3 % 2); // 1System.out.println("---------------------------------------");// 目标2:掌握使用+符号做连接符的情况。int a2 = 5;System.out.println("abc" + a2); // "abc5"System.out.println(a2 + 5); // 10System.out.println("itheima" + a2 + 'a'); // "itheima5a"System.out.println(a2 + 'a' + "itheima"); // 102itheima}
}
3.2 自增自减运算符
接下来,学习一种比较常用的运算符:++ 和 - -
++读作自增,- -读作自减; 运算规则如下
需要我们注意的是,自增自减只能对变量进行操作,不能操作字面量。具体使用时也分为两种情况,如下:
1.单独使用:++或者--放在变量前面没有区别int a =10; a++; //11--a; //10System.out.println(a); //102.混合使用:++或者--放在变量或者前面运算规则稍有不通过//++在后:先做其他事情,再做自增和自减int a = 10;int b = a++; //等价于 int b = a; a++; //++在前:先自增或者自减,再做其他运输int x = 10;int y = --x; //等价于x--; int y = x;
下面通过代码演示一下++和- -的用法
public class OperatorDemo2 {public static void main(String[] args) {// 目标:掌握自增自减运算符的使用。int a = 10;// a++; // a = a + 1++a;System.out.println(a);// a--; // a = a - 1--a;System.out.println(a);// 自增自减只能操作变量不能操作字面量的,会报错!//System.out.println(2++);System.out.println("--------------------------------------");int i = 10;int rs = ++i; // 先加后用System.out.println(rs);System.out.println(i);int j = 10;int rs2 = j++; // 先用后加System.out.println(rs2);System.out.println(j);}
}
3.3 赋值运算符
接下来,我们学习赋值运算符。基本的赋值运算符其实就是"="号,意思就是把右边的数据赋值给左边的变量。
int a = 10; //将数据10赋值给左边的变量a
除了基本的赋值运算符,我们这里主要学习一下扩展的赋值运算符。
我们以+=为例来看一下它的运算规则,其他的运算符运算同理分析即可
int a = 10;
//+=解析:在a原来记录值10的基础上累加5,将结果重新赋值给a;
a+=5;
//最终打印a的值为15
System.out.println(a);
下面通过一个首发红包的例子给大家演示一下
public class OperatorDemo3 {public static void main(String[] args) {// 目标:掌握扩展赋值运算符的使用。// +=// 需求:收红包double a = 9.5;double b = 520;a += b; // a = (double)(a + b);System.out.println(a);// -= 需求:发红包double i = 600;double j = 520;i -= j; // i = (double)(i - j);System.out.println(i);int m = 10;int n = 5;// m *= n; // 等价形式: m = (int)(m * n)// m /= n; // 等价形式: m = (int)(m / n)m %= n; // 等价形式: m = (int)(m % n)System.out.println(m);}
}
学完扩展赋值运算符的基本使用之后,接下来我们看一个面试题
问题1:下面的代码否有问题?byte x = 10;byte y = 30;x = x + y; //这句代码有问题,因为两个byte类型数据相加,会提升为int类型;问题2:下面的代码是否有问题?byte x = 10;byte y = 30;x+=3; //这句代码没有问题,因为这里有隐含的强制类型转换//x+=3; 等价于 byte x = (byte)(x+y);
到这里赋值运算符就学习完了,稍微总结一下
1.基本赋值运算符:=符号含义: 把右边的值赋值给左边的变量2.扩展赋值运算符:+= -= *= /= %=符号含义:将右边的数据和左边的变量相加、相减、相乘、相除、取余数后,将结果重新赋值给左边的变量。
3.4 关系运算符
接下来我们学习一个,在实际代码中用得很多,但是又非常简单的运算符,叫关系运算符。关系运算符(也叫比较运算符)。
下图是每一种关系运算符的符号及作用,每一个关系运算符的结果都是false
下面通过代码来家演示一下,各种关系运算符的效果
public class OperatorDemo4 {public static void main(String[] args) {// 目标:掌握关系运算符的基本使用。int a = 10;int b = 5;boolean rs = a > b;System.out.println(rs);System.out.println(a >= b); // 要么a大于b,或者a等于bSystem.out.println(2 >= 2); // trueSystem.out.println(a < b);System.out.println(a <= b); // falseSystem.out.println(2 <= 2); // trueSystem.out.println(a == b); // falseSystem.out.println(5 == 5); // true// 注意了:判断是否相等一定是用 == ,=是用来赋值的。// System.out.println(a = b); System.out.println(a != b); // trueSystem.out.println(10 != 10); // falseSystem.out.println(false ^ true ^ false);}
}
现在我们只需要知道每一种关系运算符的运算效果就行了,关于关系运算符的实际运用需要在后面学习了流程控制语句才能实际用到。
关系运算符在程序中常用于条件判断,根据条件判断的结果是true还是false,来决定后续该执行哪些操作。
3.5 逻辑运算符
逻辑运算符是用来将多个条件放在一起运算,最终结果是true或者false
下面我们通过几个案例来演示一下逻辑运算符的使用
//需求1:要求手机必须满足尺寸大于等于6.95,且内存必须大于等于8.
//需求2:要求手机要么满足尺寸大于等于6.95,要么内存必须大于等于8.
逻辑运算符在程序中常用于组合几个条件判断,根据条件判断的结果是true还是false,来决定后续该执行哪些操作。
3.6 三元运算符
先认识一下三元运算符的格式:
关系表达式? 值1 : 值2;
三元运算的执行流程:首先计算关系表达式的值,如果关系表达式的值为true,则返回值1;如果关系表达式的值为false, 则返回值2;
如下图所示:判断学生的成绩是否>=60,如果为true,就考试通过;如果为false,就成绩不合格。
接下来通过代码来演示一下,目的是让大家掌握三元运算符的格式和执行流程。
public class OperatorDemo6 {public static void main(String[] args) {// 目标:掌握三元运算符的基本使用。double score = 58.5;String rs = score >= 60 ? "成绩及格" : "成绩不及格";System.out.println(rs);// 需求2:找出2个整数中的较大值,并输出。int a = 99;int b = 69;int max = a > b ? a : b;System.out.println(max);// 需求3:找3个整数中的较大值。int i = 10;int j = 45;int k = 34;// 找出2个整数中的较大值。int temp = i > j ? i : j;// 找出temp与k中的较大值。int max2 = temp > k ? temp : k;System.out.println(max2);}
}
3.7 运算优先级
如果你想要知道各个运算符的优先级,哪些先算哪些后算,可以参考下面这张图
从图中我们发现,&&运算比||运算的优先级高,所以&&和||同时存在时,是先算&&再算||;
比如下面的代码
//这里&&先算 相当于 true || false 结果为true
System.out.println(10 > 3 || 10 > 3 && 10 < 3); // true
最后给大家说一下,在实际开发中,其实我们很少考虑运算优先级, 因为如果你想让某些数据先运算,其实加"()"就可以了,这样阅读性更高。
//有括号先算 相当于 true && false 结果为false
System.out.println((10 > 3 || 10 > 3) && 10 < 3); //false
4. 案例技术:获取用户键盘输入的数据
下面我们想让自己键盘录入数据,然后参与程序的运行。
键盘录入这个事情,其实并不是我们自己做的,而是Java本身就提供了这样的功能,我们按照它的要求,去调用就行。
我们在安装JDK的时候,其实JDK中就已经包含了一些Java写好的代码,我们把Java写好的代码直接拿过来用就行。
比如:Scanner就是Java提供给我们用于键盘录入数据的类,为了录入不同类型的数据,还提供了不同的功能,每一个功能会有不同的名称,我们只需要调用Scanner提供的功能就可以完成键盘录入数据。
大家只需要按照下面的步骤编写代码,就可以键盘录入数据了
【第1步】:在class类上导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。import java.util.Scanner;【第2步】:得到一个用于键盘扫描器对象(照抄代码就行,固定格式)//Scanner是键盘扫描器对象(你就把它理解成一个东西),这个东西有录入的功能//sc是给这个东西取的名字Scanner sc = new Scanner(System.in);【第3步】:开始调用sc的功能,来接收用户键盘输入的数据。//sc这个东西有键盘录入整数的功能,这个功能的名字叫nextInt()//.表示表示调用的意思int age = sc.nextInt();System.out.println("我的年龄是:"+age);//sc这个东西还有键盘录入字符串的功能,这个功能的名字叫nextString name = sc.next();System.out.println("我的姓名是:"+name);
下面是完整代码演示
public class ScannerDemo1 {public static void main(String[] args) {// 1、导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。// 2、抄写代码:得到一个键盘扫描器对象(东西)Scanner sc = new Scanner(System.in);// 3、开始 调用sc的功能,来接收用户键盘输入的数据。System.out.println("请您输入您的年龄:");int age = sc.nextInt(); // 执行到这儿,会开始等待用户输入一个整数,直到用户按了回车键,才会拿到数据。System.out.println("您的年龄是:" + age);System.out.println("请您输入您的名字:");String name = sc.next(); // 执行到这儿,会开始等待用户输入一个字符串,直到用户按了回车键,才会拿到数据。System.out.println(name + "欢迎您进入系统~~");}
}
本篇文章参考于B站 黑马程序员视频课程及其相关资料
相关文章:
二、数据类型、运算符
1. 数据的表示详解 1.1 算术运算符 整数在计算机中的存储原理先从最基本的算术运算符开始学习,算术运算符有 - * / % ,其中*表示乘法,/表示除法,%表示取余数 需要我们注意以下几点 /: 两个整数相除,结果也是一个…...
结构形模式---桥接模式
概念 桥接模式是一种结构化模式,是将一个大类或者一系列的紧密相关的类拆分为抽象和现实两个独立部分的层次结构,通过引用独立层次对象的组合实现类。 桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不…...
计算机网络知识速记:HTTP1.0和HTTP1.1
计算机网络知识速记:HTTP1.0和HTTP1.1 1. 基本概念 1.1 HTTP1.0 HTTP1.0是1996年发布的第一个正式版本,主要用于客户端与服务器之间的简单请求和响应交互。它的设计理念相对简单,适合处理一些基本的网页服务。 1.2 HTTP1.1 HTTP1.1是HTT…...
Windows下查看WIFI密码
目录 命令行查看历史WIFI netsh wlan show profiles 命令行查看某一特定WIFI密码 netsh wlan show profile name “WIFI名” keyclear 打开命令行https://blog.csdn.net/weixin_70822378/article/details/145598560?spm1001.2014.3001.5502 命令行查看历史WIFI nets…...
Android车机DIY开发之软件篇(十二) AOSP12下载编译
Android车机DIY开发之软件篇(十二) AOSP12下载编译 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib gmultilib libc6-dev-i386 lib32ncurses5-dev libx11-dev lib32z-dev ccache libgl1-mesa-…...
Datawhale Ollama教程笔记2
本期学习易错点: 改文件后缀 改了models的存储地址后,把下载和新建的文件存储在什么地方 注册hugging face,找到token. 学习手册:https://datawhalechina.github.io/handy-ollama/#/ 第 3 章 自定义导入模型https://datawhalechina.gith…...
ClickHouse的前世今生
ClickHouse是一款由Yandex开发的高性能列式存储数据库管理系统,专为在线分析处理(OLAP)设计,适用于实时数据分析、大规模数据处理和复杂查询场景。以下是关于ClickHouse的安装、使用及应用场景的详细介绍: 一、ClickHouse的安装 ClickHouse支持多种操作系统,包括Linux、…...
SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)
SSH隧道Nginx:内网资源访问的绿色通道 问题背景 模拟生产环境,使用两层Nginx做反向代理,请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现,重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…...
html文件怎么转换成pdf文件,2025最新教程
将HTML文件转换成PDF文件,可以采取以下几种方法: 一、使用浏览器内置功能 打开HTML文件:在Chrome、Firefox、IE等浏览器中打开需要转换的HTML文件。打印对话框:按下CtrlP(Windows)或CommandP(M…...
大促备战中稳定性建设策略与总结
文章目录 接口流量评估、上下游依赖梳理降级能力建设应急响应预案建设压力测试监控报警建设容灾演练 之前也专门写过日常稳定性建设的一些策略,传送门 -> 日常稳定性建设策略与总结,本文想专门聊聊大促期间做的一些稳定性保障,顺便记录自己…...
vscode/cursor+godot C#中使用socketIO
在 Visual Studio Code(VS Code)中安装 NuGet 包(例如SocketIOClient),你可以通过以下几种方法: 方法 1:使用dotnet cli 打开终端:在 VS Code 中按下Ctrl 或者通过菜单View -> Terminal打开终端。 导…...
Uniapp 原生组件层级过高问题及解决方案
文章目录 一、引言🏅二、问题描述📌三、问题原因❓四、解决方案💯4.1 使用 cover-view 和 cover-image4.2 使用 subNVue 子窗体4.3 动态隐藏原生组件4.4 使用 v-if 或 v-show 控制组件显示4.5 使用 position: fixed 布局 五、总结Ἰ…...
jQuery介绍(快速、简洁JavaScript库,诞生于2006年,主要目标是简化HTML文档操作、事件处理、动画和Ajax交互)
文章目录 **核心功能 & 亮点**1. **简化 DOM 操作**2. **链式调用**3. **跨浏览器兼容**4. **便捷的事件绑定**5. **Ajax 封装**6. **动画效果** **现状与适用场景**- **传统项目维护**:许多旧系统(如 WordPress 插件、老企业网站)仍依赖…...
第三节 docker基础之---Commit+Dockerfile制作
docker目前镜像的制作两种方法: 1,基于docker Commit制作镜像 2,基于dockerfile制作镜像,Dockerfile 为主流的制作方式 如果不制作镜像删除容器之后则里面配置的文件也随之删除: [rootdocker ~]# docker images 查看…...
通过openresty和lua实现随机壁纸
效果: 图片存放路径: /home/jobs/webs/imgs/ ├── default/ │ ├── image1.jpg │ ├── image2.png ├── cats/ │ ├── cat1.jpg │ ├── cat2.gif ├── dogs/ │ ├── dog1.jpg访问http://demo.com/imgs/default 随机返回…...
企业网站如何快速实现全站HTTPS安全访问?
当用户访问您的网站时,若您的企业网站仍以HTTP协议运行,浏览器“不安全”警告不仅会吓退潜在客户,还会拖累搜索引擎排名,直接影响业务转化和品牌声誉。实现全站HTTPS安全访问,已成为企业网站运营的必选项。 本文为您详…...
《花未眠》夜间四时醒来,海棠花未眠
《花未眠》夜间四时醒来,海棠花未眠 川端康成(1899-1972)日本作家。新感觉派。1968年以“敏锐的感受,高超的叙事技巧,表现日本人的精神实质”获诺贝尔文学奖。诺贝尔文学奖提名作有《雪国》《千羽鹤》《古都》。 陈德文…...
在nodejs中使用RabbitMQ(三)Routing、Topics、Headers
示例一、Routing exchange类型direct,根据消息的routekey将消息直接转发到指定队列。producer.ts 生产者主要发送消息,consumer.ts负责接收消息,同时也都可以创建exchange交换机,创建队列,为队列绑定exchangeÿ…...
kubeconfig存放内容有哪些
kubeconfig 文件是 Kubernetes 用于配置和认证的核心文件。它包含了关于如何访问 Kubernetes 集群的信息。以下是 kubeconfig 文件中常见的一些内容结构: apiVersion: 指定 kubeconfig 的版本,通常是 v1。clusters: 定义了集群的信息,包括集…...
图神经网络是什么,有什么实际应用
图神经网络是什么 图神经网络(Graph Neural Network,GNN)是一种专门用于处理图结构数据的神经网络,它能对图中的节点、边和整个图进行学习和推理,在社交网络分析、生物信息学、推荐系统等领域应用广泛。以下是其原理及示例说明: 图神经网络原理 节点表示学习:为图中每…...
如何将DeepSeek配置到离线电脑(内网)中?— 附Ollama夸克下载链接
1、在外网和内网电脑中分别安装Ollama 如下载速度较慢,安装包附在本文最后。 下载完成后傻瓜一键安装即可。 2、下载deepseek 在外网电脑中启动命令行输入下载命令。以下载8B为例,其他版本同。 ollama run deepseek-r1:8b 3、资源转移 在外网电脑…...
拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动
拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动 1. 前情: 1TB的硬盘,分了120G作ubuntu22.04。/boot: 300MB, / : 40GB, /home: 75G, 其余作swap area。 2. 一开始按这个教程:对我无效 https://blog.csdn.net/Eric_xkk/article/details/1…...
vue项目 Axios创建拦截器
Axios 1. Axios 和 Ajax 简介2. Axios 和 Ajax 的区别3. 从 按钮 到 Axios请求后端接口的 大致顺序 1. Axios 和 Ajax 简介 Ajax(Asynchronous JavaScript and XML) 不是一种技术,而是一个编程技术概念,核心是通过 XMLHttpReques…...
web前端第三次作业
题目 本期作业 WEB第三次作业 请使用JS实一个网页中登录窗口的显示/隐藏,页面中拖动移动,并且添加了边界判断的网页效 代码图片 效果展示 代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8&qu…...
滑动窗口算法笔记(C++)
滑动窗口算法是一种基于双指针技巧的高效算法, 常用于解决数组或字符串上的一些特定问题. 算法讲解 基本概念 滑动窗口算法可以想象成在一个数组或字符串上有一个固定大小或者可变大小的窗口, 该窗口在数组或字符串上从左到右滑动. 在滑动的过程中, 根据具体问题的要求, 对窗…...
day02冒泡排序
思路: 外层循环控制循环次数(i<len),设置swapFlagfalse内层循环j1(j<len-i),两两(j和j-1)比较,逆序则交换内层每次循环结束,没有交换,则break结束 内层循环j从1开始,小于len,…...
【工业场景】用YOLOv8实现火灾识别
火灾识别任务是工业领域急需关注的重点安全事项,其应用场景和背景意义主要体现在以下几个方面: 应用场景:工业场所:在工厂、仓库等工业场所中,火灾是造成重大财产损失和人员伤亡的主要原因之一。利用火灾识别技术可以及时发现火灾迹象,采取相应的应急措施,保障人员安全和…...
管式超滤膜分离技术都可以应用到哪些行业?
管式超滤膜分离技术由于其高效、稳定和适应性强的特点,在多个行业都有广泛的应用: 1. 生物制药与医药行业 纯化与浓缩:在生物药品的下游处理阶段,管式超滤膜被用来纯化抗体、疫苗、蛋白质等生物大分子,通过精确筛选分子…...
数智百问 | 制造企业如何降低产线检测数据的存储和管理成本?
在《“十四五”智能制造发展规划》等政策的推动下,以及新能源汽车、消费电子等品牌商对产品质量和供应商智能化水平要求的提升,半导体、电子制造、动力电池等先进制造行业企业纷纷推进产线智能化升级,并投入大量机器视觉检测设备以实现自动化…...
Linux中getifaddrs函数
文章目录 **函数原型****参数****返回值****释放资源****`struct ifaddrs` 结构****示例代码****输出示例****相关函数****总结**getifaddrs 是 Linux(以及其他 Unix-like 系统)中用于获取本机网络接口信息的系统调用。它提供了一种简单的方法来获取所有网络接口的地址信息,…...
Barra多因子模型
Barra模型 1. Barra模型概述1.1 Barra模型的历史与发展1.2 Barra模型在全球市场中的应用 2. Barra模型的基本原理2.1 APT理论基础2.2 Barra模型的基本原理:因子模型的核心假设因子暴露 β i j \beta_{ij} βij的假设因子收益率 f j f_j fj的假设 3. Barra模型的…...
P5:使用pytorch实现运动鞋识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 我的环境 语言环境:python 3.7.12 编译器:pycharm 深度学习环境:tensorflow 2.7.0 数据:本地数据集-运动鞋 一…...
redis持久化原理相关面试题剖析
一、Redis 持久化的机制是什么? Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次 Redis重启时,利用…...
动态规划LeetCode-1049.最后一块石头的重量Ⅱ
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果如下: 如果 x y&…...
Linux Media 子系统 V4l2
一 创建 V4l2 的 entity 在Linux内核的Media Controller框架中,V4L2设备作为实体(entity)的注册过程涉及以下步骤: 1. 初始化Media Controller结构 驱动首先创建一个media_device实例,并与V4L2设备(如v4…...
民兵装备管理系统DW-S300|支持国产化、自主研发
民兵装备器材管理系统(智装备DW-S301)是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 装备接收与登记 民兵装备抵达仓库时&#…...
Pro Git --(Windows)总结
Pro Git --Windows 文章目录 Pro Git --Windows知识来源Git入门与进阶 知识来源 廖雪峰的官方网站 Git教程 Git入门与进阶 # 初步学习Git #个人建议先大致过一遍,对Git有个大致的理解,然后在实操项目# 创建一个空目录 $ mkdir learngit $ cd learngit …...
加油口,电梯门的对称性对 TCP/IP 传输协议的启示
春节期间河南穷游屡次加油站排队加油之启示。 不考虑有意的设计因素,汽车加油口概率性分布在车身的左边或者右边,这个偶然的小细节让加油机同时为两辆车加油而无需额外的加油管。 如果所有车辆加油口都在同一侧,加油站的加油机就只能给一边的…...
【进阶】JVM篇
为什么学习jvm 1、面试的需要 学过java的程序员对jvm应该不陌生,程序员为什么要学习jvm呢?其实不懂jvm也可以照样写出优质的代码,但是不懂jvm会被大厂的面试官虐的体无完肤。 2、高级程序员需要了解 jvm作用 jvm负责把编译后的字节码转换…...
【安全靶场】信息收集靶场
靶场:https://app.hackinghub.io/hubs/prison-hack 信息收集 子域名收集 1.subfinder files.jabprisons.com staging.jabprisons.com cobrowse.jabprisons.com a1.top.jabprisons.com cf1.jabprisons.com va.cobrowse.jabprisons.com vs.jabprisons.com c…...
新数据结构(4)——Java继承
基本概念 继承的本质:重复使用已经定义好的方法和域,实现代码的重复利用。 使用继承之后,创建的子类可以方便地调用父类中已经定义的方法。 一个继承的例子: 重载和重写 重载 重载:发生在同一个类里,指…...
大数据学习之SparkStreaming、PB级百战出行网约车项目一
一.SparkStreaming 163.SparkStreaming概述 Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, fault-tolerant stream processing of live data streams. Spark Streaming 是核心 Spark API 的扩展,支持实时数据…...
介绍两个个电池充电管理芯片(TP4057、ME4069)
第一个是TP4057。 输入电压是4~6.5V TP4056,它们之间最大的区别就是TP4056最高是1A的充电电流,而TP4057是500ma,适用于更小一点的电池。 TP4057停机模式的静态电流也更小(上图列的是待机模式,但查看后面的表格发现实际…...
Debezium日常分享系列之:解码逻辑解码消息内容
Debezium日常分享系列之:解码逻辑解码消息内容 示例配置选项 DecodeLogicalDecodingMessageContent SMT将PostgreSQL逻辑解码消息的二进制内容转换为结构化形式。当Debezium PostgreSQL连接器捕获逻辑解码消息时,它会将消息事件记录发送到Kafka。默认情况…...
【Linux】smp_mb__after_atomic
文章目录 背景知识smp_mb__after_atomic 的作用具体应用场景为什么需要 smp_mb__after_atomic相关宏总结 背景知识 在现代多核处理器和并发编程中,编译器优化和CPU乱序执行可能导致程序指令的实际执行顺序与源代码中的顺序不一致。这种现象可能会破坏多线程或进程间…...
关于conda换镜像源,pip换源
目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源,恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…...
【JavaEE进阶】依赖注入 DI详解
目录 🌴什么是依赖注入 🎄依赖注入的三种方法 🚩属性注⼊(Field Injection) 🚩Setter注入 🚩构造方法注入 🚩三种注⼊的优缺点 🌳Autowired存在的问题 🌲解决Autowired存在的…...
鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践
文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…...
自己部署 DeepSeek 助力 Vue 开发:打造丝滑的折叠面板(Accordion)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 自己…...
程序员升级进阶之路
熟悉业务、项目代码、工作流程,积极吸取技术资料接需求,画流程图,(伪代码),详细设计明确职业发展方向【很重要】求精:写代码前的技术方案设计 写代码并不难,关键是要明确为什么要写…...