• 大数据学习笔记——Java篇之基础知识


    Java / 计算机基础知识整理

    在进行知识梳理同时也是个人的第一篇技术博客之前,首先祝贺一下,经历了一年左右的学习,从完完全全的计算机小白,现在终于可以做一些产出了!可以说也是颇为感慨,个人认为,学习本身就应该是有方法论的,前人总结了不少比较好的学习方法(比如说费曼学习法,金字塔原理),我们在进行好方法借鉴的同时,也不要忘了让整个学习过程形成一个闭环,我认为,向他人教学,或是定期将已有的知识进行一些梳理,总结,就是闭环的一种,这种方式在向他人传授知识的同时,更是对自己已有知识体系的一次查漏补缺。好了,废话不多说了,开始我们的行程了吧,第一次以这种方式进行分享,势必还有很多不够完善之处,我自己也会坚持博客的撰写,希望能够越写越好,技术进步的同时,也锻炼自己的文笔!(仪式感还是需要滴)

    实际上,对于大数据技术本人已有一些应用场景了,特此开了自己的博客,将以往的知识点进行梳理:

        

    1. Java发展历史及其语言概述

    1946年2月,美国数学家冯 诺伊曼研发出了世界上第一台计算机,ENIAC,而这也标志着人类科技发展史上的一座伟大里程碑。不同于自然语言,计算机并听不懂人类所说的话,因此,计算机语言诞生了,计算机语言的发展史经历了机器码到汇编语言再到高级语言三个阶段,第一代的机器码完全就是01代码,而汇编语言则出现了一些简单的英文单词,第三代的高级语言更接近于人类语言,因此容易理解、记忆,Java就是其中一种高级语言。

    1995年,SUN(Stanford University Network)公司推出了java这门高级语言,它并不是一开始就是非常热门的,直到Web端,当其他语言都只能做出静态页面的效果时,唯独java可以做出动态效果,从此,java大放异彩。

    2009年,业界的科技巨头甲骨文(Oracle)以74亿美元收购了SUN公司,当然也包括java。

    目前,java已成为Web应用程序的首选开发程序,同时也是Hadoop等大数据开源框架的首选开发语言,具有面向对象,完全可靠以及与平台无关等的特点

    既然说到了Web,那就有必要提一提何为B/S,B/S是browser/server的缩写,简单理解就是用户在客户机上安装一个浏览器,在浏览器中输入网址,就连接到了服务器上,也就是数据库了,这样的架构好处在于,用户发送请求给服务器,绝大部分的业务逻辑放在了服务器端实现,而只有极少一部分逻辑放在前端实现,这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量。

    Java语言的三种技术架构:

    1. Java EE(Enterprise Edition):是为企业环境下应用程序的解决方案,主要针对web应用程序开发

    2. Java SE(Standard Edition):是为开发普通桌面和商业应用程序提供的解决方案,可完成桌面应用程序的开发

    3. Java ME(Micro Edition):为开发电子消费产品和嵌入式设备提供的解决方案,是安卓(Android)的前身

    java 5.0(也可以称之为jdk1.5)之前,旧称为J2EE,J2SE,J2ME

    java语言的跨平台性:

    JVM : java virtual machine, java虚拟机,可以在不同的操作系统上运行

    明确JDK和JRE分别是什么:

    jdk: java development kit

    jre: java runtime environment

    jre包含于jdk,jdk包含了java运行环境以及java开发工具,如果是客户端仅仅需要运行一个java程序,那jre足够了,而对于开发人员来说,既需要开发又需要运行,那么光有jre就不行了,必须要有jdk,其中开发工具指的是javac.exe以及jar.exe等

    2. Java软件包详解

    a. bin: binary,java的二进制文件,在windows中就是指可执行文件,往往以.exe结尾,在之后的学习中一直需要用到的配置环境变量都会接触到这个文件夹

    这里稍微提一下dll文件,可以发现也出现在了JAVA_HOMEin目录下,dll指的是本身并不能单独执行,跟API类似,必须要被其他程序所调用才能执行

    b. db: 软件自带的一些重要数据加密

    c. include: 这个文件夹通常是指用C语言写的一些头文件

    d. jre: java runtime environment,是jdk自带的运行环境

    e. lib: 第三方的API库,此文件夹也会在之后的学习中经常遇到,(编程遇到的坑之一:出现报错时需要考虑是否是因为没有导第三方jar包)

    f. src.zip: 包含所有java的源代码

    3. 计算机中负数的表示形式及规律

    在复习这个话题前,先介绍以下几个概念:

    符号位:存储空间的第一个bit

    数值位:存储空间除符号位以外的其他位

    负数的原码:把对应的正数的符号位变为1,而其他位不变,举例:求-10的原码,先求的-10对应的正数的二进制表示形式为0000 1010,则其负数的原码就为1000 1010

    负数的反码:在原码的基础上,数值全部取反,即为1111 0101

    负数的补码:在反码基础上再加上1,即为1111 0110

    规律总结:求一个负数的二进制位的简便方法,先写出这个负数对应正数的二进制位,然后从右往左,遇到第一个不是0的把它的右侧全部保留,而左侧全部取反

    byte类型所能表示的十进制数的范围推导:

    1. 求出byte中的最大正数:0111 1111,转换为十进制数为127

    2. 使用上述总结的规律求出-127的二进制数为:1000 0001

    3. 将这个数再减一,即可得到负数的最小值为1000 0000,十进制数则为-127-1 = -128

    4. 值得注意的是,将127的二进制数加上一也能变成1000 0000,因此可得,在计算机中127 + 1 = -128

    4. 位运算符 以及 或与非运算符

    位运算符分为两种,左移以及右移,计算原理如下图所示,以左移7为例:计算  7 << 2 : 

     将7的二进制形式左移两位,那么最左侧的两个0就被移了出去,而最右侧用0填充,这样一来,每一个数现在都变成了原来的2^2倍,因此7 <<  2 = 7 * 2 ^ 2 => m << n = m * 2 ^ n

    但是,右移的情况则有所不同,由于被移出的是最右侧的数字,那就会涉及到一个问题,左侧的符号位应该一律使用0来填充,还是用原来的符号位填充,于是引出了个概念,即有符号右移及无符号右移,有符号右移,>>,无论移动多少位,空缺的位永远用符号位进行填充,而无符号右移,>>>,则是将空缺的位一律使用0来填充

    对于正数来说,有符号右移和无符号右移应该是完全一样的,因为不管哪种情况,都会使用0来填充,但是对于负数,则不一样了,如果是有符号右移,移动后仍然为负数,而如果是无符号右移,因为使用0来填充,因此负数会被移动成正数,典型例子,-1有符号右移无论多少位都是-1不变,而无符号右移则会变成整数的最大值 Integer.MAX_VALUE

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    按位与运算符 / 按位或运算符 / 按位取反运算符 / 异或运算符  (& / | / ^ / ~)

    不同于逻辑的或与非运算符,按位的操作是将两个二进制数的每一位取出来各自进行或与非操作,得到的新值则为操作结果

     异或操作有一个特性,那就是将将一个数与另一个数异或两次,最终得到的还是原来的数,使用这个原理可以用来做简单加密,代码如下

    public class BitDemo{
        public static void main(String[] args){
            //对数据简单加密
            int x = 9527;
            int key = 123;
            x = x ^ key;
            System.out.println(x);
            //
            System.out.println(x ^ key);
        }
    }

     交换两个数的三种实现方式:

    public class Exchange {
        public static void Exchange(int a, int b){
            //普通方式交换两个数
            int temp = a;
            b = a;
            a = temp;
            //不使用第三方变量
            a = a + b;
            b = a - b;
            a = a - b;
            //使用异或
            a = a ^ b;
            b = a ^ b;
            a = a ^ b;
        }
    }

     5. Java中方法调用过程详解:

     6. Java中创建对象时的内存图详解:

     1. 程序运行时,首先将本例中出现的两个类LaptopDemo以及Laptop的已经编译好了的class文件加载进方法区,其中Laptop.class有brand,price以及size三个成员变量,以及playMusic和playMovie两个成员方法,而LaptopDemo由于主要功能是测试类,无成员变量,只有一个成员方法main方法

    2. 程序调用main函数时首先压入栈中

    3. 执行语句Laptop laptop = new Laptop();时,由于赋值语句是从右往左执行的,因此首先在堆中新开辟了一片内存区域,该内存区域中有三个成员变量,它们都赋上了默认值,以及成员方法在堆中的一个内存地址值,然后程序查看在Laptop类中有没有显示的赋值,在此例中,成员变量brand被赋上了2000的值,然后进行构造方法的初始化,如果不是空参构造,将再次对成员变量进行赋值,最后这个内存空间也有一个内存地址值,这个值保存在了栈中,并赋给了变量laptop

    4. 执行laptop.brand = "DELL"等三句语句时,在堆中已有的三个成员变量的值再次发生了改变,并在之后的打印语句中被打印了出来

    5. 执行语句laptop.playMusic()以及laptop.playMovie()方法时,程序先在堆中找到方法区方法的地址值,再根据地址值找到方法区的方法,然后调用该方法压入栈中,当方法结束后,所有局部变量立即释放,然后弹栈

    6. 执行语句Laptop book2 = new Laptop();时,堆中又新开辟了一块区域并将成员变量赋上了默认值,后续的流程则与之前相同

    7. main函数中所有的语句执行完毕后,main方法弹栈,所有程序宣告执行完毕

  • 相关阅读:
    android自定义Dialog
    go笔记-内存回收分析、内存统计信息字段释义
    go笔记-defer以及性能
    go笔记-goroutine和panic
    并发编程-高性能IO-reactor模式
    go笔记-查看coredump:delve调试工具
    IO多路复用[转]
    kubernates 1.20.6安装
    JavaScript 数组元素的一些操作
    如何理解 Java 多线程
  • 原文地址:https://www.cnblogs.com/w950219/p/11675084.html
Copyright © 2020-2023  润新知