JavaSE基础(1)

news2025/1/21 6:36:51

1 初识Java

知识导图

在这里插入图片描述

1.1 Java简介及发展史

1.1.1 Java是什么

Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。
不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。

1.1.2 Java语言发展简史

Java 语言源于 1991 年 4 月,Sun 公司 James Gosling博士 领导的绿色计划(Green Project) 开始启动,此计划最初的目标是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个就是Java的前身: Oak (得名与Java创始人James Gosling办公室外的一棵橡树),但由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1995年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布,并提出“Write once, Run anywhere" 的口号。
在这里插入图片描述

1.1.3 Java语言特性

  1. 简单性
    Java语法是C++语法的一个“纯净版本”,相当于对C++做了一个减法。
  2. 面向对象
    什么是面向对象?
    在Java的世界里,一切皆对象。比如:人、狗、手机、电脑等都是对象。所谓面相对象,就是依靠对象之间的交互来完成事情,比如:人用手机网上购物,狗吃骨头…
    Java的面向对象特性与C++旗鼓相当,与C++的主要不同点在于多重继承。在Java中,取而代之的是更简单的接口概念。而且与C++相比,Java提供了更丰富的运行时自省功能。
  3. 体系结构中立
    编译器生成一个体系结构中立的目标文件格式,按照该中规范生成的文件,只要有Java运行时系统,这些编译后的代码就可以在许多处理器上运行。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易的在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。
  4. 可移植性
    与C/C++不同,Java规范中没有“依赖具体实现的地方”。基本数据类型的大小以及有关运算都做了明确的说明。例如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头疼的主要问题。

1.1.4 Java开发环境安装

  • 可能是Windows下最简单的Java环境安装指南
  • Linux下JDK的安装(多种方式)
  • Mac下JDK的安装
  • Java 软件 https://pan.baidu.com/s/1X7zPb-YT11xR_UDqjN-oJw 提取码:r471

1.2 初识Java的main方法

1.2.1 main方法示例

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

如上展示的就是最简单的一个Java程序,可能同学们看到后一头雾水,可以说,Java的main方法应该是当前主流编程语言中最“长”的。
通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成:

1.源文件(扩展名为*.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个 类。类的内容必须包含在花括号里面。

2.类:类中带有一个或多个方法。方法必须在类的内部声明。

3.方法:在方法的花括号中编写方法应该执行的语句。

总结一下:类存在于源文件里面;方法存在于类中;语句存在于方法中。

注意:在一个源文件中只能有一个public修饰的类,而且源文件名字必须与public修饰的类名字相同。
好了,代码编写完了,如何让它“运行”起来呢?

1.2.2 运行Java程序

Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。
在这里插入图片描述
注意:在运行Java程序前,必须先安装好JDK(Java Development Kit即Java开发工具包),JDK里面就包含了javac和java工具,Java程序最终是在JVM(Java虚拟机)中运行的。

【面试题】JDK、JRE、JVM之间的关系?
JDK(Java DevelopmentKit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译
器javac与自带的调试工具Jconsole、jstack等。
JRE(Java Runtime Environment):Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程 序运行的所需环境。
JVM:Java虚拟机,运行Java代码
在这里插入图片描述

编写和运行第一个Java程序时,可能会遇到的一些错误:

  • 源文件名后缀不是.java
  • 类名与文件名不一致
  • main方法名字写错:mian
  • 类没有使用public修饰
  • 方法中语句没有以分号结尾
  • 中文格式的分号
  • JDK环境没有配置好,操作系统不能识别javac或者java命令

1.3 注释

注释是为了让代码更容易被读懂而附加的描述信息. 不参与编译运行, 但是却非常重要时刻牢记! 代码写出来是为了给人看的, 更是为了给三个月后的你自己看的.

1.3.1 基本规则

  • Java中的注释主要分为以下三种 单行注释:// 注释内容(用的最多)
  • 多行注释:/* 注释内容*/(不推荐)
  • 文档注释: /**文档注释 */(常见于方法和类之上描述方法和类的作用),可以被javadoc工具解析,生成一套以网页文件形式体现的程序说明文档

注意:

  1. 多行注释不能嵌套使用
  2. 不论是单行还是多行注释,都不参与编译,即编译之后生成的.class文件中不包含注释信息。

1.3.2 注释规范

  1. 内容准确: 注释内容要和代码一致, 匹配, 并在代码修改时及时更新.
  2. 篇幅合理: 注释既不应该太精简, 也不应该长篇大论.
  3. 使用中文: 一般中国公司都要求使用中文写注释, 外企另当别论.
  4. 积极向上: 注释中不要包含负能量(例如 领导 SB 等).

1.4 标识符

在上述程序中,Test称为类名,main称为方法名,也可以将其称为标识符,即:在程序中由用户给类名、方法名或者变量所取的名字。
【硬性规则】
标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。
注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写。
【软性建议】

  • 类名:每个单词的首字母大写(大驼峰)
  • 方法名:首字母小写,后面每个单词的首字母大写(小驼峰)
  • 变量名:与方法名规则相同
    一个大型的工程,是由多名工程师协同开发的,如果每个人都按照自己的方式随意取名,比如:person、PERSON、Person、_person,将会使程序非常混乱。如果大家在取名时能够遵守一定的约束(规范),那多人写除的代码仿佛一个人写的。

1.5 关键字

通过观察上述程序可以发现,public、class以及static等颜色会发生变化,将这些具有特殊含义的标识符称为关键字。即:关键字是由Java语言提前定义好的,有特殊含义的标识符,或者保留字。
注意:用户不能使用关键字定义标识符。
在Java中关键字有很多,这里给大家列出来一部分,先了解下后序在逐一详细解释。
在这里插入图片描述

2 数据类型和运算符

思维导图

在这里插入图片描述

2.1 数据类型

在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
基本数据类型有四类八种:
1. 四类:整型、浮点型、字符型以及布尔型
2. 八种:

在这里插入图片描述

2.2 类型转换

2.2.1 自动类型转换(隐式)

自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。

	System.Out.println(1024); // 整型默认情况下是int
	System.Out.println(3.14); // 浮点型默认情况下是double
	
	int a = 100;
	long b = 10L;
	
	b = a; // a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值
	a = b; // 编译报错,long的范围比int范围大,会有数据丢失,不安全
	
	float f = 3.14F;
	double d = 5.12;
	
	d = f; // 编译器会将f转换为double,然后进行赋值
	f = d; // double表示数据范围大,直接将float交给double会有数据丢失,不安全
	
	byte b1 = 100; // 编译通过,100没有超过byte的范围,编译器隐式将100转换为byte
	byte b2 = 257; // 编译失败,257超过了byte的数据范围,有数据丢失

2.2.2 强制类型转换(显式)

强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。

	int a = 10;
	long b = 100L;
	b = a; // int-->long,数据范围由小到大,隐式转换
	a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败
	
	float f = 3.14F;
	double d = 5.12;
	d = f; // float-->double,数据范围由小到大,隐式转换
	f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
	
	a = d; // 报错,类型不兼容
	a = (int)d; // double没有int表示的数据范围大,需要强转,小数点之后全部丢弃
	
	byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
	byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错
	
	boolean flag = true;
	a = flag; // 编译失败:类型不兼容
	flag = a; // 编译失败:类型不兼容

2.3 类型提升

不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
1. int与long之间:int会被提升为long

int a = 10;
long b = 20;
int c = a + b; // 编译出错: a + b==》int + long--> long + long 赋值给int时会丢失数据
long d = a + b; // 编译成功:a + b==>int + long--->long + long 赋值给long

2. byte与byte的运算

byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte c = a + b;
^

结论: byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.

由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于 4 个字节的类型, 会先提升成 int, 再参与计算.
正确的写法:

byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);

【类型提升小结:】

  1. 不同类型的数据混合运算, 范围小的会提升成范围大的.
  2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.

2.4 字符串类型

在Java中使用String类定义字符串类型,比如:

public static void main(String[] args) {
	String s1 = "hello";
	String s2 = " world";
	System.out.println(s1);
	System.out.println(s2);
	System.out.println(s1+s2); // s1+s2表示:将s1和s2进行拼接
}

在有些情况下,需要将字符串和整形数字之间进行转换:
1. int 转成 String

int num = 10;
// 方法1
String str1 = num + ""; 
// 方法2
String str2 = String.valueOf(num);

2. String 转成 int

String str = "100";
int num = Integer.parseInt(str);

本节对只是对字符串进行简单的介绍,大家能够正常使用即可,后序会详细给大家介绍。

2.5 运算符

2.5.1 算数运算符

  1. 基本四则运算符:加减乘除模(+ - * / %)
        System.out.println( 3 / 1.0 );  // 3.0
        System.out.println( 3.0 / 1 );  // 3.0
        System.out.println( 3.0 / 1.0 );  // 3.0
        System.out.println( 3 / 1 );  // 3
  1. 增量运算符 += -= *= %=
int a = 1;
a += 2; // 相当于 a = a + 2
System.out.println(a); // 输出3
a -= 1; // 相当于 a = a - 1
System.out.println(a); // 输出2
a *= 3; // 相当于 a = a * 3
System.out.println(a); // 输出6
a /= 3; // 相当于 a = a / 3
System.out.println(a); // 输出2
a %= 3; // 相当于 a = a % 2
System.out.println(a); // 输出2
  1. 自增/自减运算符 ++ –
    ++是给变量的值+1,–是给变量的值-1。
int a = 1;
a++; // 后置++ 表示给a的值加1,此时a的值为2
System.out.println(a++); // 注意:后置++是先使用变量原来值,表示式结束时给变量+1,因此输出2
System.out.println(a); // 输出3
++a; // 前置++ 表示给a的值加1
System.out.println(++a); // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出5
System.out.println(a); // 输出5
// --操作符给操作-1,与++含义类似

注意:

  • 如果单独使用,【前置++】和【后置++】没有任何区别
  • 如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
  • 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

2.5.2 逻辑运算符(重点)

逻辑运算符主要有三个: && || ! ,运算结果都是 boolean类型。
1. 逻辑与 &&
在这里插入图片描述

2. 逻辑 ||
在这里插入图片描述

3. 逻辑非 !
在这里插入图片描述

4. 短路求值(重点)
&& 和 || 遵守短路求值的规则.

System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true

我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.
注意:

  • 对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
  • 对于 ||, 如果左侧表达式值为true, 则表达式结果一定是 true, 无需计算右侧表达式.
  • & 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.
System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常

2.5.3 位运算符

Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。

位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。

位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.

  1. 按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.
  2. 按位或 |: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.

注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean
的时候, 表示逻辑运算.

  1. 按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0
  2. 按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0

2.5.4 移位运算符(>>>)

移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。

  1. 左移 <<: 最左侧位不要了, 最右侧补 0
  2. 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1
  3. 无符号右移 >>>: 最右侧位不要了, 最左侧补 0.

注意:

  1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
  2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
  3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
  4. 移动负数位或者移位位数过大都没有意义.

2.5.5 条件运算符(重点)

条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3

当 表达式 1 的值为 true 时, 整个表达式的值为 表达式 2 的值;
当 表达式 1 的值为 false 时, 整个表达式的值为 表达式 3 的值.

也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
注意:

  1. 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;
  1. 表达式不能单独存在,其产生的结果必须要被使用
int a = 10;
int b = 20;
a > b? a : b; // 报错:Error:(15, 14) java: 不是语句

2.5.6 优先级

在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 +和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。

// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);

上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果为10。
注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.

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

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

相关文章

系统学习Linux-PXE无人值守装机(附改密)

目录 pxe实现系统自动安装pxe工作原理 大致的工作过程如下&#xff1a; PXE的组件&#xff1a; 一、配置vsftpd 二、配置tftp 三、准备pxelinx.0文件、引导文件、内核文件 四、配置dhcp 配置ip 配置dhcp 五、创建default文件 六、新建测试主机用来测试装机效果 七、…

github指南

记录一些Github上的宝贵功能 1、github trending/star 1.1查看github的热门趋势 可以选择点击上面热门趋势的链接&#xff0c;从主页点进去的方式如下 在这个页面中&#xff0c;你可以选择language/data range等来搜索到你想要的 1.2 查看github的star排行 比如&#xff1a…

出货量腰斩,不用中国芯片,美国PC巨头要凉了,苹果成为大赢家

市调机构Canalys公布的二季度数据显示美国PC巨头戴尔在中国市场的出货量同比暴跌52%&#xff0c;显示出它在公开宣布舍弃中国芯片之后&#xff0c;中国消费者正纷纷抛弃它&#xff0c;毕竟如今的PC品牌如此之多&#xff0c;完全有更多的替代选择。 Canalys公布的数据显示&#…

Python Opencv实践 - 拉普拉斯(Laplacian)算子边缘检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_GRAYSCALE) print(img.shape)#拉普拉斯边缘检测 #cv.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType) #src:原图 …

正中优配:沪指震荡涨0.23%,保险、酿酒等板块走强,半导体板块下挫

1日早盘&#xff0c;沪指、深成指盘中强势震动上扬&#xff0c;创业板指回落翻绿&#xff0c;科创50指数跌超1%&#xff1b;两市半日成交缺乏5000亿元。 到午间收盘&#xff0c;沪指涨0.23%报3127.19点&#xff0c;深成指涨0.25%&#xff0c;创业板指跌0.23%&#xff0c;科创5…

Ubuntu22.04安装Mongodb7.0

Ubuntu安装Mongodb 1.平台支持2.安装MongoDB社区版2.1导入包管理系统使用的公钥2.2为MongoDB创建列表文件2.3重新加载本地包数据库2.4安装MongoDB包1.安装最新版MongoDB2.安装指定版MongoDB 3.运行MongoDB社区版1.目录2.配置文件3.初始化系统4.启动MongoDB5.验证MongoDB是否成功…

列表、字典的删除操作

1.列表的删除操作&#xff0c;可以使用del 列表[索引]、列表.pop(索引)、列表.remove(元素)、列表.clear() del(如果不指定列表索引&#xff0c;就是删除整个列表&#xff0c;再使用就会出现 name XX is not defined) a [10, 20, 30, 40] print(f"删除前为:{a}") de…

简易虚拟培训系统-UI控件的应用5

目录 Toggle控件简介 示例-使用Toggle组实现主轴速度选择 本篇介绍UI控件Toggle&#xff0c;尝试一个小示例-使用单选框实现速度的选择控制。 Toggle控件简介 1. Toggle的结构如下&#xff1a;最重要的Toggle组件挂在Toggle节点上&#xff0c;下面的Image组件用于显示单选框…

大数据Flink(七十一):SQL的时间属性

文章目录 SQL的时间属性 一、Flink三种时间属性简介

【jsthree.js】全景vr看房进阶版

three小结&#xff1a; Scene场景 指包含了所有要渲染和呈现的三维对象、光源、相机以及其他相关元素的环境&#xff1b;场景可以被渲染引擎或图形库加载和处理&#xff0c;以生成最终的图像或动画 常见属性&#xff1a; scene.background new THREE.Color(0x000000); // …

【01背包理论】01背包问题dp[j](滚动数组) <动态规划板子>

【01背包理论】01背包问题dp[j] 有 n 件物品和一个最多能背重量为 w 的背包。 第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是 value[i] 。 每件物品只有一个&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 题解 动态规划 确定 dp 数组以及下标的含义 滚…

wxpython: 数字时钟秒表

wxpython 数字时钟秒表&#xff1b;定时器和线程>示例 编写 wx_clock.py 如下 # -*- coding: utf-8 -*- """ 定时器和线程>示例""" import wx import time import threadingclass MyFrame(wx.Frame): def __init__(self):""…

【Java核心知识】线程基础知识

文章目录 线程线程与进程的区别创建线程的方法方法一&#xff1a;继承Thread类方法二&#xff1a;实现Runnable接口方法三&#xff1a;使用Callable和FutureTask创建带返回值的线程方法四&#xff1a;通过线程池创建线程 线程的基本操作线程的状态守护线程 线程 线程与进程的区…

基于Java的学生宿舍管理系统,springboot+jsp,MySQL数据库,前后端分离,学生+宿舍管理员+系统管理员三种身份,完美运行,有一万字论文。

基于Java的学生宿舍管理系统&#xff0c;springbootjsp&#xff0c;MySQL数据库&#xff0c;前后端分离&#xff0c;学生宿舍管理员系统管理员三种身份&#xff0c;完美运行&#xff0c;有一万字论文。 学生&#xff1a;个人信息管理、保修、假期&#xff08;入校、离校&#x…

【网络】路由配置实践

网络实践-路由篇 本文使用vmware虚拟机进行路由表配置实践&#xff0c;通过配置路由表连接两个不同的网络 网络规划&#xff1a; 准备三台centos7虚拟机&#xff0c;其中一台作为路由设备router&#xff0c;其余两台分别代表处在不通网络中的pc1和pc2。因此router虚拟机需要分…

IntelliJ IDEA的远程开发(Remote Development)

DEA的远程开发功能&#xff0c;可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行&#xff0c;而本地仅运行客户端软件进行常规的开发操作即可&#xff0c;官方给出的逻辑图如下&#xff0c;可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…

iOS设备管理软件iMazing2024

文件系统是一种用于在存储设备上组织文件和文件夹的系统。所有的存储设备&#xff08;如计算机、USB存储器、手机等&#xff09;都有着自己的文件系统。 iMazing文件系统功能将iOS设备中封闭而复杂的文件管理系统整合在一起&#xff0c;让您管理文件像在电脑中使用Windows文件…

肖sir __linux__面试题和考核05

面试题 1、查看linux中第11行到第20行的数据&#xff08;比如文档a 有30行&#xff09; 方法1&#xff1a;tail -n 11 mm |head -n10 n 表示从第10行开始&#xff0c;取前10行 方法2&#xff1a;head -n -10 mm| tail -n 10 表示从末尾第10行开始&#xff0c;最后10行 方法3&am…

ThreadLocal原理剖析

一.ThreadLocal的含义 ThreadLocal也就是线程本地变量&#xff0c;创建了一个ThreadLocal变量&#xff0c;访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际上是操作自己本地内存里面的变量&#xff0c;从而起到线…

基于单片机的简易智能电动车设计

一、项目介绍 智能交通工具在现代社会中起着越来越重要的作用&#xff0c;电动车作为一种环保、便捷的交通工具&#xff0c;受到了广泛的关注和应用。本设计基于单片机技术&#xff0c;设计一款简易智能电动车&#xff0c;实现基本的控制和功能&#xff0c;并提供良好的用户体…