1.计算机的体系结构

1.1 基本概念

计算机俗称电脑,本质上就是一种用户高级计算等各个领域并被广泛使用的设备。
计算机的主要组成:硬件和软件

1.2 常见的硬件

计算机中常见的硬件:CPU、内存、硬盘、显卡、减半、显示器、鼠标等
CPU -中央处理器,是计算机中核心的部件,类似于人的大脑-主要用于执行计算机的指令和实现软件中数据的运算
内存 -是计算机的存储部件,用于临时存储CPU即将运算的数据-CPU可以直接访问内存,因此效率比较高-容量小,不会永久存储数据,断电后数据会丢失-时刻使用Ctrl+s进行保存
硬盘 -是计算机的存储部件,用于存储各种类型的文件数据。-容量大,可以实现永远存储,断电后数据不会丢失
键盘 -称为标准输入设备
显示器 -称为标准输出设备

1.3 常见的软件

计算机中常见的软件分为:系统软件 和 应用软件
其中系统软件主要指操作系统,目前主流的操操作系统有:
windows系统/linux系统/unix系统/Android系统/ios系统等
其中应用软件主要指安装在操作系统的软件,如:office、QQ等

1.4 计算机体系结构

使用者->应用软件->操作系统->硬件设备->操作系统分为:外壳(Shell) 和内核(Kernel)

2.Java语言的概念

2.1 Java的语言背景

Java语言诞生于1995年,该语言之符是詹姆斯-高斯林
Java语言在编程语言排行中占据重要的地位

2.2 Java的主要版本

Java SE (Java Platform, Standard Edition)
- 称之为“Java平台标准版”,学习Java 的语法知识。Java EE (Java Platform,Enterprise Edition)
-称之为“Java平台企业版”,可以编写具有B/S架构的企业级项目Java ME(Java Platform,Micro Edition)
-称之为“Java平台微型版”,随着Android系统的普及走向淘汰

3.开发环境的搭建

3.1 jdk的下载和安装

(1)下载方式方式1:从官网下载 www.sun.com / www.oracl.com方式2:搜索下载
(2)安装方式安装版(.exe)、绿色版(.zip)

3.2 相关的概念

jdk - Java开发工具包,只要做Java语言的开发就需要下载和安装
jre - Java运行时环境信息,只要运行Java程序就需要下载和安装
javac.exe - Java编译器,主要用于将高级源代码翻译成字节码文件
java.exe - Java解析器,主要用于启动JVM对字节码文件进行边解释边执行
JVM - Java虚拟机,是Java代码和操作系统之间的桥梁

3.3 Java程序的开发流程

(1)新建文本文档,将xxx.txt修改为xxx.java后缀;
(2)使用记事本的方式打开该文件,编写代码后进行保存;
(3)启动dos窗口切换到xxx.java文件所在的目录中;
(4)使用javac xxx.java对源代码文件进行编译生成字节码文件;
(5)使用java xxx对字节码文件进行解释并执行;

3.4 常用的快捷键

ctrl+s 保存    ctrl+c 复制    ctrl+v  粘贴    ctrl+a 全选
ctrl+f 查找    ctrl+x 剪切    ctrl+z  撤销windows+d 回到桌面   windows+e 打开计算机
windows+r 打开运行输入cmd后回车可以启动dos窗口
windows+l 锁屏
windows+tab 切换任务    alt+tab 切换任务
ctrl+alt+delete 启动任务管理器
ctrl+shift 切换输入法,一旦切换到中文输入法则使用shift键进行中英文切换****

3.5 环境变量的配置

(1)基本概念
通常情况下可执行文件只能在该文件所在的目录中执行,
为了使得给可执行文件能够在任意目录下使用则需要配置换件变量Path
(2)配置的流程
计算机--右键,属性--高级系统设置--高级--环境变量--体统变量--Path变量编辑
将javac.exe所在的路径配置到变量值的最前面,加上英文版分号--最后点击确定
切记Path变量原来的内容不能修改以及配置环境变量后记得重启dos窗口。

3.6 跨平台原理

由于不同的操作系统中都提供了对应的Java虚拟机进行翻译,
因此同一份字节码文件可以被翻译成不同的机器指令去执行,
从而实现跨平台原理,得到"一次编译,到处运行"的美名。

4.变量和注释

4.1 基本概念

   当需要在程序中记录单个数据内容时则应该使用变量加以描述,变量本质上就是内存空间中的一块存储单元,由于该存储单元的数据内容可以改变,因此得名为"变量"。由于存放的数据内容不同导致所需存储单元的大小不同,在Java语言中使用数据类型加以描述,为了便于下次访问该数据则需要给该存储空间指定一个名称,称为"变量名".

4.2 声明方式

   数据类型 变量名 = 初始值;   - 其中=初始值可以省略,但;不可以省略
如:int age = 18;  - 声明一个int类型的变量名字为age,初始值为18int age;

4.3 标识符(变量名)的命名规则

  (1)必须由字母、数字、下划线以及美元$等组成,其中数字不能开头; 如:name、age、name2、nianling等(2)要求不能与Java语言的关键字同名,所谓关键字就是Java语言用于表示特殊含义的标识符如:public、class、void、static等(3)区分大小写,长度没有限制但不宜过长。如:day和Day代表不同的标识符,不推荐使用  (4)尽量做到见名知意,支持中文但不推荐使用。如:year、month、day、hour、size、length、time等

4.4 常用的注释

   // - 单行注释,从//开始一直到本行末尾的所有内容都是注释/* */ - 多行注释,从/*开始一直到*/中间的所有内容都是注释,不允许嵌套。

5.数据类型

5.1 基本分类

   Java语言中的数据类型主要分为两大类:(1)基本数据类型byte、short、int、long、float、double、boolean、char1     2      4     8    4       8        1      2(2)引用数据类型(了解)数组、类、接口、枚举以及标注

5.2 常用的进制

   在计算机的底层使用二进制形式,逢二进一,二进制的权重:2^0、2^1、2^2、...在日常生活中使用十进制形式,逢十进一,十进制的权重:10^0、10^1、10^2、...为了简化二进制的表示形式,通常会采用八进制和十六进制加以描述在计算机中采用二进制的最高位(最左边)代表符号位,若该位是0则表示非负数,若该位是1则表示负数。
如: 100    10      110^2   10^1   10^0  百     十     个1       1      1

5.3 进制之间的转换

(1)正十进制转换为二进制的方式a.除2取余法,让十进制整数不断地除以2取出余数直到商为0时,将所有余数逆序排列即可b.拆分法,将十进制整数拆分为若干个二进制权重的和,若有该权重则下面写1否则写0如:45 => 32 + 8 + 4 + 155 =>32 +16 +4 +2 +1128  64  32  16     8  4  2  10    0    1     0      1  1  0  10    0    1     1      0  1  1  1
(2)正二进制转换为十进制的方式a.加权法,让二进制的每个数字乘以当前位的权重然后累加起来如:0010 1101 => 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0=> 0 + 0 + 32 + 0 + 8 + 4 + 0 + 1=> 450101 0101  => 64 +16 +4+1 =  85
(3)负十进制转换为二进制的方式a.将十进制的绝对值转换为二进制后按位取反再加1.如:-45 => 绝对值转为二进制:0010 1101=> 按位取反:        1101 0010=> 再加1:           1101 0011验证:-45 + 45 = 0;-45: 1101 001145: 0010 1101 +---------------------1 0000 0000(高位1 溢出 => 0)(4)负二进制转换为十进制a.先减1再按位取反后采用加权法转换为十进制整数,最后添加负号。如:1101 0011 => 先减1:           1101 0010 => 按位取反:        0010 1101=> 转换为十进制整数:45=> 添加负号:        -45练习:将整数50和88转换为二进制:将整数-50和-88转换为二进制:将二进制0011 1110 和 0110 0111转换为十进制整数(正):将二进制1011 1101 和 1101 0011转换为十进制整数(负):
解析:     128   64   32   16   8   4    2   150 => 32 + 16 +  2            0    0    1    1   0   0    1   0   => 0011 001088 => 64 + 16 + 8             0    1    0    1   1   0    0   0   => 0101 1000-50 => 绝对值转换为二进制:0011 0010=> 按位取反:          1100 1101=> 再加1:             1100 1110-88 => 绝对值转换为二进制:0101 1000            1010 0111=> 按位取反:          1010 0111                    1 +=> 再加1:             1010 1000          ------------------  1010 10000011 1110 => 加权法:0*2^7 + 0*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0=> 0 + 0 + 32 + 16 + 8 + 4 + 2=> 620110 0111 => 1031011 1101 => 先减1:            1011 1100=> 按位取反:        0100 0011=> 转换为十进制整数:67    => 添加负号:        -671101 0011 => -45

5.4 单个字节表示的整数范围

  在计算机中单个字节代表8位二进制,最高位(最左边)代表符号位,因此表示整数范围如下:非负数的范围:0000 0000 ~ 0111 1111 => 0 ~ 127 => 0 ~ 2^7-10111 1111 => 0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0=> 0 + 64 + 32 + 16 + 8 + 4 + 2 + 1=> 127负数的范围:1000 0000 ~ 1111 1111 => -128 ~ -1 => -2^7 ~ -2^01000 0000 => 先减1:     0111 1111=> 按位取反:  1000 0000=> 转换为整数:128=> 添加负号:  -1281111 1111 => 先减1:     1111 1110=> 按位取反:  0000 0001=> 转换为整数:1=> 添加负号:  -1
综上所述:单个字节所能表示的整数范围是:-128 ~ 127,也就是-2^7 ~ 2^7-1.

5.5 整数类型

   在Java语言中用于描述整数数据的类型有:byte、short、int、long,推荐int类型其中byte类型在内存空间中占1个字节,表示的整数范围是:-2^7 ~ 2^7-1. -128 ~ 127.其中short类型在内存空间中占2个字节,表示的整数范围是:-2^15 ~ 2^15-1.-32768 ~ 32767.其中int类型在内存空间中占4个字节,表示的整数范围是:-2^31 ~ 2^31-1.正负二十一亿之间其中long类型在内存空间中占8个字节,表示的整数范围是:-2^63 ~ 2^63-1.比int类型还大的数.在Java程序中直接写出的整数数据叫做直接量/字面值/常量,如:66,该数据默认为int类型,若希望表达比int类型还大的直接量,则需要在直接量的后面加上L或l,推荐使用L。扩展:若希望描述比long类型最大范围还大的整数数据,则需要借助java.math.BigInteger类型加以描述。

5.6 浮点类型

   在Java语言中用于描述小数数据的类型有:float、double,推荐使用double类型。其中float类型在内存空间中占4个字节,叫做单精度浮点数,通常可以取到小数点后7位;其中double类型在内存空间中占8个字节,叫做双精度浮点数,通常可以取到小数点后15位在Java程序中直接写出的小数数据叫做直接量,如:3.14,该数据默认为double类型,若希望表达float类型的直接量,则需要在直接量的后面加上f或者F。扩展:由于double类型的数据在运算时会有误差,若希望实现精确运算则需要借助java.math.BigDecimal类型加以描述。

5.7 布尔类型

   在Java语言中用于描述真假信息的类型有:boolean,数值只有:true(真) false(假)其中boolean类型在内存空间中的大小没有明确的规定,通常认为是1个字节。

6.数据类型

6.1 字符类型

   在Java语言中用于描述单个字符信息的数据类型是char,如:'a','1',‘中’等其中char类型在内存空间中占2个字节,该类型在以后的开发中很少使用,通常都是描述多个字符组成并且使用双引号引起的字符串,如:"hello",使用String类型加以描述。在计算机的底层识别0和1组成的二进制序列,而现实生活中存在像'a'这样的图案无法在计算机中直接存储,为了能够存储这样的数据就需要给这些数据指定编号来存储,这样的编号就叫做ASCII。要求大家记住的ASCII有:'A' - 65    'a' - 97    '0' - 48   空格 - 32  换行符 - 10要求大家记住的转义字符有:\" - "   \' - '  \\ - \  \t - 制表符(tab)  \n - 换行符

6.2 类型转换

   Java语言中数据类型的转换主要分为两种:自动类型转换  和 强制类型转换其中自动类型转换主要指从小类型到大类型之间的转换。其中强制类型转换主要指从大类型到小类型之间的转换,语法格式:目标类型  变量名 = (目标类型)源类型变量名;强制类型转换可能会有损失,因此以后的开发尽量不要使用;

7.运算符

7.1 算术运算符

   + 表示加法运算符       -  表示减法运算符* 表示乘法运算符       /  表示除法运算符% 表示取余运算符注意事项:(1)当两个整数相除时,结果只取整数部分丢弃小数部分;(2)若希望保留小数部分,则处理方式如下:a.将其中一个操作数强制转换为double类型即可;b.将其中一个操作乘以1.0后再运算即可;(3)0不能做除数,0.0可以做除数的结果是无穷大,因此不推荐使用;(4)+既可以作为字符串连接符又可以作为加法运算符,区分方式如下:若+两边操作数中只要有一个是字符串类型,则按照字符串连接符处理,否则加法运算符

7.2 关系运算符

   > 表示是否大于运算符     >= 表示是否大于等于运算符< 表示是否小于运算符     <= 表示是否小于等于运算符== 表示是否等于运算符    != 表示是否不等于运算符所有以关系运算符作为最终运算的表达式结果一定是boolean类型,true 和 false。

7.3 自增减运算符

   + 表示加法运算符   ++ 表示自增运算符,用于实现当前变量自身的数值加1的功能。- 表示减法运算符   -- 表示自减运算符,用于实现当前变量自身的数值减1的功能。注意:a.对于变量自身的数值来说,无论是ia++还是++ia从结果上来说是一样的;b.ia++代表后++,表示先让ia自身的数值作为表达式的结果,然后ia自身的数值加1;++ia代表前++,表示先让ia自身的数值加1,然后作为表达式的结果;

7.4 逻辑运算符

   && 表示逻辑与运算符,相当于"并且",同真为真,一假为假。|| 表示逻辑或运算符,相当于"或者",一真为真,同假为假。!  表示逻辑非运算符,相当于"取反",真为假,假为真。短路特性:对于逻辑与来说,若第一个表达式为假则整个表达式一定为假,跳过第二个表达式不执行;对于逻辑或来说,若第一个表达式为真则整个表达式一定为真,跳过第二个表达式不执行;

7.5 条件/三目运算符

   条件表达式? 语句块1: 语句块2=> 判断条件表达式是否成立,若成立则执行语句块1,否则执行语句块2

7.6 赋值运算符
(1)简单赋值
= - 表示将=右边的数据赋值给=左边的变量,来覆盖变量原来的数值。
如:
ia = 3; - 使用3赋值给变量ia,覆盖ia原来的数值

(2)复合赋值+=  -=   *=  /= ...
如:byte ia = 3;   ia = ia + 2;  - 推荐,提高代码的可读性=> ia += 2;

7.7 移位运算符

   <<  左移运算符,用于按照二进制位向左移动,右边使用0补充;>>  右移运算符,用于按照二进制位向右移动,左边使用符号位补充;>>> 无符号右移运算符,用于按照二进制位向右移动,左边使用0补充;

7.8 位运算符

   & 按位与运算符,按照二进制位进行与运算,同1为1,一0为0(1-真 0-假).| 按位或运算符,按照二进制位进行或运算,一1为1,同0为0.^ 按位异或运算符,按照二进制位进行异或运算,相同为0,不同为1. ~ 按位取反运算符,按照二进制位进行取反运算,1为0,0为1.

7.9 运算符的优先级

   a.()的优先级极高,通常都是最先计算;b.=的优先级极低,通常都是最后计算;c.* / %的优先级高于+ -,平级的哪个在前先算哪个;

8.分支结构

8.1 基本概念

   在某些特殊场合中需要进行条件的判断并进行选择执行时,使用分支结构。

8.2 if分支结构

(1)语法格式if(条件表达式){语句块;}(2)执行流程判断条件表达式是否成立=> 若成立,则执行语句块;=> 若不成立,则跳过语句块不执行;

9.分支结构

9.1 基本概念

   在某些特殊场合中需要进行条件的判断并进行选择执行时,使用分支结构。

9.2 if分支结构

(1)语法格式if(条件表达式){语句块;}(2)执行流程判断条件表达式是否成立=> 若成立,则执行语句块;=> 若不成立,则跳过语句块不执行;

9.3 if-else分支结构

(1)语法格式if(条件表达式){语句块1;}else{语句块2;}(2)执行流程判断条件表达式是否成立=> 若成立,则执行语句块1=> 若不成立,则执行语句块2

9.4 if-else if-else分支结构

(1)语法格式if(条件表达式1){语句块1;}else if(条件表达式2){语句块2;}...else{语句块n;}(2)执行流程判断条件表达式1是否成立=> 若成立,则执行语句块1=> 若不成立,则判断条件表达式2是否成立=> 若成立,则执行语句块2=> 若不成立,则执行语句块n

10.循环结构

10.1 for循环

(1)语法格式for(初始化表达式; 条件表达式; 修改初始值表达式){循环体;}(2)执行流程执行初始化表达式 => 判断条件表达式是否成立=> 若成立,则执行循环体 => 执行修改初始值表达式 => 判断条件表达式是否成立=> 若不成立,则循环结束

10.2 双重for循环

(1)语法格式for(初始化表达式1; 条件表达式2; 修改初始值表达式3){for(初始化表达式4; 条件表达式5; 修改初始值表达式6){内层循环体;}}(2)执行流程执行表达式1 => 判断表达式2是否成立=> 若成立,执行表达式4 => 判断表达式5是否成立=> 若成立,则执行内层循环体 => 执行表达式6 => 判断表达式5是否成立=> 若不成立,则内层循环结束 => 执行表达式3 => 判断表达式2是否成立=> 若不成立,则外层循环结束(3)注意事项a.外层循环变量改一下,则内层变量执行一圈;b.需要打印多行多列时就使用双重for循环,外层循环控制行数,内层循环控制当前行列数

10.3 while循环

(1)语法格式while(条件表达式){循环体;}(2)执行流程判断条件表达式是否成立=> 若成立,则执行循环体 => 判断条件表达式是否成立=> 若不成立,则循环结束(3)注意事项a.while循环和for循环可以完全互换;b.while循环主要用于明确循环条件但不明确循环次数的场合中;for循环主要用于明确循环次数/范围但不明确循环条件的场合中;c.while(true)与for(;;)都表示无限循环;

10.4 do-while循环

(1)语法格式do{循环体;}while(条件表达式);(2)执行流程执行循环体 => 判断条件表达式是否成立=> 若成立,则执行循环体 => 判断条件表达式是否成立=> 若不成立,则循环结束(3)注意事项do-while循环主要用于至少执行一次循环体的场合中

11.一维数组

11.1 基本概念

   当需要在程序中记录单个数据内容时,则声明一个变量即可;当需要在程序中记录多个类型相同的数据内容时,则声明一个一维数组即可,一维数组的本质就是在内存中申请一段连续的存储单元分别存储数据内容。

11.2 声明方式

(1)语法格式数据类型[] 数组名称 = new 数据类型[数组长度];
如:int[] arr = new int[5];  - 声明一个长度为5元素类型为int类型的一维数组 int num = 5;             - 声明一个初始值为5元素类型为int类型的变量int arr[] = new int[5];  - 不推荐使用注意:只有在声明数组时[]中的数字才代表长度,否则一律代表下标;(2)元素的初始化数据类型[] 数组名称 = {初始值1, 初始值2, ...};
如:int[] arr = {1, 2, 3, 4, 5}; - 声明初始值为1、2、3、4、5的一维数组

12.二维数组

12.1 基本概念

   一维数组本质上就是一段连续的存储单元,用于存放多个类型相同的数据内容。二维数组本质上就是由若干个一维数组组成的数组,该数组中的每个元素都是一维数组,而一维数组中的每个元素才是数据内容。

12.2 声明方式

(1)语法格式数据类型[][] 数组名称 = new 数据类型[行数][列数];
如:int[][] arr = new int[2][3];  - 声明一个具有2行3列的二维数组其中行下标:0 ~ 1;其中列下标:0 ~ 2;  (2)初始化方式数据类型[][] 数组名称 = {{元素值1, 元素值2, ...}, {元素值3, 元素值4, ...}, ...};
如:int[][] arr = {{1, 2, 3}, {4, 5, 6}}; - 声明一个具有2行3列的二维数组

初识Java SE基础相关推荐

  1. java实现linkstring,【JAVA SE基础篇】32.String类入门

    [JAVA SE基础篇]32.String类入门 1.字符串 1.String类又称作不可变字符序列 2.String位于java.lang包中,java程序默认导入java.lang包下所有的类 3 ...

  2. 面试必会系列 - 1.1 Java SE 基础

    本文已收录至 github,完整图文:https://github.com/HanquanHq/MD-Notes Java SE 基础 面向对象 Java 按值调用还是引用调用? 按值调用指方法接收调 ...

  3. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...

    本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...

  4. Java复习总结(二)Java SE基础知识

    Java SE面试题 目录 Java SE基础 基本语法 数据类型 关键字 面向对象 集合 集合类概述 Collection接口 进阶 线程 锁 JDK 反射 JVM GC io操作和NIO,AIO ...

  5. Java SE基础(十六)集合

    Java SE基础(十六)集合 集合 集合体系 数据结构简述 栈 队列 数组 链表 Collection集合 List集合 ArrayList集合 LinkedList集合 Set集合 HashSet ...

  6. Java SE 基础知识

    Java SE 基础知识 1 2 @(Notes)[J2SE, Notes] VICTORY LOVES PREPARATION. 特别说明: 该文档在马克飞象查阅最佳: 本部分知识还在迭代中,欢迎补 ...

  7. Java SE基础(更新中)

    Java的运行机制 Java SE基础(更新中) 基本语法 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的. 类名:对于所有的类来说,类名的首字母应该大写 ...

  8. Java SE 基础(十)Java中的异常

    Java SE 基础(十)Java中的异常 什么是异常 异常的处理 异常类 throw和throws 自定义异常 什么是异常 Java 中处理错误的一种机制,Java 中的错误大致分为两类,一类是编译 ...

  9. Java SE基础(十四)常用API

    Java SE基础(十四)常用API 概述 Object类 构造方法 成员方法 toString()方法 equals(Object obj)方法 Arrays排序 Arrays类概述 Arrays成 ...

最新文章

  1. 大公司病(太现实了!)
  2. 第八课.EM算法的合理性与算法推导
  3. NV21数据 镜像 旋转
  4. 与WebXR共同创建者Diego Marcos一起探讨沉浸式Web的未来(下)
  5. CSS基础(part13)--浮动
  6. python图形化编程实例,python交互式图形编程实例(三)
  7. C# EPPlus导出EXCEL,并生成Chart表
  8. 这是云代驾,不是打游戏
  9. 百度地图API画多边型,测面积
  10. 1996: [Hnoi2010]chorus 合唱队
  11. 语音芯片IC几种输出方式
  12. 聚客通微信scrm系统-微信个人号sdk云控方案实现非微信ipad/mac协议
  13. Modbus通信协议格式以及功能码
  14. hotmail手机端_hotmail邮箱登陆手机版 参见http://help.
  15. 微信大数据推荐算法比赛
  16. Scratch少儿编程案例-植物大战僵尸-趣味角色版
  17. 苹果手机扫描文件并转换格式,怎么把扫描文件转换成文字,扫描出来的文件格式换个可以复制的文字
  18. C#多线程顺序依赖执行控制
  19. Steamsets安装教程
  20. 渗透测试工程师(NISP-PT)与网络安全运维工程师(NSP-SO)

热门文章

  1. 大战2013之二:破解浴火银河2硬盘版
  2. CentOS修改hostname的三种方法示例
  3. 华为5G折叠屏幕适配
  4. win10下的RNA测序(一)
  5. Java数据结构入门以及数据结构和算法的关系
  6. python 合并ts 合并二进制文件
  7. python如何实现飞机上下移动_python实现飞机大战
  8. Android单元测试系列(5)-Robolectric
  9. JAVA计算机毕业设计邢台市公寓式月亮酒店管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  10. 五一出行欢乐多。。。。