# 大数据工程(一)
## Java基础
程序设计语言
Java每一句执行语句后面有;
回车换行不表明结束,;才表示。
编译的过程:编译以后会生成一个或多个字节码文件。字节码文件的文件名与java源文件中的类名相同。运行只运行含main的文件。
计算机系统
硬件:
cpu
内存:8bit单元=byte单元
kb mb gb eb zb yb
软件:一系列按照特定顺序组织的计算机数据和指令的集合。分为系统软件和应用软件。
系统软件:
应用软件:
人机交互方式:图形化界面&命令行dos
应用程序=算法+数据结构
算法解决应用程序正确与否。
数据结构解决效率的问题。选择正确的数据结构。
### 计算机基础
- 计算机概述
两个鼻祖:
图灵:电影《模仿游戏》。
计算机科学和人工智能之父。
计算机领域最高奖“图灵奖”。
国内:姚期智,清华姚班。
冯诺依曼:计算机之父和博弈论之父。
理论要点-数字计算机的制采用二进制;计算机应该按照陈序顺序执行。
- 冯诺依曼体系
现代计算机基础。
- 计算机结构
- 硬件Hardware
计算机可以看得见的物理部分。
- CPU
它从内存中获取指令,然后执行这些指令。
cpu速度的计量单位是赫兹(Hz),1Hz相当于每秒1个脉冲。目前以千兆赫(GHz)来表述。
三个定律:
摩尔定律
安迪-比尔定律
反摩尔定律
- 运算器
算数、逻辑单元(arithmetic、logic unit):用于完成数值运算(+,-,*。/)和逻辑运算(比较)。
- 控制器
控制单元(control unit):控制代码指令,流程。用于控制和协调其他组件的动作)。
- 存储器
- 存储设备
内存存取数据的速度比硬盘的存取速度快10倍。而cpu的速度比内存不知道还要快多少倍。把程序从硬盘放到内存后,cpu就直接在内存运行程序,cpu操作的数据都来自于内存,读内存中的数据做运算。
Java在数据当中怎么分配。内存解析。
电脑慢了,调大内存,在内存不够的情况下。换固态硬盘,硬盘给数据速度更快。
- 硬盘Hard Disk(ROM手机内存)
写在磁盘上的是永久保存的。
- USB
- 内存(RAM)Random-Access Memory
数据是如何存储在计算机中的:计算机就是一系列的电路开关,每个电路存在两种状态off(0)和on(1)。
一个0或者一个1存储为一个比特(bit),是计算机中最小的存储单位。
计算机中最基本的存储单元是字节(byte)。每个字节由8个比特bit构成。
千字节(Kilobyte)1KB=1024B
兆字节(Megabyte)1MB=1024KB
千兆字节(Gigabyte)1GB=1024MB
万亿字节(Terabyte)1TB=1024GB
内存中的信息断电会丢失。
内存:由一个有序的字节序列组成,用于存储程序及程序需要的数据。
一个程序和它的数据再被cpu执行前必须移动到计算机的内存中。
每个字节都有一个唯一的地址。使用这个地址确定字节的位置,以便于存储和获取数据。
一个计算机具有的RAM越多,它的运行速度越快,但是此规律是有限制的。
- 输入/输出
- 通讯设备
调制解调器,网卡
- 软件Software
软件是看不见的指令,这些指令控制硬件并且使得硬件完成特定的任务。
软件:即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应用软件之分。
分为:
操作系统
应用软件(软件开发=程序设计):
创建或开发软件。
人机交互方式:
图形化界面(GUI):
命令行方式(CLI): 需要有一个控制台,输入特定的指令,让计算机完成一些操作。
- 软件
- 操作系统软件operating system
是运行在计算机上的最重要的程序,可以管理和控制计算机的活动。
和硬件打交道。
控制程序。
用户也可以直接控制操作系统。
window mac linus nuix android ios
- 电脑系统
- 手机系统
- 应用软件/应用程序
program = Algorithm + data structure
例如:排序
算法:程序正确与否
数据结构:载体与效率的问题
- 计算机语言/程序设计
程序设计语言:写指令用的语言。
计算机编程语言介绍:
第一代语言:机器语言,二进制代码
第二代语言:汇编语言,助记符
第三代语言:高级语言,
面向过程:
面向对象:java,python,scala,JS
tiobe:语言排行榜
- 面向过程
c和c++的开发效率低,执行效率高,做底层
- 面向对象
java的开发效率高,执行效率低,社区活跃,第三方框架多,社会web开发
python的开发效率更高,执行效率更低
C#社区活跃和开源不如java
- Java语言概述/历史发展
是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以 在Web浏览器中运行。这些Java程序被称为Java小程序(applet)。applet使 用现代的图形用户界面与Web用户进行交互。 applet内嵌在HTML代码中。
后台开发:java大公司,php,python小公司,go,node.js,
javase-javaee-javame
JAVASE(standard)桌面级应用
JAVAEE(enterprise)web应用程序
JAVAME(micro)移动端
• 移动领域应用:主要表现在消费和嵌入式领域,是指在各种小型设备上的应用,包括手 机、PDA、机顶盒、汽车通信设备等。
Java虚拟机 (Java Virtal Machine) 垃圾收集机制 (Garbage Collection)
- 开发环境
- 环境搭建
- 环境变量
- 常用的java开发工具IDE
(Integrated Development Environment)
- Hello World
}
对第一个java程序进行总结:
编写:我们将编写的java代码保存在以“.java”结尾的源文件中
编译:使用javac.exe命令编译我们的java源文件。生成字节码文件.class,有几个class生成几个。
javac ChairMan(文件名).java
运行:使用java.exe命令解释运行我么的字节码文件。只运行包含main方法的类。
在一个java源文件中可以声明多个class,但是只有一个public,只能是和文件名同名的类上。
java ChairMan(类名)
输出语句System.out.println 先输出后换行
Java方法由一条条语句构成,每个语句以“;”结束。
大括号都是成对出现的,缺一不可。
- 编写
- 编译
语法层面报错
- 运行
计算上的错误
- 编程风格
行尾风格
运算符和符号两边各加一个空格。
- 注释comment
格式: /* 注释文字 */
作用:
1.对所写的程序进行解释说明,增强可读性。方便自己,方便别人。
2.调试所写代码,对怀疑有问题的代码进行注释,排查bug。
文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形 式体现的该程序的说明文档。
- 单行
- 多行
- 文本
- debug断点异常调试
- Java API
。。。
- Java新特性
- Subtopic 4
- 万维网www(简称web)
是一个由许多互相链接的超文本组成的系统,通过互联网访问。在这个系统中,每个有用的事物,称为一样“资源”;并且由一个 全局“统一资源标识符”( URI )标识 ;这些资源通过 超文本传输协议( Hypertext Transfer Protocol 传送给用户,而后者通过点击链接来获得资源 。
就是平时上网的过程。
互联网>因特网>万维网
- web客户端
常用浏览器,访问web服务器上的页面。
B/S browser server:浏览器(特殊的客户端)
C/S client server:客户端 wechat,QQ。。
- web服务器程序
### 基础程序设计
- 基础语法
- 关键字Key Word/保留字reserved word
关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所有字母都为小写
官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
- 标识符Identifier
标识符:
Java 对各种变量、方法和类,接口,包等要素命名时使用的字符序列称为标识符 技巧:凡是自己可以起名字的地方都叫标识符。
- 组成和注意事项
Java中严格区分大小写,长度无限制。 标识符不能包含空格。
- 命名规则
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz (大驼峰)
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个 单词首字母大写:xxxYyyZzz (小驼峰)
注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。
- 常用内部类API(直接可用的功能)
API写好的
直接拿过来用
- 输入scanner/输出print
scanner键盘录入提高交互性
使用:
1导包,写好的直接用(放在class上面)
import java.util.scanner
2创建对象
scanner sc = new Scanner(System.in)
这一步可快速导包
System.out.println("请输入一个数据:")
3接收数据
int x = sc.nexInt
System.out.println(x)
println 输出再换行
print不换行
控制台程序
- Random随机生成
Random类 生成随机数 用法同scanner
创建对象:
Random rd = new Random();
获取随机数:
Int num = rd.nextline(20);
-0-19不包括20
-contrl+shift+O导入包
产生1-50的随机数:
Int num = rd.nextline(50)+1;
获取多次随机数,中间加入循环语句:
for(int i=1, i<20, i++){
sys...
}
练习
- ...
- Java中的内存分配
Java中的内存分配:程序在执行过程中,需要在内存中分配空间。为了提高运算效果,对内存空间进行了不同区域的划分,每一片区域都有特定的处理数据的方式和内存管理方式。
栈:储存局部变量:定义在方法中的变量
堆:存储new出来的东西,实例对象:每一个对象都有地址值;每一个对象数据都有默认值,byte,short,int,long是0,float,double是0.0,char是\u000,boolean是false,引用是null。
方法区:面向对象的。。。
本地方法区:和系统有关
寄存器:给cpu使用
空指针问题:
array = null 数组已经不指向堆内存数据,无法再访问到,空指针问题
- 栈内存Stack
- 堆内存Heap
- new
- 方法区
- 变量/常量
java变量是有类型的
在使用变量前必须定义(初始化)
- 变量概念
变量的概念:
内存中的一个存储区域 该区域的数据可以在同一类型范围内不断变化 变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
表达式:
数据类型 变量名 = 存储的值(初始化值)
final 数据类型 变量名 =
final变量不能被更改
同一个作用域内,不能定义重名的变量
- 变量表达式
声明变量
变量的赋值
声明和赋值变量
例如:int var = 10;
- 标识符
- 标识符命名
- 变量注意
1.变量必须先声明、赋值之后再使用。
2.变量都有所定义的作用域,一对{}内。
3.同一个作用域内不可以声明两个同名的变量。
同一个作用域内,不能定义重名的变量
- 变量的分类
- 按数据类型不同
对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分变量的分类-按数据类型 配了不同大小的内存空间。
- 基本数据类型primitive
8种基本数据类型
- 数值型
- 整数类型
正负都可以
(一个byte表256个数,负128正127)
bit: 计算机中的最小存储单位。
byte:计算机中基本存储单元。
- byte, short, int, long
byte b1 = 12;
byte b2 = -128;
short s1 = 123;
int i1 = 1234;
long l1 = 343556736225L;
- 浮点类型
浮点型常量有两种表示形式:
Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’。
- float, double
-1.798E308 ~ 1.798E308
- 字符型
char类型是可以进行运算的。因为它都对应有Unicode码。
- char
char c2 = '1';
char c3 = '中‘;
可以声明为转义字符:
Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。 例如:char c3 = ‘\n’; // '\n'表示换行符
c5 = '\t'; 表示制表符tab键
char类型是可以进行运算的。因为它都对应有Unicode码。 (ascII码)【字符编码集】
char c6 = '\u0043';
- 字符编码集
计算机的底层都是二进制的码
- ascII码
- unicode
- utf-8
- GBK-ANSI
- 布尔型
- boolean:true/false
true,1
false,0
Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的 boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false 用0表示。———《java虚拟机规范 8版》
- 基本类型转换/运算
不包含boolean类型,只有其他7种类参与转换、计算。
- 算数运算
7种
- 自动类型提升
当容量小的数据类型与容量大的数据类型的变量做各种运算时,结果自动提升为大的类型。
往高级的靠,不然会精度损失,一部分值存不下来。。。
此时的容量大小指的是,表示数的范围的大小。比如float>long。
=int />short
量大小排序为:
byte,char,short->int->long->float->double
boolean类型不能与其它数据类型运算。
- byte,char,short->int->long->float->double
特别的:当byte,char,short三种类型的变量做运算时,结果为int类型。同种类型做运算结果也是int型来接收。
- 强制类型转换:损失精度
需要使用强转符()
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使 用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。
如果本来的数据就小,就没有精度损失
boolean类型不可以转换为其它的数据类型。
- 使用强转符()
小数点是截断,不是四舍五入,损失了精度。
int i1 = 128;
byte b = (byte)i1;
System.out.println(b);
结果为-128(用二进制来解释)
- 两个特殊情况
编码情况1:
123213; (int转long可以)
long 2 = 278945872950802;(不加L就不行超过int了)
float f1 = 12.3;(不加F是double比float大不能自动转换)
编码情况2:
整型常量,默认类型为int型
浮点型常量,默认类型为double型
- 连接运算
8种
+前后只要有一个类型是string,就是连接的。
- 基本数据类型+“字符串”
当把任何(8种)基本数据类型的值和字符串(String)进行连接运算时(+连接符号),基本数据类 型的值将自动转化为字符串(String)类型。
String不是基本数据类型,属于引用数据类型
使用方式与基本数据类型一致。例如:String str = “abcd”;
int n = 100;
str = str + n;
如: String a = “43”; int i = Integer.parseInt(a);
“”可以
’‘不可以
’ ‘可以,存了个空格
- 变量之进制
所有数字在计算机底层都以二进制形式存在。
十六进制(hex):0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。 如:0x21AF +1= 0X21B0
呈现出来的都是十进制
- 二进制0b/0B
6
- 十进制
110
- 八进制0
87
- 十六进制0x/0X
4362
- 进制转化
- 二与十
- 二与八和十六
- 引用数据类型reference
- 数组Array
Java数组时一种数据的容器
1.数组中的元素数据类型相同
2.数组长度length,即有多少个数组
3.元素数据有排序位置:索引(从0开始,长度-1)
数组可以存储多个变量。是可以存储多个相同数据类型(元素)的有序容器。
基本数据类型,引用数据类型
- 创建数组
int a[];
int[] a1;
double b[];
Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
创建定义数组格式:
--多用这个
数据类型 数组名[];
2 第二种定义方式, 和第一种本质一样,只是写法不一样:
3 第三种定义方式, 定义就只是定义, 没给赋初始值:
长度
定义好数组变量后, 可以这样给单个单个数组元素赋值, 这是第三种赋值方式: arr[0] = 11;
arr[1] = 12;
给数组元素赋值,除了可以直接用字面量常数外,也是可以赋值另一个变量的。 int a = 10;
int b = 20 ;
arr[0] = a; arr[1] = b;
- 初始化数组
定义之后并没有储存
数组初始化:为数组开辟内存空间,并为数组中的每个元素赋予初始化值
两种方式:数值为0
1.动态初始化 只需要给出数组的长度,系统会默认给出初始化值。
数类型[] 数组名 = new 数类型[长度]
int[] array = new int[10]
2.静态初始化 可以直接给出初始化值,由系统决定数组长度,数组元素个数。
[]:声明这是一个数组
new:为数组申请内存分配的,开辟内存空间,堆空间储存
- 动态初始化
动态初始化:
int[] array = new int [3]
array[0]=1
array[1]=2
array[2]=3
- 静态初始化
指定每个数组元素的初始化值,长度由系统决定
数据类型[]数组名=new 数据类型[]{元素1,2,3}
- 数组内存
栈:储存局部变量:定义在方法中的变量
堆:存储new出来的东西,实例对象:每一个对象都有地址值;每一个对象数据都有默认值,byte,short,int,long是0,float,double是0.0,char是\u000,boolean是false,引用是null。
- 默认初始值
对于基本数据类型而言,默认初始化值各有不同 对于引用数据类型而言,默认初始化值为null(注意与0不同!)
- 一个数组
- 两个数组
- 两个数组指向同一个地址
一个数组地址赋值给第二个,两个数组指向同一个地址。
int[] array2= array1;
- 数组中元素的获取
直接输出数组名获取的是地址值。
我们想获取数组中的元素,数组中每个元素都是有编号(索引下标)的,从0开始,最大的编号是数组长度-1。
数组名[索引]
获取数组的长度(个数)
array.length
- 取值
取值: 取出数组元素的值是通过数组的变量名+索引值的方式取出,
语法: 变量名 [索引值]
System.out.println(array[0])
System.out.println(array)
直接打印输出数组名获取的是数组的地址值。
- 数组遍历
获得数组中所有数据
遍历:依次输出数据中的每一个元素
通过for循环实现
}
- 获取最值
获取最大值、最小值
int max = array[0]
for.....
if(array[x]>max){
max=array[x];
- 数组类型
- 一维数组
- 二维数组
- 二维数组遍历
- 多维数组
- 面向对象数组
通过数组类的构造方法构造数组:
public static void main...
class ArrayClass{
用类的属性封装数组变量
private long[] arr;
private int nElems;当前存在数组长度
用构造函数初始化数组
public ArrayClass(int maxSize){最大长度
arr=new long[maxSize];
nElems=0;
}
}
}
- 类Class
- 字符串string类
使用方式与基本数据类型一致。例如:String str = “abcd”;
- ....
- 接口API(interface)
- 按声明的位置不同
在方法体内部声明的变量称为局部变量。
●注意:二者在初始化值方面的异同:
异:局部变量除形参外,需显式初始化。
- 成员变量
- 实例变量(不以static修饰)
- 类变量(以static修饰)
- 局部变量
- 代码块局部变量(在代码内定义)
- 方法局部变量(在方法内定义)
- 形参(方法、构造器中定义的变量)
- 运算符
运算符是对常量和变量进行代码操作的符号
- 算数运算符
- +, -, *, / ,%, ++ ,--
1.整数相除/只能得到整数
2.字符串”“参与+运算实际上是拼接
3.字符参与运算是字符在计算机里储存的数据值参与运算A=65 a=97
4.自增自减运算符++,--对变量做加1减1操作(++a/a++),前++和后++。
5.自增自减运算符既可以放在变量的后面使用,也可以放在前面。单独使用,无论放在前面还是后面,结果一样。
6.参与运算时,放在后面,变量先做操作再做加减1;放在前面,先做加减1再做操作。
ia = 3;
int ib = ia++
ib=3
intid =++ia
ib=4
--------
System.out.println(ia++);//4(结束以后ia是5)
System.out.println(++Ia);//6(5+1=6)
7.%取余运算符,模
- 除以/
除号/
int num1 = 12;
int num2 = 5;
int result = num1 / num2; //2
//10
double result3 = num1 / num2; //2.0
double result4 = num1 / num2 + 0.0; //2.0
double result5 = num1 / (num2 + 0.0);//2.4
double result6 = (double)num1 / num2;
- 取模%
最终结果的符号和被模数一样。
开发中,经常使用%来判断能否被除尽的情况。
- 自加子减++,--
自增1
先自增1,然后再运行。
前++
前--
先运行,然后再自增1。
后--
自增1不会改变本身的数据类型
short s1 = 10;
s1 = s1 + 1; //编译失败
s1 = (short) (s1 + 1); //right
s1++; result will be short type.
开发中需要自增1都用++
byte bb1 = 127;
bb1++; //-128(originally)
- 前++,后++
- 前--,后--
- 字符串连接+(见上)
- 赋值运算符
- 简单赋值运算符=
int a = 10
把10赋值给int类型变量a
支持连续赋值。
i2 = j2 = 10;
i3 =10, j3 = 20;
- 复合赋值运算符+=,-=,*=,/=,%=
加赋值,减赋值,。。。。取余赋值
- 关系/比较运算符
- ==, !=, >, <, >=, <=
1.用来比较两个表达式大小或值大小关系的标识符,
2.关系运算符的结果是boolean类型的:true,false
3.不支持10<= ia <= 99这种语法格式
通过逻辑运算符来处理
boolean = c = (a==b)
System.out.println(c)
- 逻辑运算符
- &&(与) ||(或)!(非)
操作数为boolean表达式
&&与 相当于并且 同真为真 一假为假
||或 相当于或者 一真为真 同假为假
!非 相当于取反 真为假 假为真
- 条件/三元(目)运算符
- (a>b)?a:b
语法格式:
条件表达式?表达式1:表达式2;
执行流程
先来计算关系表达式的结果,看是true还是false
若成立true,则执行表达式1
若不成立false ,则执行表达式2
int a = 10
int b =20
in c = (a>b)?a:b
temp max
- 位运算符
- 位移运算符
- 运算符之间的优先级
- 流程控制语句
- 顺序结构
- 选择结构
1.if语句
第一种格式:
if(关系表达式){
语句体;
}
true执行 false不执行语句体
第二种格式:两种情况判断
if(关系表达式){
语句体1;
}else{
语句体2;
}
第三种格式:多种情况判断
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}else if(关系表达式3){
语句体3;
}
...
else{语句体你;
}
2.switch语句,依次比较
switch(){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
...
default:
语句体n;
break
}
格式说明:
表达式:byte,short,int,char
JDK5以后可以是枚举
JDK7以后可以是字符串
Case的值:就是用来和表达式进行匹配的
break:中断的意思,没有会穿透
default:最后都不满足执行的语句体
枚举:
enum Colour{green,yellow,red
}
switch(Colour.red)
- if
1.if语句
第一种格式:
if(关系表达式){
语句体;
}
true执行 false不执行语句体
第二种格式:两种情况判断
if(关系表达式){
语句体1;
}else{
语句体2;
}
第三种格式:多种情况判断
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}else if(关系表达式3){
语句体3;
}
...
else{语句体你;
}
- switch
2.switch语句,依次比较
switch(){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
...
default:
语句体n;
break
}
格式说明:
表达式:byte,short,int,char
JDK5以后可以是枚举
JDK7以后可以是字符串
Case的值:就是用来和表达式进行匹配的
break:中断的意思,没有会穿透
default:最后都不满足执行的语句体
枚举:
enum Colour{green,yellow,red
}
switch(Colour.red)
- break停止
- 循环结构
实战开发中用的最多的,需要反复执行某一段代码时使用
4个组成:
初始化语句
判断条件语句:关系表达式
控制条件语句:循环执行部分
循环语句:循环结束后++--
三种循环语句
1.for循环
2.while循环
...while循环
- for
for(初始化;判断条件;控制条件){
循环体语句;
}
执行流程:
1.初始化语句
2.判断条件语句 false结束 true继续
3.执行循环体语句
4.执行控制条件语句
5.回到第二部继续
for(i=1, i>+10, i++){
循环体语句
}
练习
求1-100的和
偶数和
- while
初始化语句
while(判断条件语句){
循环体语句
控制条件语句
}
while(i>+10){
sys....
i++/break
}
成立就继续执行
while(true){
循环体语句
break
}
练习1-100的和
- continue跳过
在循环语句中使用,离开循环场景无法使用
for(int i=1,i<+10, i++){
if(i==5){
continue
}
}
t跳过第5次循环
- do...while
















