基础概念
Java:跨平台的语言(能运行在Windows,Mac OS,Linux等操作系统之上)
Write Once, Run Anywhere!
JVM:跨语言的平台(能为Java,Python,Kotlin等语言编译字节码)
JDK(Java Development Kit Java开发工具包):是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了 JRE。所以安装了JDK,就不用在单独安装JRE了。
JRE(Java Runtime Environment Java运行环境) 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等, 如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK = JRE + 开发工具集(例如Javac编译工具等)
JRE = JVM + Java SE标准类库
正数的原码、反码、补码都相同
负数的反码:是对原码按位取反(中间态)
负数的补码:其反码加1。计算机底层都是使用的数值的补码保存数据的。
“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
javadoc文档解析
javadoc -encoding UTF-8 -charset UTF-8 -d myhello -author -version HelloWorld.java
java入门问题1——javadoc解析时,cmd窗口报错:编码GBK的不可映射字符
问题1描述:在cmd中运行命令,javadoc -d myhello -author -version HelloJava.java 时,报错编码GBK的不可映射字符。
解决方法:经过网页查询,且前提为使用编码UTF-8(其他编码对应更改就可以),将cmd中的命令改为javadoc -encoding UTF-8 -charset UTF-8 -d myhello -author -version HelloJava.java
上述问题得到解决,但出现了新的问题。
问题2描述:javadoc错误-找不到可以文档化的公共或受保护的类。
解决方法:在源文件中的class前加入public后,可以成功运行。
数组
一维数组的声明方式: type var[] 或 type[] var;
java.util.Arrays常用工具类
boolean equals(int[] a,int[] b) 判断两个数组是否相等。
String toString(int[] a) 输出数组信息。
void fill(int[] a,int val) 将指定值填充到数组之中。
void sort(int[] a) 对数组进行排序。
int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。
int[] copyOfRange(int[] original, int from, int to)
选择排序 :
(直接)简单选择排序:
每次都从一组无序数组中选一个最小的,然后和第一个对调。
堆排序:
1)根据初始数组去构造初始堆
1.1)建初始堆的过程:先将一个无序数组按照从上到小,从左到右排列成完全二叉树。
然后再从最后一个非叶子结点开始,从右到左、从下到上调整为大顶堆。
2)交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下的元素调整为大顶堆,再交换第一个和最后一个元素,输出最后一个元素再调整剩下的元素为大顶堆,重复这个操作,直至整个数组排序完成。
交换排序 :
冒泡排序
比如说从小到大排序:依次比较相邻的两个元素,大的放右边。重复n-1轮
快速排序
一次划分的过程:有2个指针,low指针指向头元素,high指针指向尾元素,一般取第一个元素为界点(标准)元素,为了减少数据移动,将标准元素暂存在R[0]中(此时的low指针指向空)最后再放入最终位置。开始high指针从后往前移动,找比界点元素小的元素,放在low指针的位置(此时的high指针为空),然后low指针从前往后移动,找比界点元素大的元素,放在high指针的位置。重复上述的过程知道low指针和high指针位置重合,把界点元素放在该位置。
重复划分过程。
插入排序
直接插入排序
从一组无序数组的第2位开始,每次只和它前面的数进行比较,直接插入在正确的位置
Shell排序 (缩小增量排序)
比如有8个元素一组的无序数组,
第一趟(d=4):第5个位置元素和第1个位置元素比大小,小的话就交换位置(大的放后面),第6个位置元素和第2个位置元素比大小,第7个位置元素和第3个位置元素比大小,第8个位置元素和第4个位置元素比大小
第二趟(d=2):第4个位置元素和第2个位置元素比大小,小的话就交换位置(大的放后面),第6个位置元素和第4个位置元素比大小,第8个位置元素和第6个位置元素比大小,大的放后面
然后:第3个位置元素和第1个位置元素比大小,小的话就交换位置(大的放后面),第5个位置元素和第3个位置元素比大小,第7个位置元素和第5个位置元素比大小,大的放后面
第三趟(d=1):后一个位置和前一个位置元素比大小,小的话就交换位置(大的放后面)
折半插入排序
折半插入排序是对直接插入排序的一种改良方式,
二路归并排序
将一组无序数组,分为左右一半,不停的进行递归拆分,递归深度为log2n,直到分为单个元素不可再分为止
我们将单个元素进行排序合成一个有序序列
计数排序
一组有确定范围的无序数组,申请一个大小为arr.length+1长度的数组,下标从arr[0]~arr[length],默认初始化为0,开始计每一个数出现的次数,就在对应下标的数的位置填出现的次数,然后遍历输出这个数组。
桶式排序
是计数排序的升级版。原理是:假设输入的数据服从均匀分布,将数据分配到有限数量的桶中,再对每个桶分别进行排序。分配的原则是利用函数映射关系,整个算法的高效与否就在于这个映射函数的确定。
思路:
1、根据待排序集合中的数据,确定映射规则和桶的数量;
2、遍历待排序数组,将每一个元素根据映射规则,移动到对应的桶里;
3、对每一个桶中的元素进行排序
4、依次输出每个桶中的数据,得到整个有序集合
步骤:
1、找到待排序数组中的最大值amx,和最小值min
2、桶的数量为:(max-min)/ arr.length + 1,桶的下标是从0开始
3、映射函数的对映规则:也就是存放桶的下标=(arr[i] - min)/ arr.length
4、这时候,每个桶里的数据是无序,但是随着桶的下标递增,桶里的数据是递增
5、再对每个桶里的数据进行排序。桶内排序可以选择比较排序或者其他排序
6、遍历桶数组
基数排序
先把无序数组变成位数都一样,不足的高位补0,然后先按照低位排好序,再按照高位排好序,依次类推,直到最高位,最后遍历输出数组就行
十大排序算法的代码具体实现,详情见《数据结构》专栏
面向对象
重载(Overload)的概念
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。
重载的特点: 与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类 型)。调用时,根据方法参数列表的不同来区别。
Override重写(覆盖):
表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法(子类重写父类中的方法),是面向对象编程的中多态性的一种表现。
要求:
子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
子类不能重写父类中声明为private权限的方法
子类方法抛出的异常不能大于父类被重写方法的异常
注意: 子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为 static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法
overwrite重写:
java官方文档没有该词的出现,所以java中就没有它的存在,但是也有人把overwrite解释为override。
在**C++**中将Override和overwrite进行了区分。
Override(覆盖):
是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
Overwrite(重写):
是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
构造器的作用:
创建对象;
给对象进行初始化
总结:属性赋值过程
赋值的位置: ① 默认初始化 ② 显式初始化 ③ 构造器中初始化 ④ 通过“对象.属性“或“对象.方法”的方式赋值
赋值的先后顺序: ① - ② - ③ - ④
JavaBean
JavaBean是一种Java语言写成的可重用组件。
所谓JavaBean,是指符合如下标准的Java类:
类是公共的
有一个无参的公共的构造器
有属性,且有对应的get、set方法
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以 用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP 页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用 户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关 心任何改变。
package com.jerry.java; /** * @author jerry_jy * @create 2022-09-27 10:32 */ public class JavaBean {//类是公共的 private String name;//有属性,且有对应的get、set方法 private int age; public JavaBean(){//有一个无参的公共的构造器 } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。