最新基础 java编程

1、前言

计算机编程语言有很多种,有的编程语言适用于科学计算、有的适合做网络安全、有的适合做大数据分析、有的适合嵌入式开发等,需求决定技术选型,离开现实世界实际需求,技术将毫无价值。编程语言无好坏,只有将它运用在合适的场景中,才能发挥其最大作用。

经过多年发展,Java成为当今世界最流行的编程语言,接下来便开始Java语言的学习。在正式开始学习Java之前,首先需要了解下编程基础,计算机内部相关工作原理。

2、编程基础

操作系统给了程序一个错觉,那就是让程序觉得计算机所有资源都归它用,实际上,操作系统将时间切片,将每个程序放在对应的空间里面执行,这个空间就是内存,比如:

  1. 显示图片。实际上是计算机从磁盘中读取图片至内存中,然后将内存中的数据显示在屏幕上;

  2. 播放本地视频。同样是加载文件至内存,调用视频播放器读取内存中数据;

  3. 聊天。从键盘接收聊天数据,放入内存,传给网卡,通过网络传给另一个人的网卡,再从网卡传到内存,显示在显示器上。

编程可以说基本上就是在内存中对数据进行相关操作,那么如何表示和操作数据呢?

数据在计算机内部都是二进制表示,不方便操作,为了方便操作数据,高级语言引入了数据类型和变量的概念。,数据对于编程来说是基础,同时也是至关重要的,那么在Java中有哪些基础数据类型呢?

2.1 数据类型和变量

数据类型用于数据归类,以便于理解和操作,对于Java语言来说,有如下基本数据类型:

  • 整数型:如byte,short,int,long,分别有不同的取值范围
  • 小数型:如float,double,分别有不同的取值范围和精度
  • 字符型:如char,表示单个字符
  • 真假类型:boolean,表示真假

基本数据类型都有对应的数组类型,数组表示固定长度的同种数据类型的多条记录,这些数据在内存中连续存放

Java是面向对象的语言,除了基本数据类型,其他都是对象类型。对象到底是什么呢?简单地说,对象是由基本数据类型、数组和其他对象组合而成的一个东西,以方便对其整体进行操作。比如,一个学生对象,可以由如下信息组成:

  • 姓名:一个字符数组
  • 年龄:一个整数
  • 性别:一个字符
  • 入学分数:一个小数

世界万物都是由元素周期表的基本元素组成,基本数据类型相当于基本元素,而对象相当于是世界万物。

为了操作数据,需要把数据存放到内存中。所谓内存在程序看来就是一块有地址编号的连续的空间,数据放到内存中的某个位置后,为了方便地找到和操作这个数据,需要给这个位置起一个名字。编程语言通过变量这个概念来表示这个过程。

声明一个变量,比如,int tmp,其实就是在内存中分配了一块空间,这块空间存放int数据类型,tmp指向这块内存空间所在的位置,对temp的操作实质上是对该内存空间的操作,如tmp=5,便是给该内存空间的值置为5。变量表示的是内存中的位置,这个位置存放的值是可以变化的。

虽然变量的值可以变化的,但变量的名字是不变的,这个名字代表这块空间的意义。

变量是给数据起名字,方便找不同的数据,它的值可以变,但含义不应变

比如一个协议,可以有以下几个部分组成:

  • first_party:含义是甲方
  • second_party:含义是乙方
  • contract_content:含义是协议内容
  • sign_date:含义是签署日期

变量的含义是确定的,但对于不同的协议,可以有不同的值。

通过声明变量,每个变量赋予一个数据类型和一个有意义的名字,我们便告诉了计算机要操作的数据。有了数据,接下来便要对数据进行基本的操作----赋值。

2.2 赋值

在声明变量之后,便在内存分配了一块位置,这个位置存储的内容是未知的,赋值就是给这块位置确定一个值。在Java语言中,对于基本数据类型的赋值有明显不同。

2.2.1 基本类型

  1. 整数类型整数类型有byte、short、int和long,分别在内存中占1,2,4,8个字节,取值范围如下:
  2. 类型名取值范围类型名取值范围
    byte-2^7~2^(7-1)int-2^31~2^(31-1)
    short-2^15~2^(15-1)long-2^63~2^(63-1)

    对于整数类型的赋值的形式很简单,将数字赋给声明好的变量即可:

    byte a = 23; short b = 24;     int c = 25; long d = 26;

    但是,在给long类型赋值时,如果常量超过了int取值范围,则需在常量后面加字母L或l,如:

    long x = 9234567891L;

    小数类型

小数类型有float和double,占用的内存空间分别是4和8个字节,有不同的取值范围和精度:

类型名取值范围
float1.4E-45~3.4E+38
double4.9E-324~1.7E+308
-1.7E+308~-4.9E-324

对于double,直接赋值即可:

double d = 3.14159 

 对于float,需要在数字后面加大写字母F或小写字母f:

float f = 31.4f;

这是由于小数常量默认是double类型。除了小数,也可以把整数直接赋值给float或double,如:

float f = 33; double d = 123456L 

3.真假类型

直接使用true或false赋值,分别表示真和假,如:

boolean a = true;
a = false;

4.字符类型

字符类型char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符,char在内存空间中占用2个字节。赋值时,把字符用单引号括起来,不要使用双引号,如:

char c = 'A'; char z = '黄';

2.2.2 数组类型

基本类型的数组有3种赋值形式,如:

int[] arr = {1, 2, 3}; int[] arr = newint[]{1, 2, 3}; int[] arr = newint[3]; arr[0]=1; arr[1]=2; arr[2]=3;

在第3种形式中,即使没有给每个元素赋值,每个元素也都有一个默认值,这个默认值跟数组类型有关,数值类型的值为0,boolean为false,char为空字符。

数组长度可以动态确定,但确定之后便不可改变。数组有一个length属性,该属性为只读,不能写(改)。

不能在给定初始值的同时给定长度,即如下格式是不允许的

int[] arr = newint[3]{1, 2, 3};

 

在给数组赋初值时,已经决定了长度,再给个长度,如果不一致,计算机将无所适从,即会出错。

2.3 基本运算

在给变量赋初值之后,便可以对数据进行运算,运算有不同类型,不同数据类型支持的运算也不一样,主要有4种:

  1. 算术运算:常见的加减乘除
  2. 比较运算:数值大小比较
  3. 逻辑运算:布尔值运算
  4. 条件运算:条件的判断

2.3.1 算术运算

1.加、减、乘、除

运算符运算范例结果
+正号+33
-负号b=4;-b;-4
+5+510
-6-42
*3*412
/除(即算数中整除的结果)7/51
%取模(即算术中的求余数)7%52

2.自增/自减

运算符运算范例结果
++自增(前)a=2;b=++a;a=3;b=3;
++自增(后)a=2;b=a++;a=3;b=2;
--自减(前)a=2;b=--a;a=1;b=1;
--自减(后)a=2;b=a--;a=1;b=2;

2.3.2 比较运算

运算符运算范例结果
==相等于4 == 3false
!=不等于4 != 3true
<小于4 < 3false
>大于4 > 3true
<=小于等于4 <= 3false
>=大于等于4 >= 3true

2.3.3 逻辑运算

运算符运算范例结果
&a & ba和b都为true,结果为true,否则为false
|a | ba和b中只要有一个为true,则结果为true,否则为false
^异或A ^ ba与b不同,结果为true,否则为false
!! A若a为false,结果为true,否则相反
&&短路与a && ba和b都为true,结果为true,否则为false
||短路或a || ba和b中只要有一个为true,则结果为true,否则为false

2.3.4 条件运算

也称作三元运算符(或三目运算符),由符号? :组合构成。 对布尔类型的表达式判断,如果为true,就执行冒号“:”前面的表达式,否者执行后面的表达式。

条件运算符的语法格式:

(boolean_expr) ? true_statement : false_statement;

规则:先判断boolean_expr的值,如果为true,就执行表达式true_statement,否者执行表达式false_statement。

条件运算符的使用示例:·

int store = 5;
System.out.println(store <=0 ? "没有库存啦!" : "库存量为:" + store); // 输出结果为 “库存量为:5” 

3、程序设计三大结构

对于任何编程语言来说,程序设计主要由三大结构组成:顺序结构,选择结构,循环结构。再复杂的程序,都可通过这3种结构组合而成。

3.1 顺序结构

程序是自上至下按照顺序执行,这同写作文是一样的,这给程序的阅读者提供了便利,使代码更具有阅读性,为后续的代码维护提供了良好支持。对于任何编程语言,程序的执行都有一个入口,对于C语言,程序的入口是主函数,对于Java,程序同样有入口,可以是静态方法,也可以是静态主方法等。代码从程序入口位置从上往下依次执行,遇到条件判断,则会根据是否条件来执行程序,也就是说程序需要流程控制,这就是我们接下来需要讲到的条件执行,也就是选择结构。

3.2 选择结构

流程控制中最基本的是条件执行,一些操作只能在某些条件被满足的前提下才执行,这与红绿灯的原理是一样的。在实际生活中经常需要作出一些判断,比如开车来到一个十字路口,这时需要对红绿灯进行判断,如果前面是红灯,就停车等候,如果是绿灯,就通行。Java中有一种特殊的语句叫做选择结构语句,它也需要对一些条件作出判断,从而决定执行哪一段代码。

  1. if条件语句
  • if语句是指如果满足某种条件,就进行某种处理。
  • if…else语句是指如果满足某种条件,就进行某种处理,否则就进行另一种处理。
  • if…else if…else语句用于对多个条件进行分支判断,从而进行多种不同的处理。
  1. switch条件语句

定义:switch 条件语句也是一种很常用的选择结构语句,它由一个switch控制表达式和多个case关键字组成。 说明:与if条件语句不同的是,switch 条件语句的控制表达式结果类型只能是byte、short、char、int、enum枚举以及String类型,而不能是boolean类型。

语法格式:

                  执行语句1 break; case 目标值2:
                                  执行语句2                                   break;
            ... case 目标值n:
                                  执行语句n
                                  break; default:
                               执行语句n+1                                   break;
    }

在使用switch条件语句时,需要特别注意:第一,switch条件语句后{}中的多个case以及default标签顺序可以随机,并不影响程序的执行结果;第二,在case和default标签中的执行语句后务必都加上break关键字,用于执行完语句后跳出当前的switch条件语句,否则,程序会接着执行后续的执行语句,直到遇到break关键字或switch语句末尾为止。

3.3 循环结构

计算机最擅长的事情便是多次重复执行,这个操作一般不是完全一样的操作,而是类似的操作,比如:

a) 手机相册,当点开手机相册时,会自动按照时间或者自定义的类别展示所有照片;

b) 播放音乐,无论我们是点击顺序播放还是随机播放音乐,背后的原理都是按照用户自定义的形式循环播放音乐;

c) 查看朋友圈,查看微信朋友圈时,会自动按照时间降序的方式展示所有动态,无论朋友圈内容是什么,对于程序而言,它们只是一条数据,加上页面的美化,将原本消息以更优雅的方式展示在用户手机上。

计算机程序运行时大致只能顺序执行、选择执行和循环执行,顺序执行和选择执行其实没有特别亮眼的地方,而循环才是程序强大的地方。凭借循环,计算机能够非常高效地完成人很难或无法完成的事情。

  1. while循环

定义:while循环语句和选择结构语句有些相似,都是根据条件判断来决定是否执行大括号{}内的执行语句。 区别:while语句会循环判断循环条件是否成立,只要条件成立,{}内的执行语句就会执行,直到循环条件不成立,while循环才结束。

语法格式:

while(循环条件){
         执行语句
         ...
    }
  1. do...while

定义:do…while循环语句也被称为后测试循环语句,它和while循环语句的功能类似。 区别:while是先判断条件后执行循环体,而do...while会无条件执行一次循环体后再判断条件。

语法格式

do {
        执行语句
        ...
      } while(循环条件);
  1. for

    for循环语句是最常用的循环语句,一般用在循环次数已知的情况下,通常情况下可以代替while循环。

for循环语句的基本语法格式:

for(初始化表达式; 循环条件; 操作表达式){
           执行语句
           ...
    }
  1. 循环嵌套

定义:嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。 说明:while、do…while、for循环语句都可以进行循环嵌套,并且它们之间也可以互相嵌套。在实际开发时,我们最常用的是for循环嵌套。

双层for循环的语法格式:

for(初始化表达式; 循环条件; 操作表达式) {
         ... for(初始化表达式; 循环条件; 操作表达式) {
              执行语句
              ...
         }
         ...
    }

规则:在双层for循环嵌套中,外层循环每执行一轮,都要执行完内层循环中的整个for循环,然后执行外层循环第二轮,接着再执行完内层循环中的整个for循环,以此类推,直至外层循环的循环条件不成立,才会跳出整个嵌套for循环。

  1. 跳转语句

定义:跳转语句用于实现循环语句执行过程中程序流程的跳转。 分类:在Java中的跳转语句有break语句和continue语句。

5.1 break语句

使用场景:在switch条件语句和循环结构语句中都可以使用break语句。 作用效果:当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构;当它出现在循环结构语句中时,作用是跳出当前循环结构语句,执行后面的代码。

5.2 continue语句

使用场景:continue语句用在循环语句中。 作用效果:它的作用是终止本次循环,执行下一次循环。

小结: 虽然循环看起来只是重复执行一些类似的操作,但它其实是计算机程序解决问题的一种基本思维方式,凭借循环,计算机程序可以发挥出强大的威力,如数据批量处理、查找过滤数据、统计汇总等。


4、函数

如果需要经常做某种操作,则类似的代码需要重复写很多遍,比如找出数组中最小的数、找出名字以H开头的所有人等,这种操作避免不了重复的读取和比较数据。计算机程序使用函数来解决这个问题,使用函数可减少重复代码和分解复杂操作。接下来,我们便对函数进行相关探讨。

4.1 函数的基本概念

在中学时,一定接触到了函数的概念,比如一次函数

对于任何给定的x必然有对应的输出y的值,也就是说给定输入,经过一定的运算处理得到了输出。程序中的函数与数学中的函数是类似的,函数由输入、操作、输出组成,代码如下:

public static int sum(int a){ int result = 3 * a + 1; return result;
}

上面一段代码就是对上述提到的一次函数的程序实现,其中输入是a,经过相关计算得到的值,赋给了变量result,并将其作为函数的结果返回,函数名为sum,最前面的public static是修饰符,后面会进行详细介绍。

函数的基本语法结构如下:

修饰符 返回值类型 函数名(参数类型 参数名...){
    操作
    return 返回值;
}

定义函数就是定义了一段由明确功能的子程序,但定义函数本身不会执行任何代码,需要被调用才能突出其作用。

在Java中,任何函数都需要放在一个类中,目前来说并没有讲解类,暂且可将类当作函数的容器,即函数放在类中,类中包含多个函数,Java中的函数一般叫做方法,对此不区分函数和方法,它们存在的意义是一样的。一个类中可以定义多个函数,类里面可以定义一个叫做main的函数,形式如下:

public static void main(String[] agrs){
      ...
}

这个函数有特殊的含义,表示程序的入口,String[] args表示从控制台接收到的参数。Java中运行一个程序的时候,需要指定一个定义了main函数的类,Java会寻找main函数,并从main函数开始执行。main函数中除了可以定义变量,操作数据,还可以在里面调用其它函数。

4.2 进一步理解函数

函数的定义和基本调用应该是比较容易理解的,但在编写或调用函数时,还包括参数传递、返回、函数命名,调用过程等。

1.参数传递

有两种特殊类型的参数:数组和可变长度的参数。

(1)数组

数组作为参数与基本类型是不一样的,基本类型不会对调用者中的变量造成任何影响,但数组不是,在函数内修改数组中的元素会修改调用者中的数组内容。

public static void reset(int[] arr){ for(int i = 0; i < arr.length: i++){
    arr[i] = i;
  }
} public static void main(String[] args){ int[] arr ={1, 2, 3, 4};
  reset(arr); for(int i = 0; i < arr.length; i++){
    System.out.println(arr[i]);
  }
}

(2) 可变长度的参数

有时候可能希望参数个数不是固定的,比如求若干个数的最大值,比如3个数中的最大值,也可能是10个数中的最大值。Java支持可变长度的参数,如下所示:

public static int max(int min, int ... a){ int max = min; for(int i = 0; i < a.length: i++){ if(max < a[i]){
        max = a[i];
    }
  } return max;
} public static void main(String[] args){
  System.out.println(max(0));
  System.out.println(max(0, 1));
  System.out.println(max(0, 1, 2));
  System.out.println(max(0, 2, 4, 6));
}

函数**max()**接收一个最小值,以及可变长度的若干参数,返回其中最大值。可变长度参数的语法是在数据类型后门加上三个点“...”,在函数内,可变长度参数可以看作是数组。

可变长度参数实际上会转换为数组参数,也就是说,函数声明max(int min, int ...a)实际上会转换为max(int min, int[] a),在主函数调用max(0,2,4,6)的时候,实际上会转换调用max(0, int[] {2,4,6})

2.函数返回

当函数返回值类型为void时,return不是必需的,在没有return的情况下,会执行到函数结尾自动返回。函数返回值类型为void时也可以使用return,即return;

函数的返回值最多只能有一个,如果需要返回多个值时,可以将结构放入数组中作为返回值,在函数内创建一个包含三个元素的数组,然后将前三个结果赋给对应的数组元素。

3.重复的命名

每个函数都有一个名字,函数名的含义一般代表函数的功能,在同一个类中,函数可以重名,但是参数个数不能完全一样,或者参数类型不能完全一样。这种在同一个类中出现多个相同函数名,但参数个数不一样或者参数类型不一样的现象时,一般称为函数的重载。

/**
 *    两个数求和
**/ public static int add(int i, int j){ return i + j;
} /**
 *    三个数求和
**/ public static int add(int i, int j, int k){ return i + j + k;
} /**
 *    三个小数求和
**/ public static float add(float i, float j, float k){ return i + j + k;
}

上面三个函数的功能都是求和,名字相同,但得到的结果却是不一样的。

4.递归函数

在大多数情况下,函数都是被另外的函数调用的,但函数其实可以调用自身,这种调用自身的函数,我们称之为递归函数。在中学时期,学习排列组合的时候肯定接触过一个概念,那就是求某个数的阶乘:

,,

现在我们将上述公式写成代码:

public static long fib(int n){ if( n == 0){ return1;
  } return n * fib(n-1);
}

通过函数来减少重复的代码量、将复杂的程序分解成不同的功能模块以函数的形式呈现,这是计算机程序的一种重要思维方式。

最后:
最近有一些小伙伴粉丝让我帮忙找一些 面试题 资料。为帮助开发者们提升面试技能、有机会入职BATJ等大厂公司,于是我翻遍了收藏的 5T 资料后特别制作了一个专辑一次整体放出。
说明一下:所有的面试题目都不是一成不变的,特别是像一线大厂,下面的面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。大致内容包括了: 各类大小厂面经真题、Java 集合、JVM、多线程、并发编程、设计模式、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、spring面试题、spring cloud面试题、spring boot面试题、spring教程  笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册一共整理了1184页PDF文档。
 如需获取——点赞关注后私信(555)即可

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值