Java和大数据有什么关系,发展前景怎么样?

Python015

Java和大数据有什么关系,发展前景怎么样?,第1张

一、 Java和大数据有什么关系?

大数据开发需要编程语言基础,Java是世界上应用最广泛的计算机编程语言,具有功能强大和简单易用两个特征,同时还具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。

Java具有的众多特性,特别适合作为大数据应用的开发语言,当下Hadoop以及其他大数据处理技术很多都是用Java,Java是大数据技术的主要支持言语,当下学大数据技术之前都会先学Java语言。

二、为什么要学习Java大数据技术?

学习Java的原因如下:

1、从各行业软件开发技术的生态圈来看:

(1)Java已经形成一种文化,有企业成熟的解决方案

(2)开源社区发展的强大,而Java在开源社设区占重要地位

(3)主流大数据框架hadoop、spark、HBase等离不开Java平台

2、从Java本身特性来看

(1)面向对象、跨平台,可以运行在Linux、Windows、Unix等系统上

(2)Java虚拟机发展非常成熟,在内存回收、并发处理、作为大数据和云计算平台等应用上有着不可替代的作用

3、在企业级的开发环境里,安全、稳定是硬道理,这方面Java有着不可替代的作用另外还有其它很多优秀特性如多线程、分布式、函数式编程等。

学习大数据的原因:

(1)国家将发展大数据放在了战略地位,大数据前景无限

(2)分布式存储和分布式计算框架hadoop、内存计算框架spark发展很成熟并在企业广泛部署

(3)面向对象设计思想已经发展很成熟,自底向上的设计思想函数式编程发展的也十分成熟,海量数据并发处理技术也发展很成熟,非结构化数据的处理发展也很成熟等等,并且在企业广泛部署的主流框架大数据hadoop、spark上得到体现

(4)海量数据的智能分析已被广泛应用,例如:推荐系统、金融风险预测、天气预报等等

(5)人工智能的核心学科—机器学习,其中的深度学习算法已经具备处理“海量数据训练集”的条件、硬件的海量图形处理或者海量图片处理已经具备处理条件,如GPU、TPU,甚至现在已经研发出专门的AI芯片。

根据行业预测,2021年行业在Java大数工作岗位需求将激增,其中Java大数据工程师的缺口在14万到19万人之间,Java大数据工程师实习月薪一般在8000元左右。学Java大数据,前途跟钱途兼具。

1、大数就是位数多,数值大的意思。通常来说c语言里的基本数据类型范围是有限的,如long型的最大只能表示几十亿,几十亿也就11位数字长度而已。如果用100长的数组表示,假设数组一个元素存数字的一位,那么总位数可以达到100位,这是基本数据类型无法表示的。

2、例程:

#include"stdio.h"

int getlength(char a[]){

 int i=0

 while(a[i])

  i++

 return i

}/*返回字符串的长度*/

int chartoint(char a){

 return a-48

}/*将字符编程整形*/   

void creatarray(char a[],char b[]){

 printf("请输入第一个数:")

 scanf("%s",a)

 printf("请输入第二个数:")

 scanf("%s",b)

}/*创建数组*/

void go(char a[],char b[],int s[]){

 int alength=getlength(a)

 int blength=getlength(b)

 int i=alength-1

 int j=blength-1

 int k/*s数组下标*/

 int slength

 if(alength>blength)

  slength=alength

 else

  slength=blength

 k=slength

 while(i>=0&&j>=0)

  s[k--]=chartoint(a[i--])+chartoint(b[j--])

 while(i>=0)

  s[k--]=chartoint(a[i--])

 while(j>=0)

  s[k--]=chartoint(b[j--])

 k=slength

 while(k>=2){

  if(s[k]>=10){

   s[k-1]++

   s[k]-=10

  }

  k--

 }

 printf("两数之和为:")

 if(s[1]>=10){

  s[0]=1

  s[1]-=10

  for(i=0i<=slengthi++)

   printf("%d",s[i])

 }

 else{

  for(i=1i<=slengthi++)

   printf("%d",s[i])

 }

 printf("\n")

}

void main(){

 char a[1000],b[1000]

 int s[1000]

 int lab

lab1: creatarray(a,b)

 go(a,b,s)

 printf("请输入1继续(想退出按其他数字键):")

 scanf("%d",&lab)

 if(lab==1)

  goto lab1

}

这是代码,如果要用,要先自己调试一下才行。

struct Node // 定义一个双向链表用来存贮结果

{

char data// 数据*定义为字符的原因:要显示负号

Node *next// 尾指针

Node *ahead// 首指针

}

/*--------------------------------------------------------------------------

*函数名称: 大数加法

*函数过程:1 比较两个数那一个长

* 2 以长的作为循环次数

* 3 对应项相加 进位存贮直到下高位相加用

* 4 直到循环结束

* 5 !!!!!!没设计负数相加

*入口参数:numa,numb,result字符串

*出口参数:无

*编辑环境:winSP2 + VC2003 + C++

*--------------------------------------------------------------------------*/

void addition(char *numa, char *numb,char *result) // 计算两大数之和

{

char *pna = findend(numa)// 指向numa的一个指针。point numa pna 指向乘数的最低位,

char *pnb = findend(numb)//指向numb的一个指针 //pnb 指向被乘数的最低位,

int along=(int)strlen(numa)//标记数字a的长度;

int blong=(int)strlen(numb)//标记数字b的长度;

int times = 0// 标致要计算多少次。

int carry=0,temp_result//存贮进位 和临时结果的

Node *head, // 用于存贮头指针

*pstart, // 用于存贮计算时的首指针

*pnew//作于申请新结点

head = pstart =new Node//初始化首结点和头结点。

pstart ->data = 0

pstart ->next = NULL

pstart ->ahead = NULL

if (abigerb(numa ,numb)>=1)

times = (int)strlen(numa)//比较两个字符串长度,以大的作为循环次数

else

{

times = (int)strlen(numb)

pna = findend(numb)//交换指针

pnb = findend(numa)

along=(int)strlen(numb)//标记数字a的长度;

blong=(int)strlen(numa)//标记数字b的长度;

}

while ((times-- &&(times>=0))|| carry != 0)

{

if(!pstart->next) //如果当前为空结点,则申请新结点

{

pnew = new Node

pnew ->data = 0

pnew ->next = NULL

pnew ->ahead = pstart

pstart ->next = pnew

}

else temp_result =(pstart->data +(*pna-48)+(*pnb-48)+carry) //自身的值+新值+进位 作为当前的新值

pstart ->data = temp_result%10//存贮个位

carry = temp_result/10//存贮进位

pstart = pstart ->next//结点移动

blong--

if(blong>0)pnb--//指针移向被加数高位

else *pnb=48//之后相减就变为了0不作任何运算;

pna--//加数指针移动,

}

pstart =head//寻找链表的结尾点

while(pstart->next != 0)

{

pstart->data += 48//!!<<<因为我们的输出是字符。所以再此加上48>>>>逆顺输出

pstart = pstart->next

}

int tip = 0//转为字符串用

pstart = pstart->ahead //找有效字

//cout<<"\n结果是 : "

while(pstart != 0) //输出正序的结果;

{

result[tip++] = pstart->data

//cout<data

pstart = pstart->ahead

}

result[tip] = '\0'

pstart =head//释放空间

while(pstart->next != 0)

{

pnew = pstart->next delete pstart

pstart =pnew

}

return

}

//比较两个数字符串大小的函数

//返回值说明:0是alongblong 2是along=blong

int abigerb(char *numa, char *numb) //比较两个数最高位那一个大

{

int along=(int)strlen(numa)//标记数字a的长度;

int blong=(int)strlen(numb)//标记数字b的长度;

char *pna = numa//指向数A的最高位,

char *pnb = numb//指向数B的最高位,

if (along>blong) return 1

if (along==blong)

{

while(*pna) //比较两个数那一个大

{

if(*pna>*pnb)return 1

else if(*pna<*pnb)return 0

else if(*pna==*pnb) //1111与1112

}

return 2//这表明找到最后了还是全相等

}

return 0

}

/*--------------------------------------------------------------------------

*函数名称: 大数减法

*函数过程:1 比较两个数那一个长

* 2 以长的作为循环次数

* 3 如果两个数长度相等,从最高位开始比直到发现那一个数更大,使大项减去小项

* 4 对应项相减 进位存贮直到下高位相加用

* 5 每一位对应项相减时,处理三种可能的情况,a=b,ab

* 6 a=b时,则计算,11-12,111-112,要考虑借位

* 7 直到循环结束

*入口参数:numa,numb,result字符串

*出口参数:无

*--------------------------------------------------------------------------*/

void subtract(char *numa, char *numb,char *result)//计算减

{ char *pna = findend(numa)//指向numa的一个指针。point numa pna 指向减数的最低位,

char *pnb = findend(numb)//指向numb的一个指针 //pnb 指向被减数的最低位,

int along=(int)strlen(numa)//标记数字a的长度;

int blong=(int)strlen(numb)//标记数字b的长度;

int times = 0// 标记要计算多少次。

int carry=0//存贮借位

int clear0=0//消除结果最前面无用的'0' 13-5 = 08 的效果!!

int isnegative=0//用来加上被减数大于减数时补上最后一个负号

Node *head, // 用于存贮头指针

*pstart, // 用于存贮计算时的首指针

*pnew//作于申请新结点

head = pstart =new Node//初始化首结点和头结点。

pstart ->data = 0

pstart ->next = NULL

pstart ->ahead = NULL

if (abigerb(numa ,numb))

times = strlen(numa)//比较两个字符串长度,以大的作为循环次数

else //交换位置以降低难度

{

times = strlen(numb)//让数(字符串)长的减去数(字符串)短的

pna = findend(numb)//交换指针

pnb = findend(numa)

along=(int)strlen(numb)//标记数字a的长度;

blong=(int)strlen(numa)//标记数字b的长度;

isnegative=1//标记最后要加上负号

}

while ((times-- &&(times>=0))|| carry != 0)//carry != 0 说没有借位时

{

if(!pstart->next)//如果当前为空结点,则申请新结点

{

pnew = new Node

pnew ->data = 0

pnew ->next = NULL

pnew ->ahead = pstart

pstart ->next = pnew

}

if(times<0)//如果计算完之后,借位等于1,,说明必然为负值

{ pstart ->data = -3 //让它等于负号 '-'//-3来源于负号与0相差3。。

break}

else

{

if ( *pna == *pnb )//减数等于被减数时。结果等于直截相减的结果;并置借位为0

{

if(carry==0)pstart ->data = (*pna-48)-(*pnb-48)//111-11的情况

else

{

pstart->data = (*pna-48)-(*pnb-48)+10 -carry//1121-1112 carry=1

}

}

if( *pna >*pnb )//减数大于被减数时。结果等于直截相减的结果;并置借位为0

{

pstart ->data = (*pna-48)-(*pnb-48)-carry//存贮个位

carry=0

}

else if( *pna <*pnb )//说明被减数大于减数,让结果加10,相当于借位 (carry)为1

{ if(times>0)

pstart->data = (*pna-48)-(*pnb-48)+10 -carry//13-5的情况作为新值

else

pstart->data = (*pnb-48)-(*pna-48) -carry//3-5 作为当前的新值

carry=1

}

}

pstart = pstart ->next

//结点移动

blong--

if(blong>0)pnb--//指针移向被减数高位

else *pnb=48//之后相减就变为了0不作任何运算,其实可以优化的。但代码会长!而且还需要重新开结点。所以放弃; pna--//被数指针移动,

}

if(isnegative==1)////加上负号处理。增加一长度并置为负号

{

pnew = new Node

pnew ->data = 0

pnew ->next = NULL

pnew ->ahead = pstart

pstart ->next = pnew

pstart->data=-3//因为寻找链表的结尾点要统一加48。又因为‘-’是45。所以等于‘-3’

}

pstart =head//寻找链表的结尾点

while(pstart->next != 0)

{

pstart->data += 48//!!<<<因为我们的输出是字符。所以再此加上48>>>>逆顺输出

pstart = pstart->next

}

int tip = 0//转为字符串用

clear0=0// 消除结果最前面无用的'0' 13-5 = 08 的效果 ..>>修改字符串的首指针

pstart = pstart->ahead //找有效字

while(pstart != 0)//输出正序的结果;

{ if(clear0==0 &&((int)pstart->data)==48&&pstart->ahead!=0)// 消除结果最前面无用的'0'

//不输出任何东西

else

result[tip++] = pstart->data

if(((int)pstart->data)!=48&&((int)pstart->data)!=45)clear0=1//'-'号

pstart = pstart->ahead

}

result[tip] = '\0'

pstart =head//释放空间

while(pstart->next != 0)

{

pnew = pstart->next

delete pstart

pstart =pnew

}

return

}

/*--------------------------------------------------------------------------

*函数名称: 大数乘法

*函数过程:1 输入两个大数作为字符串

* 2 作一个双向链表

* 3 两个指针分别指向数字字符串的最低位

* 4 以第一个数的最低的一个位乘以第二个数的所有项存于链表中

* 5 链表首指针移

* 6 重复4,5依次从最低位乘到最高位

* 7 乘完后因为最低位是链表首,最后一位是链表尾。所以在逆顺输出链表。

* 4 直到循环结束

*入口参数:numa,numb,result字符串

*出口参数:无

*--------------------------------------------------------------------------*/

void multiply(char *numa, char *numb ,char *result)//用来储结果的)//计算乘积

{ char *pna = findend(numa)//指向numa的一个指针。point numa pna 指向乘数的最低位,

char *pnb = findend(numb)//指向numb的一个指针

//pnb 指向被乘数的最低位,

int along=(int)strlen(numa)//标记数字a的长度;

int blong=(int)strlen(numb)//标记数字b的长度;

int carry=0,temp_result//存贮进位 和临时结果的

Node *head, // 用于存贮头指针

*pstart, // 用于存贮计算时的首指针

*pnew, //作于申请新结点

*pgo//作为每计算完一行时,回到下一行起始节点用,移位标致来用

head = pstart =new Node//初始化首结点和头结点。

pstart ->data = 0

pstart ->next = NULL

pstart ->ahead = NULL

while (along--)

{

pgo = pstart//保存进位点

blong = (int)strlen(numb)//初始化长度

pnb = findend(numb)//初始化指针

while ((blong-- &&(blong>=0))|| carry != 0)

{ if(!pstart->next)//如果当前为空结点,则申请新结点

{ pnew = new Node

pnew ->data = 0

pnew ->next = NULL

pnew ->ahead = pstart

pstart ->next = pnew

}

if(blong<0)temp_result = carry //处理只有进位的情况

else temp_result =(pstart->data+(*pna-48)*(*pnb-48)+carry)//自身值+新值+进位作为新值

pstart ->data = temp_result%10//存贮个位

carry = temp_result/10//存贮进位

pstart = pstart ->next//结点移动

pnb--//指针移向被乘数高位

}

pstart = pgo->next//前进一个位置;

pna--//指针移向乘数高位

}

pstart =head//寻找链表的结尾点

while(pstart->next != 0) {

pstart->data += 48//!!<<<因为我们的输出是字符。所以再此加上48>>>>逆顺输出

pstart = pstart->next }

int tip = 0//转为字符串用

pstart = pstart->ahead //找有效字

while(pstart != 0)//输出正序的结果;

{ result[tip++] = pstart->data

pstart = pstart->ahead }

result[tip] = '\0'

pstart =head//释放空间

while(pstart->next != 0) {

pnew = pstart->next

delete pstart

pstart =pnew

}

return

}

/*--------------------------------------------------------------------------

*函数名称: 大数除法2--

*函数想法:1 用指针指向除数的最高位,保存临时字符串; tempstr[a++] = pna

* 2 如果临时字符串大于被除数,则相减。结果等于余数

* if(tempstr>numb)tempstr = tempstr - numb

* 3 如果小于被除数且指针到头,余数 等于 临时字符串

* if(tempstr *

*入口参数:numa,numb,result,remainder字符串

*出口参数:无

*--------------------------------------------------------------------------*/

void divide2( char *numa, char *numb,char *result,char *remainder)//计算除法2

{ char one[]="1"//临时字符串....

char one2[]="1"//

char zero[]="0"//

char numb2[6048]//

char tempstr[6018]=""//临时字符串 i

nt ia=0,ia2=0//tempstr的指示器

bool moveon=false//翻转牌

char *pna = numa//指向numa的一个指针point numa pna //指向减数的最低位,

char *pnb = findend(numb)//指向numb的一个指针 //pnb 指向被减数的最低位,

Node *head, // 用于存贮头指针

*pstart, // 用于存贮计算时的首指针

*pnew//作于申请新结点

head = pstart =new Node//初始化首结点和头结点。

pstart ->data = 0

pstart ->next = NULL

pstart ->ahead = NULL

moveon = falsewhile(*pna)

{ if(!pstart->next)//如果当前为空结点,则申请新结点

{ pnew = new Node

pnew ->data = 0

pnew ->next = NULL

pnew ->ahead = pstart

pstart ->next = pnew}

ia=(int)strlen(tempstr)//取的长度

tempstr[ia++] = *(pna++)

tempstr[ia] ='\0'//转换为字符串

if(tempstr[0]=='0')//处理高位也是0的那种 如00

{

ia2=0

while(tempstr[ia2]=='0')++ia2

while(ia2>=1)//清除无用的0

{

ia=ia2-1

tempstr[ia]=tempstr[ia2]

--ia2

}

tempstr[++ia2]='\0'

}

while(abigerb(tempstr,numb)>0)//如果tempstr大于等于numb

{

if(tempstr[0]=='0')//处理高位也是0的那种 如00----此乃冗余代码,留做记念用

{

ia2=0

while(tempstr[ia2]=='0')++ia2

if(ia==ia2 )

}

strcpy(numb2,numb)

subtract(tempstr, numb,tempstr)//A-B strcpy(numb,numb2)

if(tempstr[0]=='-')//若判断的不准,变为了负数就再加上B。。

{

strcpy(numb2,numb)

addition(tempstr, numb,tempstr)//A-B

strcpy(numb,numb2)

ia2=0//修正之后的长度。因为加法中未做负数运算

ia=0//为了消除最后的那一个负号,整体向前移动。

while(tempstr[ia2]!='\0')++ia2

while(ia2>=1)//清除无用的0 {

tempstr[ia]=tempstr[ia+1]

++ia

--ia2}

tempstr[ia]='\0'

moveon = true

break}

pstart->data++ //结果自加

moveon = true}

if(moveon) pstart = pstart ->next//结点移动

}

strcpy(remainder,tempstr)//存贮余数

int tip = 0//转为字符串用

pstart =head//寻找链表的结尾点

while(pstart->next != 0) {

pstart->data += 48//!!<<<因为我们的输出是字符。所以再此加上48>>>>逆顺输出

result[tip++] = pstart->data

pstart = pstart->next }

result[tip] = '\0'//存贮结果

pstart =head//释放空间

while(pstart->next != 0) {

pnew = pstart->next delete pstartpstart =pnew}

return

}

另外,虚机团上产品团购,超级便宜