1.JAVA中JVM(JAVA虚拟机)帮助内存管理,但仍存在内存溢出和内存泄漏
2.JAVA是一门半编译半解释型语言,第一个过程.java源码经过Java编译器编译后得到.class字节码文件,第二个过程字节码文件可能经过解释器逐行解释成机器码执行(半解释),也可以经过JIT编译器整个文件编译执行(半编译,JAVA高性能原因之一)
3.标识符规范:
- 包名:全为小写
- 类名,接口名:每个单词首字母大写
- 变量名,方法名:首个单词首字母小写,之后单词首字母大写
- 常量名:全部大写
4.变量
(1)基本数据类型:byte,short,int,long,float,double,char(2字节),boolean(4字节)
注:char型:可以表示字母,汉字等,Java中采用unicode编码,表示可以用unicode
char c='\uxxxx';或者ASCII码
在内存中,byte\short\char\boolean\int\float都占一个slot(槽位,JVM分配单位-四个字节),double\long占两个槽位
Java开发中计算金额时不使用float或double类型,而使用BigDecimal类替换,实现任意精度的数据运算
(2) 引用数据类型:类-class,数组-array,接口-interface,枚举-enum,注解-annotation,记录-record
(3)类型提升:容量大的数据类型和容量小的运算时(包括赋值运算),结果为容量大的类型(容量:数据类型表示范围)
注:byte/short/char之间的运算结果都提升为int型
(4)强制类型转换:容量大的数据类型向容量小的转换
5.基本数据类型和String类型运算
二者之间只能做连接运算:“+”,注意运算符顺序影响“+”是连接符还是加法符
6.运算符
特例:Java中i=i++的结果是确定的(c/c++中是不确定的)
- 首先运算i++,后增++先使用后自增
- 先使用代表传递给=的值为i初值,传递完值后i自增1
- 但i完成自增后赋值运算符运算还未结束,i的初值再次被赋值给i,则i保持不变
+=,-=,*=,/=,%=操作不会改变变量本身的数据类型
&与&&的区别:(|与||同理)
1)如果符号左边是true,两个都会执行右边
2)如果符号左边是false,则右边不会再执行
7.Scanner从键盘获取数据
- 导包 java.util..Scanner
- 创建一个Scanner实例
- 调用Scanner中对应数据类型的方法(.nextxxx),类中提供了byte,short,int,long,boolean,float,double,String类型的方法,而没有char型,需使用Scanner.next.charAt(0);
- 关闭资源,调用.close()方法
8.java中获取随机数
调用.lang包下的API:math类下的方法random();返回值是一个[0.0-1.0)范围的double类型随机数
获取范围[a,b]的随机整数:(int)(math.random()*(b-a+1)+a)
9.Switch结构
表达式中可以放置的数据类型:byte,short,char,int,枚举类型,String
相同的处理情况--利用case穿透,正三角形冗余处理考虑转换倒着处理(例如求某月某日是该年的第几天)
Switch-case结构都可以转换成if-else结构,均可使用时前者效率更高
10.Scanner类常用方法辨析
- next():读取输入缓冲区字符串标记,缓冲区中只存在空格或回车则阻塞等待输入,有效字符前的空格直接略过,读到空格,回车直接结束,且不读入空格与回车,返回类型String
- hasnext():判断缓冲区中是否有有效字符(不包括空格和回车),若无则阻塞等待输入,返回类型boolean
- nextline():读取输入缓冲区一行字符串,读取到回车时停止,且把回车读入,缓冲区中只有空格或回车都会直接读入不阻塞,若为空则阻塞等待输入,返回类型String
- hasnextline():判断缓冲区中是否有内容(包括空格和回车),若无则阻塞等待输入,返回类型boolean
11.一维数组
java中的一种容器(还有集合框架),属于引用数据类型,其中元素既可以是基本数据类型,也可以是引用数据类型
- 数组的声明和初始化:属于引用数据类型,使用new [常量]/{...}初始化
- .length表明数组的长度属性(不是length方法,string类中是方法)
- 数组元素的默认初始化值:整型-0,浮点型-0.0,字符型-0或\u0000,boolean型-false,引用数据类型-null
- 数组的索引从0开始,其表示数组元素距离首地址的偏移量
java中内存划分:程序计数器,虚拟机栈,本地方法栈,堆,方法区
与数组相关:虚拟机栈-存放数组声明,存堆中的地址,堆-存放数组实际数据
12.二维数组
java中二维数组的声明可以省略列数,会默认分配任意大小列
int [] [] arry=new int [2][];
arry[1]其中地址为null,arry[1][0]无法访问空地址指向的位置内容,报错
二维数组内存问题可参考c语言指针和数组的讲解:
C语言 指针重点 数组与指针 相关内容总结-CSDN博客
13.数组的常见算法操作
- 数值型数组的特征值:平均值,最大值等
- 数组的反转,回形数
- 数组的扩容和缩容
- 数组中元素的排序与查找
14.数组工具类
常用arrays:equals();Arrays.toString();fill();sort();binarysearch();
15.经典算法题
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。
public static int getGreatestSum(int[] arr){
int greatestSum = 0;
if(arr == null || arr.length == 0){
return 0;
}
int temp = greatestSum;
/*
从前往后遍历数组,易得和最大的子数组中包含的子数组必定为正值
(0值忽略不影响-这里不考虑元素个数最少)
则遍历过程中出现当前子数组和小于0时则复原重新统计-因为必须要求连续
保存遍历过程中所得的最大和
该循环可以解决至少有一个正值存在的数组情况
*/
for(int i = 0;i < arr.length;i++){
temp += arr[i];
if(temp < 0){
temp = 0;
}
if(temp > greatestSum){
greatestSum = temp;
}
}
/*
若数组中没有正数,则选择单值最大的数作为子数组最大和
*/
if(greatestSum == 0){
greatestSum = arr[0];
for(int i = 1;i < arr.length;i++){
if(greatestSum < arr[i]){
greatestSum = arr[i];
}
}
}
return greatestSum;
}
}