说是博文,就当学习日记好了。以学习JAVA语言为主,学习编程语言。
第一部分:
java语言特点:
面向对象: 基本概念:类,对象
三大特点:继承,封装,多态
健壮:
垃圾回收(在JVM空闲时,自动检测,并进行垃圾回收,此过程无需人工干预,但仍然存在内存泄露与溢出的情况。如对象垃圾回收由jvm控制,不由人控制)与舍弃指针
跨平台:
JAVA虚拟机–JVM:是java程序运行环境,JAVA运行在JVM上,JVM运行在操作系统上,由此java有强大的跨平台性。JVM是彻底实现JAVA语言一次编译,到处运行的虚拟机,不同操作系统有着不同的JVM。
java语言运行机制与过程:
用户->字节码文件->JVM->操作系统->硬件
jdk-----java开发工具包:
JDK=JRE(java运行环境)+开发工具(编译工具(java.exe);打包工具(jar.exe)等)
JRE =JVM(java虚拟机)+javase核心类库
java的运行过程:
编写好的java文件(源文件:.java)
-------------------(通过javac.exe进行编译)----------------->
字节码文件(.class文件)
------------------(通过java.exe运行)------------------------->
得出结果
在一个java文件中可以声明多个class,但只能最多有一个类声明为public,因为public只能加在与源文件名同名的类中。因此有几个类就有几个字节码文件
javaAPI(Application Programming Interface)文档:是java提供的基本编程接口;常用api(应用程序编程接口-好多类好多方法):键盘输入,随机数,ArrayList
程序=算法+数据结构
1995-1996年-jdk1.0发布
2004年-jdk1.5发布,并改名为jdk5.0
2005年 j2se->javase j2ee->javaee,j2me->javame
2014年 java8发布
2021年java17发布
path环境变量:Windows操作系统执行命令时所要搜寻的路径。希望java的开发工具(javac.exe;java.exe)在任何的文件路径下都可以执行成功所以才配置path
几个类特别关键字(被java语言赋予特殊含义,用作专门用途的字符串(特定单词)特定均为小写):
定义访问权限修饰符关键字:
private、protected、public
定义类、函数、变量修饰符的关键字:
abstract、final、static、synchronized
定义类与类之间的关键字:
extends、implements
用于定义建立实例及引用实例,判断实例的关键字:
new、this、super、instanceof
用于异常处理的关键字:
try、catch、finally、throw、throws
用于包的关键字:
package、import
其他修饰符关键字:
native、striclfp、transient、volatile、assert
用于定义数据类型值的字面值:
true、false、null
保留字(预备关键字):
goto、const
标识符—(自己起的名字)要求(英文字母,0-9数字,$和_;不能以数字开头;不能是关键字;类要双驼峰,变量和方法要单驼峰)
java的命名规范:
包:xxxyyyzzz
类、接口:XxxYyyZzz
变量、方法:xxxYyyZzz
常量:XXX_YYY_ZZZ
变量:承接参数的的量,java在使用变量时要求声明变量类型;变量有自己的作用域;同一作用域不能有重名变量。
强类型语言:使用变量时,要求声明变量类型;
弱类型语言:使用变量时,不要求声明变量类型。
数据类型分类:
java变量分为两类:基本数据类型;引用数据类型。
基本数类型{
数值型(byte,short,int,long,float,double)
字符类型(char)
布尔型(boolean)
}
引用类型:除基本类型外{字符串,数组,类,接口,lambda}
注:所有引用类型都可以赋值null,表示其中什么都没有;
数据类型的存储(数据范围与内存占用(字节数)无关):
位(bit最小底层单位):
一个数字0或者一个数字1,代表1位;
字节(Byte计算机最小存储单位):
8位即1字节,是数据存储最小单位;
1KB=1024Byte ;
1MB=1024KB ;
1GB=1024MB ;
1TB=1024GB ;
1PB=1024GB ;
1EB=1024PB ;
1ZB=1024EB;
1 byte(1字节) = 8 bite 范围(-128至+127)
1 short(2字节) 范围(-2^15 至+2^15-1)
1 int(4字节) 范围(-2^31 至+2^31-1)(约21亿)
1 long(8字节) 范围(-2^63 至+2^63-1)
1 float(4字节) 范围(-3.403E38至+3.403E38)
1 double(8字节) 范围(-1.798E308至+1.798E308)
1 char(2字节)
布尔 boolean(1字节)
出现乱码的原因是程序保存的字符集和程序执行的字符集不一致
整型常量默认为int类型
浮点型变量默认为double类型
基本数据类型转换(针对基本类型中除boolean的7中数据类型)
1.自动类型提升:
当容量小(表示数的范围的大和小)的数据类型变量和容量大的数据类型变量做运算时,结果自动提升为容量大的数据类型
byte 、char 、shot --> int --> long --> float --> double
特别的:当byte、short、char三种类型变量做运算时,结果用int接收;因为java在做运算时,若操作数均在int范围内那么均用int接收结果
2.强制类型转换:
自动提升运算的逆运算
1.需要使用强制类型转换操作符:()
2.注意:强制类型转换可能存在精度损失
3.String类型变量使用:
1.String为引用类型,称:字符串;
2.声明String类型变量是使用一对""
3.String可以和8种基本数据类型进行“+”号连接运算
4.String和8种数据类型运算后仍然是String类型
5.严格区分""和’'因为两个表示不一样,一个是字符串,一个是字符
4.进制:
2进制:0,1
8进制:以0开头
10进制:满10进1
十六进制:以0x或者0X开头,最大是F
5.关于码:
在进制中最高位表示符号位:0(正数);1(负数)
正数:
原码,补码和反码都一样
负数:
原码:{是正数情况下的原码}
反码:{按位取反,符号位不变}
补码{按位取反再加一,符号位不变}
在计算机的底层无论正负都以补码方式存储数据
+127:0111 1111
-127:1000 0001
-128:1000 0000
2进制转8进制:2进制中每3位是8进制中的1位
2进制转16进制:2进制中每4位是16进制中的1位
21.日常金典开始的代码:
public class HelloWorld {
public static void main(String[] args) {
//args==arguments:参数
System.out.println("Hello World!");
}
}
===========================================
第二部分:
运算符:
算数:
数学运算符,
取余,
自增(++前先加后用,++在后先用后加,--同;不改变变量自身类型),
从左向右遵守数学运算
赋值:=;+=;%=优点不改变变量的数据类型,从右向左
比较(关系):结果是boolean类型
逻辑:
&(且,交),|(或,并),!(非);
交见假则假,并见真则真;
操作的都是boolean类型变量
位:>>右移拿0或1补(每移动一位,相当于/2 ,同时注意正负号),
<<左移拿0补(每移动一位,相当于*2),>>>无符号右移拿0补,
^异或(通0异1),~取反(包括符号位在内),操作的都是整型数据
三元:
(条件表达式)?true(表达式1):false(表达式2);
用表达式1和表示2的统一类型接收结果,可以嵌套使用;
凡是可以使用三元运算符的地方均可以改为if..else;反之不成立。能用三元尽量用三元
三种流程控制结构:
顺序;
循环;循环四要素:初始化条件,循环条件,循环体,迭代条件;
分支;可以嵌套,但最多不过三层
针对与条件表达式:
A.若多个表达式之间是“互斥”关系,执行语句间没有先后关系;B.若多个表达式之间是交集关系,执行语句间有先后关系;C.若多个表达式之间是包含关系,执行语句间有先后关系;
if…else配对是就近原则配对
产生[a,b]间随机数:(int)(Math.random()*(b-a+1)+a)
字符串比较用equals
在switch…case中,找到合适匹配后会开始执行,也会执行后面case中语句,直到第一次遇到break或者运行到结构末尾才会终止执行程序
最后可以使用default作为结构尾巴不放于前面,这里面的语句是在前面语句没有执行情况下一定会执行的。switch表达式只能是如下6种:
byte,short,int,char,枚举(JDK5以后),String(JDK7以后),case中无范围,若多个case中的执行语句相同,则可以考虑合并,
switch…case效率比if…else稍高。一般if…else最多不超过3层
for中的i作用域和while中的i作用域不同,while(true)==for(;;),结束循环方式(法一:循环条件部分使用false,法二循环体中使用break)
continue:结束当次循环
对于一个程序的衡量:
正确性;可读性;健壮性;高效率低存储(时空复杂度,以时间复杂度为准);
单行注释:选中目标+ctrl+斜杠
多行注释:选中目标+ctrl+shift+斜杠
对应引用类型的变量,存的要么是null要么就是地址值;所有引用类型都可以赋值null,表示其中什么都没有;
一、数组:
1.将数据多个相同类型的数据按照一定顺序排列的集合,使用编号对数据进行统一管理
2.数组相关概念:数组名、元素,下标(索引),长度
3.数组特点:
数组是有序排列的
数组本身为引用数据类型,数组的元素既可以是引用类型也可以是基本数据类型
数组的物理存储空间是连续的
数组长度是固定的,一旦确定就不可修改
4.数组分类:维度分,元素数据类型分
5.一维数组使用:
声明与初始化;元素调用;获取数组长度;遍历数组;数组的内存解析
数组的默认初始值{元素:整型:0;浮点:0.0;char型:0或'\u000';boolean型:false;引用类型:null}
6.向方法传递数组参数,其实是传递数组的地址;方法返回数组,
也是返回数组的地址值
7.一个方法可以有0,1或者多个参数,但不能有多个返回值,
为了解决多个返回值的问题,可以采取返回一个数组
8.数组一旦创建,在程序运行期间其长度不可变;
打印数组时若打印无数组下标的数那么只打印数组首个元素的地址值,
不打印其内容。
内存解析:
内存结构规范由jvm体现,jvm随着jdk版本的不同而不同,因此规范也有变化
内存:
1、(虚拟机栈)栈(stack){
存放的都是方法中的局部变量,main方法中变量也是局部变量,方法在栈中运行;
局部变量:方法的参数或者是方法{}内部变量;
作用域:一旦超出作用域,立刻从栈内存档中消失
};
2、堆(heap){
new 出来的结构:对象实例、数组;凡是new出来的东西全在堆中。
堆内存里面的东西都有一个地址:16进制;
堆内存里面的东西都有一个默认值,规则:
类型--------->默认值
整数 0;
浮点 0.0;
字符 \u0000;
布尔 false;
引用 null
};
3、方法区(method area){
存储.class相关信息(被虚拟机加载的类信息);
包含方法信息;
常量池(常量)String;
静态域static(静态变量);
即时编译器编译后的代码等数据
};
4、本地方法栈(Native method stack){与操作系统相关,包含底层c/c++相关的库} ;
5、寄存器(pc Register){与CPU相关}
7.一维数组内存解析实例:
一维数组内存解析实例:{
int[] a=new int[]{1,2,3};
在此段程序执行时,首先局部变量a进栈,new出来的int型数组结构在堆中存储,且初始化为0,
在堆空间中此数组的首地址值(此地址不是真实地址,这地址是由java虚拟机经过hash算法算出来hash值,
屏蔽了底层真实地址,假设为0x6666)会赋值给栈空间中的a变量,
栈空间的变量a可以通过地址值(0x6666)找到堆空间中的数组,
然后再将数组元素赋值1,2,3;
String a1=new String[4];
a1[1]="张三";
a1[1]="赵六";
在此段程序执行时,首先局部变量a1进栈,
new出来的String型数组结构在堆中存储,且初始化为null,
在堆空间中此数组的首地址值(假设为0x8888)会赋值给栈空间中
的a1变量,栈空间的变量a1可以通过地址值(0x8888)
找到堆空间中的数组,然后通过数组脚标找到对应位置进行赋值
a1=new String[3];
在此段程序执行时,new出来的String型数组结构在堆中存储,
且初始化为null,在堆空间中此数组的首地址值(假设为0x868)
会赋值给栈空间中的a1变量(将a1中的0x888覆盖为0x868),
而原来的new String[4];由于没有了a1指针,变成了垃圾,
在以后某一个不确定时间内被JVM进行回收
}
二维数组内存解析实例:{
二维数组就是一个矩阵
int[][] arr1=new int[4][];
在此段程序执行时,首先局部变量arr1进栈,
new出来的int型数组的外层结构在堆中存储,
且初始化为null(因为外层结构中的元素是数组内层结构,
类型为数组是引用类型,引用类型初始化为null),
外层数组结构的首地址值(假设为0x1234)会赋值给先局部变量arr1
arr1[1]=new int[]{1,2,3};
new出来的int型数组的在堆中存储,且初始化为0,
在堆空间中此数组的首地址值(假设为0x7788)
会赋值给堆空间中arr1[1]处值为null的变量,
然后再将1,2,3赋值给int型数组
arr1[2]=new int[4];
new出来的int型数组的在堆中存储,且初始化为0,
在堆空间中此数组的首地址值(假设为0x3366)
会赋值给堆空间中arr1[2]处值为null的变量
arr1[2][1]=30;
对二维数组第2行第1列进行赋值,
即将上一步中初始化为0的变量赋值为30
}
1.数据与数据之间的逻辑关系:集合(弱关系)、一对一、一对多、多对多
2.数据的存储结构:
一对一:线性表{顺序表(数组),链表,栈(先进后出),队列(先进先出)}、
一对多:树形结构{二叉树},数据库中的索引采用的是B树,B+树
多对多:图形结构
常见算法{
排序算法;
搜索算法.
}
数组中常见算法:
数组元素赋值(杨辉三角,回形数);
求数值型数组中元素最值,平均值,总和等;
数组的复制、反转、查找(线性查找,二分查找);
数组元素的排序算法
在数组的复制中实例分析:
在数组的复制中实例分析一{
int[] array1,array2;
变量array1和array2进入栈空间
array1=new int[]{2,3,5,7,11,13,17,19};
new出来的int型数组在堆空间中产生有且仅有一个,同时将其地址给了array1,
因为整段代码只new了一次,所以自始至终只有一个数组
array2=array1;
array1将唯一堆内存中的唯一地址给array2,即array1和array2指向同一地址,这称为数组变量的赋值
for (int i = 0; i < array2.length; i++) {
if(i%2==0){
array2[i]=i;
}
}
通过array2把唯一数组中的值进行了修改,所以打印时array1和array2打印内容相同。
//真正的数组的复制
array2=new int[array1.length]//新实体化一个数组
for (int i = 0; i < array1.length; i++) {//将原有数组元素一一赋值于新数组中。
array2[i]=array1[i];
}
//修改array2中的偶数索引,使得其值等于索引值(如array[0]=0,array[1]=1)
for (int i = 0; i < array2.length; i++) {
if(i%2==0){
array2[i]=i;
}
}
}
在数组的复制中实例分析二(这是System类中内置的数组拷贝方法){
public static void arrayCopy(
Object src,
int srcPos,
Object dest,
int srcPos,int length
):
将数组中指定的数据类型拷贝到另外一个数组中,其中参数:
src:源数组
srcPos:源数组当中的起始值
dest:目标数组
destPos:目标数组中的起始位置
length:要复制的数组元素的数量
}
衡量算法的优劣:时空复杂度,常常以高效率低存储为最优标准在排序中多了一个稳定性的要求,稳定性{在一个数组中,若a和b值相等,在排序后a,b先后次序保持不变,则称此排序是稳定的}。内部排序:在内存总搞定;外部排序:需要借助外部存储设备。常见的排序有10种,常用快排{平均复杂度为nlog2(n)}
public static String toString(数组):将参数数组变成字符串(按照默认格式[元素1,元素2,元素3,...])
public static void sort(数组):按照默认升序(从小到大)堆数组元素进行排序
注:
1.若是数值,sort默认按照升序从小到大;若是字符串,sort默认按照字母升序;
2.若是自定义的类,那么这个自定义类需要有Comparable或者Comparator接口支持
数组中常见的异常:
1.数组脚标越界异常:
ArrayIndexOutOfBoundsException
2.空指针异常:
NullPointException{数组必须使用new初始化才能使用其中元素;
若数组只是赋值了一个null,没有进行new创建则发生空指针异常(NullPointerException);
空指针异常:
原因:无new;
解决:补new;
13.错误明细:
编译报错是语法错误,运行错误是逻辑错误
小思想:
对逻辑的刻画:
对逻辑的刻画不仅仅局限于任何一门编程语言或是任何一门计算机语言。在此讨论的是更为广泛的对逻辑的刻画:
逻辑=计算+选择
idea使用小技巧:
ctrl+n{查找接口源码}
在接口源码中ctrl+h{查找接口实现类}
ctrl+q查看重载构造器
自动生成测试在接口处+ctrl+shift+t
try…catch快捷键ctrl+alt+t``
以上是本篇小节,不喜勿喷,感谢理解。
相关链接:
【JAVASE(2)】JAVASE学习–面向对象篇(1)