大数据学习记录---JAVA篇---后续知识

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 一些面向对象之后的知识的学习,包括下面知识:1、包装类 2、正则表达式 3、Array类 4、Lambda表达式 5、collection集合 --List系列和Set系列 6、 map集合--重点hashmap 7、泛型修饰 8、可变参数其实一种常见API的知识,也不太需要死记硬背,要学会查api文档去看里面具体每个方法是怎么用的,在后续使用中去学去熟悉。

包装类

1、之前说过的把基本数据类型包装成面向对象的形式就是包装类
2、下面是包装类的一些特性和功能
image.png

正则表达式

1、正则表达式就是字符串变量要matches的规则,可以用xx.matches(正则表达式)来得到我们的字符串变量是否满足某种规则,具体的规则定义如下。
image.png
这些个规则具体可以去看java官方的api文档
2、除了用matches匹配判断是否满足某种规则,正则表达式还可以有下面几种用法
image.png
正则表达式同时还经常搭配pattern和matcher类使用,具体看文档
肯定还有很多其他的用法,具体方法api去看官方文档,要学会看文档

Arrays类--也是一个常用工具类

1、就是一个用来操作数据的类,之前也见过,比如里面的toString能快速打印数组内容成字符串
2、除此以外还有sort,binarySearch等功能,用法就是Arrays.sort(数组a)
3、sort还可以用Comparator自定义排序的规则,具体用到的时候自己看文档

Lambda表达式

匿名内部类回顾

1、把匿名内部类写法更简化的一种写法!
2、回顾一下什么是匿名内部类,匿名内部类本来就是一种简化的写法,是对一些接口,或者抽象类进行实例化的时候,直接用{}把方法重写了。例如:Animal a = new Animal(){xxxx把方法重写了}。相当于创建了一个没有名字的子类,继承了抽象类或者实现了接口。
3、然后要注意这里实际上实例化的是我们的匿名内部类的对象,而不是Animal的对象!这和多态的思想是不同的,一开始想错了,并不相当于多态。匿名内部类new出来的是当前new的那个类型的子类型!!!

Lambda表达式介绍

1、使用条件:Lambda只能简化接口中,只有一个抽象方法,的匿名内部类形式。 首先必须是接口,其次只有一个抽象方法,可以在接口前加一个@Functionalinterface会自动帮检验。
2、例如下面的代码

interface Swimming{
    void swim()  // 只有一个抽象方法的接口,接口方法自动public abstract
}
/*--------主函数部分----------*/
Swimming s1 = new Swimming(){     //正常匿名内部类的写法
      public void swim(){
      xxxxx  // 重写抽象方法
      }
}
Swimming s1 = () -> {        // Lambda表达式的写法
      xxxxx  // 重写抽象方法  
}

3、Lambda表达式可以直接用在方法中,即当方法需要某种类或接口的参数的时候,可以直接在传参那里写一个Lambda表达式,注意以后要能读懂这种写法。
4、参数类型可以不写! 相当于在python里见到的那种,直接写一个参数 ->方法表达式的写法,就相当于直接返回表达式内容的值。
image.png

书上对Lambda表达式的另一种介绍--一定要看书!

1、上面是课中介绍的Lambda表达式是对匿名内部类的简化,这里书上提供了另一种角度来介绍,更像是我之前看到的python中Lambda表达式的介绍。
2、Java是面向对象的语言,我们想在传一个代码块做方法参数的时候,不能直接传,我们要先定义一个类,然后构造一个对象,对象的类中写好所需要的代码。而这时就有了Lambda表达式来做到支持类似函数式的写法。
3、在JAVA中有很多专门用来封装代码块的接口,这种接口只有一种方法,方法里就写了某种规则,然后在调用某些方法如Sort方法时,可以加一个comparator接口作为参数,来指定排序规则。而这类接口就叫函数式接口,而Lambda表达式正可以等同于这种接口,相当于直接在传参的时候,就不需要new一个匿名对象,再把对象里的抽象方法重写,而是直接把Lambda表达式作为参数传进去就行。
image.png
image.png
如上两种写法是一个意思,而Lambda表达式就更简便!
O1,O2在比较器中是用来指代传入的对象的!!

集合

Collection--单列

1、Collection是一种接口,下面还有具体的其他子接口继承它和实现类实现子接口,如下图。
image.png
2、用构造器初始化的时候可以用多态的写法,可以调用collection的一些通用api。但是!!多态写法不能用子类的独有功能!!

Collection<String> list = new ArrayList();

Collection集合的一些遍历方式

1、迭代器遍历
image.png
image.png
2、增强for循环遍历(也可以遍历数组)
image.png
3、结合Lambda表达式遍历的API
image.png
forEach方法结合Lambda表达式
原理上是forEach里面加上一个Consumer接口,但是其实这就是一个函数接口,只有一个抽象方法,所以可以直接用lamba表达式来写!!!
4、不支持以索引进行遍历,因为collection中包含着set系列是不含索引的

List系列集合

image.png
1、List系列集合的遍历方式,除了上面说的三种还有一种就是for循环用索引来遍历!
2、对于List集合来说,存在集合并发修改异常问题,就是说当你边遍历边删除list内部元素时,可能会出错,因为你在遍历时把对象删除,会导致list索引变化,那么在遍历时就会漏掉元素,会报错。对于迭代器遍历,可以用迭代器.remove来删除,不会出错。对于for循环,可以自减,保证不出错,或者for循环可以倒着删,也不会出错。剩下两个没办法。

ArrayList集合底层原理及特点

image.png
image.png
实现上还是基于数组,当size等于当前数组长度时,会自动进行扩容

LinkedList集合底层原理及特点

image.png
像栈和队列这些数据结构就可以用LinkedList实现,涉及首尾操作,效率高

Set系列集合

image.png

HashSet底层原理

这里重点理解一下思想,HashSet怎么实现的,用到了数组,链表,哈希表思想还有红黑树的内容。
image.png
image.png
image.png
image.png

HashSet去除重复底层原理和修正

1、去重的原理可以见上一部分HashSet的原理思想,先判断hashcode对应的地址,再用eqauls判断内容。
2、但是默认是两个new的对象不是重复的,即使他们内容相同,因为他们的hashcode不同,且地址也不同。所以必须在对应的类中重写overridding两个方法:hashCode()和equals()方法,才能使得内容相同的对象有一样的hashcode,且equals返回True。这个IDEA可以自动生成。
image.png

LinkedHashSet特点及原理

image.png

TreeSet特点及原理

image.png
image.png
1、在定义类的时候,就实现Comparable比较器接口,重写一个比较规则的方法。
2、用TreeSet自带的比较器对象来制定规则,就是在new的时候在括号里再new一个comparator,然后重写compare方法来指定规则。其实就是new一个匿名对象,然后重写方法。
3、其实comparator就是一个函数接口,上面这种方法其实更简化的写法就是直接在new的括号里加一个Lambda表达式来指定规则就行。
3、在写规则时,浮点型可以直接用Double.compare()

Collections集合工具类

1、这只是一个工具类,Collection是我们的单列集合接口,collections是定义的一个工具类,里面存了一些操作单列集合collection的方法,注意区分!具体使用查看文档!
2、工具类里面提供了许多静态方法,就直接用类名调用即可!这种写法其实很常见,比如前面也有一个是object是一个究极父类,同时objects是对应的一个工具类,里面提供了很多重写后的静态方法,供object子类使用,但是其实因为所有类都继承至object,所以大家都可以用objects里的api。

Map集合!!

image.png
image.png

Map集合的一些常用API

image.png

Map集合的遍历方式

1、键找值
用上面说的KeySet()找出所有键,再用get()通过键去找值。先获得所有key再去找value。
2、键值对
把key-value当成一个整体,先把Map集合转成Set集合,Set集合每个元素都是键值对。然后去遍历Set。
image.png
3、结合Lambda表达式的API
image.png
原理上是forEach里面加上一个BiConsumer接口,但是其实这就是一个函数接口,只有一个抽象方法,所以可以直接用lamba表达式来写!!!

HashMap实现类及其原理(很重要!!)

image.png
1、底层原理和之前讲到的hashset几乎一样,hashset就是基于hashmap实现的。
2、每个Node里包含Entry键值对,hashcode,和链表中后续对象的next
3、具体实现可以找找网上很多博客都有写,因为很重要!!后期可以自己看看源码!!

LinkedHashMap实现类

image.png

TreeMap实现类

image.png

不可变集合

image.png

泛型<>修饰

用泛型or修饰并不是固定某种类型,相反用泛型修饰其实是为了更具通用性!是可以传入任意类型的,在实际用的时候会把泛型变量的地方,全部替换成具体传进来的类型值!
1、泛型类,在定义类的同时,用泛型去修饰,把出现泛型变量的地方全部替换成传输的真实数据类型,比如ArrayList就是一个定义了泛型的实现类,里面对应的方法的参数,变量也都可以用泛型来修饰。
image.png
2、泛型方法,在定义方法的同时用泛型去修饰,把方法中出现泛型变量的地方全部替换成传输的真实数据类型。
3、泛型接口,让实现类在定义时就去传入某一具体的类型
image.png
4、泛型通配符(?)
在定义类的时候,虽然存在继承关系,但是在用泛型定义的对象上,却是没有关系的!
例如:BMW和BENZ类继承至Car,但是ArrayList和ArrayList和ArrayList一点关系也没有,BMW和BENZ类不能进到Car修饰的参数里。为解决这种问题,用泛型通配符?
image.png
image.png
一般在定义参数的时候,可以用通配符修饰

可变参数

1、类似于python中的那个kwarg和arg,JAVA中用...来表示,JAVA中可变参数本质上是一个数组
image.png

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
26天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
86 43
Java学习十六—掌握注解:让编程更简单
|
11天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
31 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
数据采集 数据可视化 大数据
大数据体系知识学习(三):数据清洗_箱线图的概念以及代码实现
这篇文章介绍了如何使用Python中的matplotlib和numpy库来创建箱线图,以检测和处理数据集中的异常值。
43 1
大数据体系知识学习(三):数据清洗_箱线图的概念以及代码实现
|
16天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
19天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
26天前
|
存储 SQL 分布式计算
大数据学习
【10月更文挑战第15天】
30 1
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
41 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
分布式计算 大数据 Linux
大数据体系知识学习(二):WordCount案例实现及错误总结
这篇文章介绍了如何使用PySpark进行WordCount操作,包括环境配置、代码实现、运行结果和遇到的错误。作者在运行过程中遇到了Py4JJavaError和JAVA_HOME未设置的问题,并通过导入findspark初始化和设置环境变量解决了这些问题。文章还讨论了groupByKey和reduceByKey的区别。
26 1
|
1月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
55 1