目录
java术语
JDK
Javac
Java
Jdb
Jhat
JVM
JRE
JAR
JDK下载
运行java文件
字面量
隐式转换
强制转换
注意
运算符
&&、||、&、|
Switch
程序入口
String[] args
数组
静态初始化
动态初始化
变量初始化
Java内存
方法
重载
Final
包
String
StringBuilder
常用方法
StringJoiner
常用方法
字符串拼接底层原理
ArrayList
常用方法
java术语
JDK
Java Development Kit,是Java开发工具包的意思。它包含了Java开发所需要的各种工具和类库,包括JVM、核心类库、开发工具(java、javac、jdb、jhat)。JDK是Java开发的基础,Java开发者需要安装JDK才能进行Java程序的开发和运行。
下面是JDK中开发工具
Javac
Java 编译器的命令行工具,用于将Java代码编译成Java字节码。它是 JDK的一部分,可以在命令行中使用。使用 "javac" 命令可以将Java源代码文件(.java)编译成 Java 字节码文件(.class),以便在 Java 虚拟机(JVM)上运行。
Java
相当于java的虚拟机,通过java Main命令行可以运行通过javac编译好的Main.class文件。
Jdb
调试工具。
Jhat
内存分析工具。
JVM
java Virtual Machine,Java虚拟机用于运行字节码。
JRE
java runtime environment,java运行环境,用于运行编译好后的java文件,包括JVM,核心类库,运行工具等,去掉了运行工具中的编译器等。
JAR
Java Archive是Java平台上的一种压缩文件格式,它可以包含Java类、资源文件和META-INF目录等内容。通常JAR文件被用作Java程序的打包和分发方式,可以方便地将Java程序打包成一个独立的可执行文件。JAR文件也可以作为Java类库被其他Java程序引用。在Java中,使用jar命令可以创建和解压JAR文件。
JDK下载
Java Downloads | Oracle
下载后文件夹
bin:存放各种工具命令(javac编译器和java虚拟机等)
conf:存放了相关配置文件。
Include:存放了一些平台特定的头文件。
Jmods:存放了各种模块。
Legal:存放各种模块的授权文档
Lib:存放工具的一些补充JAR包。
运行java文件
cmd打开命令窗口,先javac Main.java,然后会出现下图的Main.class文件(该文件为javac编译器编译的产物)。
最后通过java Main即可运行Main.class文件,注意不要加.class
字面量
整数(byte、int、short、long)、小数(float、double)、字符串(String)、字符(char)、布尔(boolean)、空类型
- byte:1个字节,范围是-128到127。
- short:2个字节,范围是-32,768到32,767。
- int:4个字节,范围是-2,147,483,648到2,147,483,647。
- long:8个字节,注意需要在定义的数后加一个大写或小写的L,范围是-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
- float:4个字节,注意需要在定义的数后加一个大写或小写的F,范围是IEEE 754规定的约-3.4028235E38到3.4028235E38的浮点数。
- double:8个字节,范围是IEEE 754规定的约-1.7976931348623157E308到1.7976931348623157E308的浮点数。
- char:2个字节,范围是0到65,535,表示Unicode字符。
- boolean:1个字节,表示true或false。
隐式转换
Double>float>long>int>short>byte
1. 取值范围小的和取值范围大的进行计算时,小的会先提升为大的,再进行运算。
- 2. Byte short char三种类型的数据再运算的时候,都会直接先提升为int,然后再进行计算(byte和byte的运算结果也是int)。
3. 字符运算会通过ASCII码表查询到对应的数字再进行运算。
System.out.println('a'+0);//97
System.out.println( 'a'+'a');//194
4. 和字符串的运算都会被转化为字符串。
System.out.println( 'a'+"bc");//"abc"
5. 数组容器在存储数据时会向上有隐式转换,例如int类型的数组可以向下存储byte short类型,double类型的数组可以存储所有数字类型(byte、short、int、long、float),存入时都会转化为数组的类型。
强制转换
byte a = 1;
byte b=2;
int c=a+b;
byte c = (byte)(a+b);
注意
- 字符串类型只能用双引号,和js不同(不区分单双引号的)不同,字符只能用单引号,且只能有一个,且字符串为对象不是字面变量。
- 空类型为null,且不能被System.out.println打印。
运算符
&&、||、&、|
&&、||和js一样存在短路,&、|是不存在短路。
Switch
和js不同可以简写成->,省略break语句,且当后面只有一句时,大括号也可以省略
Switch(number){
Case 1->{System.out.println(“yes”)}
}
Switch(number){
case 1:
System.out.println(“yes”);
break;
}
程序入口
public static void mian为程序入口。
public class Main {
public static void main(String[] args) {
System.out.println(args[0]);//打印"abc"
}
}
String[] args
命令行调用时候传入的参数,跟nodejs中的process.argv差不多。
在Idea中可以通过下图去设置。
数组
静态初始化
静态初始化2种方法
int[] arr1 = new int []{1,2,3};
int[] arr2 = {1,2,3};//可以省略new int[]
int[][] arr3 = new int[][]{{1,2},{3}};//二维数组
int[][] arr3 ={{1,2},{3}};//同样可以省略new int[][]
System.out.println(arr1);//[I@4eec7777
上面直接通过println打印arr1会打印数组的地址值而不是1,2,3.
其中
[:表示是一个数组;
I:表示当前数组里面的元素都是Int类型;
@:表示一个间隔符号(固定格式)。
4eec777:才是数组真正的地址值(十六进制)。
动态初始化
String[] arr1 =new String[50];
int[][] arr2 = new int[2][2];
int[][] arr3 = new int[2][] //当不知道二维数组的长度时,可以不用二维数组的后一位赋值,这样通过arr3[0]={1,2};可以动态赋值不同长度的数组。
像上面arr1,arr2会对数组中的内容进行默认初始化,初始化规律见下面变量初始化。
变量初始化
类中的变量和数组动态创建时会进行默认的初始化。
整数类型(byte、short、int、long):默认初始化值0。
小数类型(float、double):默认初始化值0.0。
字符类型(char):默认初始化值’\u0000’空格。
布尔类型(boolean):默认初始化值false。
引用类型(类、接口、数组、String):默认初始化值null。
Java内存
栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行。
堆:存储对象或者数组,new来创建的,都存储在堆内存。
方法区:存储可以运行的class文件。
本地方法栈 :JVM在使用操作系统功能的时候使用,和我们开发无关。
寄存器:给CPU使用,和我们开发无关的。
方法
程序运行的最小单元
Public static void method(){}
Public static int method(){}
其中void和int为方法的返回值,void为无返回。
方法之间没有顺序,且不能互相嵌套定义。
重载
和js不同,在同一类下,它允许同样的方法名,通过参数的类型、数量、顺序区分不同的方法(不能通过返回值区分)。
Final
修饰方法:最终方法,不能被重写。
修饰类:最终类,不能被继承。
修饰变量:常量,只能被赋值一次,申明时必须赋值。和js中的const一样,修饰引用数据类型的时候不能修改的是地址值。
包
在java中表现为一个文件夹,导入使用import,路径分隔用点
- 在同一个包中的类时(同一个文件夹下的类可以不需要导入,js中是需要导入的),不需要导包(同一个文件夹下也不能定义相同的类名)
- 使用java.lang包中的类时,不需要导包。
- 同时使用两个包中的同名类,需要用全类名。
String
java定义好的一个类,定义在java.lang包中,所以使用的时候不需要导包。
String s1="a";
String s2 = new String();//空串
char[] ch = {'a','b','c'};
String s3 = new String(ch) //"abc"
Byte[] ch2 = {97,98,99};
String s4 = new String(ch2) //"abc"
当使用双引号直接赋值时,系统会检查改字符串在串池(StringTable,堆内存中的一部分)中是否存在,存在则复用,不存在则创建新的。
用new创建的话,每次都会创建新的空间。
单纯比较字符串内容使用equals方法,s1.equals(s2),需要忽略大小写用equalsIgnoreCase。
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
上面通过键盘录入得到的字符串是new构建的。
访问字符串的长度用length方法(不是属性),访问某一位使用charAt,s.charAt(0)为访问s字符串的第一位。
StringBuilder
字符串容器,用于提升字符串的拼接等操作效率(多个字符串相加过程中会生成多个字符串,而使用StringBuilder则可以避免中间过程)。
常用方法
StringBuilder(str);
Append(str):添加内容str,可以链式使用。
Reverse:反转容器中内容。
Length:返回StringBuilder中内容长度。
toString:返回容器中的内容转换为字符串,底层是通过new String返回的最后的结果。
Capacity:返回容器的容量,即上限,但可以无限添加内容,因为不断扩充容量,初始默认容量为16,当添加的内容大于16会扩容(原来的容量*2+2)34,如果扩容后还是不够则将容量扩充到和实际长度相等。
StringBuilder sb = new StringBuilder("ab");
sb.append("cd");
sb.length();//4
sb.reverse();
sb.toString();//"dcba"
StringJoiner
用指定符号拼接成字符串(JDK8+)。
常用方法
StringJoiner(间隔符号)
StringJoiner(间隔符号,开始符号,结束符号)
Add:添加内容。
Length:返回toString后的总长度。
toString:通过间隔符号把add添加的内容拼接为字符串,并且在开始、结束加上指定的符号。底层是通过new String返回的最后的结果。
StringJoiner sj = new StringJoiner(",","[","]");
sj.add(1);
sj.add(2);
sj.toString();//[1,2]
字符串拼接底层原理
String s1 = "a"+"b"+"c";
上述运算都是字符串没有变量参加,触发字符串的优化机制,在编译的时候就已经得到了最终结果“abc”。
String s =s1+s2+s3;
JDK8以前会通过会通过new StringBuilder计算s1+s2,toString后再和s3相加,也是通过StringBuilder。
JDK8之后会评估字符串大小,通过开辟一个数组相同大小的数组,然后通过StringBuilder将所有的append后再toString。
ArrayList
集合,长度会自动扩容,只能存储引用数据类型。打印对象时不是地址值为内容。
ArrayList<String> list1 = new ArrayList<String>();// 后面的String可以省略为new ArrayList<>()
ArrayList list2 = new ArrayList ();//表示所有的类都可以往里面加入
上面的<String>为泛型用于限定集合中存储数据的类型 。
常用方法
Add:添加内容,返回true。
Remove(int index)根据索引删除,返回删除的内容。
Remove(obj)删除obj内容,如果存在obj会删除,返回true,不存在返回false。
Set(int index,obj)修改index索引的内容为obj。
Get(int index)获取index索引的内容。
Size:返回长度。