JAVA基础-语法概念等总结

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从键盘获取数据

  1. 导包 java.util..Scanner
  2. 创建一个Scanner实例
  3. 调用Scanner中对应数据类型的方法(.nextxxx),类中提供了byte,short,int,long,boolean,float,double,String类型的方法,而没有char型,需使用Scanner.next.charAt(0);
  4. 关闭资源,调用.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类常用方法辨析

  1. next():读取输入缓冲区字符串标记,缓冲区中只存在空格或回车则阻塞等待输入,有效字符前的空格直接略过,读到空格,回车直接结束,且不读入空格与回车,返回类型String
  2. hasnext():判断缓冲区中是否有有效字符(不包括空格和回车),若无则阻塞等待输入,返回类型boolean
  3. nextline():读取输入缓冲区一行字符串,读取到回车时停止,且把回车读入,缓冲区中只有空格或回车都会直接读入不阻塞,若为空则阻塞等待输入,返回类型String
  4. 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.数组的常见算法操作

  1. 数值型数组的特征值:平均值,最大值等
  2. 数组的反转,回形数
  3. 数组的扩容和缩容
  4. 数组中元素的排序与查找

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;
	}
}

你可能感兴趣的:(java,开发语言)