1.Java虚拟机、Java编译器和Java解释器
JVM:JVM有自己完善的硬件架构,如处理器、堆栈(Stack)、寄存器等,还具有相应的指令系统(字节码就是一种指令格式)。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM是Java平台无关的基础。
JVM负责运行字节码:JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。
JVM解释执行字节码文件就是JVM操作Java解释器进行解释执行字节码文件的过程。
Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件)。
javac.exe可以简单看成是Java编译器。
Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。
java.exe可以简单看成是Java解释器。
字节码:字节码是已经经过编译,但与特定机器码无关,需要解释器转译后才能成为机器码的中间代码。
2. 关于package
当编写一个Java源代码文件时,此文件通常被称为编译单元。每个编译单元都必须有一个后缀名.java,而在编译单元内有且仅有一个public类,
否则编译器就不会接受。该public类的名称必须与文件的名称相同(包括大小写,但不包括后缀名.java)。
如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,因为它们不是public类,而且它们主要用来为主public类提供支持。
当编译一个.java文件(即一个编译单元)时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。
因此在编译少量.java文件之后,会得到大量的.class文件。每一个.java文件编译以后都会有一个public类,以及任意数量的非public类。
因此每个.java文件都是一个构件,如果希望许许多多的这样的构件从属于同一个群组,就可以在每一个.java文件中使用关键字package。
如果使用package语句,它必须是.java文件中除注释以外的第一句程序代码。
3.数据类型
整数:byte(1字节)、short(2字节)、int(4字节)、long(8字节,赋值时后面要加L或l)
浮点数:float(4字节,赋值时后面要加f或F,否则默认为double型)、double(8字节)
字符型:char(2字节,java中把字符型数据当做整数处理)
布尔型:
注:系统内存分为 系统区、程序区、数据区。当程序执行时,程序代码会加载到内存的程序区,数据暂时存储在数据区中。
4.常量
常量的声明: final 数据类型 常量名=常量值;
常量在整个程序中只能被赋值一次,且常量名一般为大写。
当一个常量属于成员变量时,它在声明时必须被赋值。
5.变量的有效范围
变量分为 [成员变量] 和 [局部变量]
成员变量:是在类体中定义的变量。在整个类中都有效。
成员变量分为[静态变量] 和 [实例变量]
静态变量是被static修饰的成员变量,除了可在本类中使用之外,还可以在其他类中通过 类名.变量名 的方式访问。
局部变量:是在类中的函数体内定义的变量。只在该方法体中有效。
当该方法被调用时,java虚拟机为该变量分配内存,函数调用完毕后释放该内存空间。
注:局部变量和成员变量名字可相同,此时成员变量会被屏蔽。如果想在该函数体中使用成员变量,则需要用类名.变量名的方式访问。
6.运算符
(1)逻辑运算符&&与&、||与|的区别:&&和||是短路运算符,但&和|不是。
(2)位运算符:>>>是无符号右移;^是异或运算。
7. foreach语句遍历数组
语法格式:for(数据类型 变量名:遍历对象){
语句块;
}
8.数组
声明: 数据类型[][] 数组名;
数据类型 数组名[][];
申请空间:数组名 = new 数据类型[行数][列数]; ///各元素初始化为0
声明的同时申请空间:数据类型 数组名[][]=new 数据类型[行数][列数];
初始化: 数据类型 数组名[][]={{……,……}{……,……}}; ///根据元素数自动申请空间
java.util.Arrays类中包含对数组的各种操作。
(1)fill(int[] a,int val) //用val填充数组a的元素
(2)sort(a) //将数组a按升序排列
(3)copyOf(arr,newlength)
copyOfRange(arr, int fromindex,int endindex) ///复制数组到新的数组
9.字符串
创建字符串:String s=new String(); ///创建一个空字符串
String s=new String(char a[],int offset,int length); ///用一个字符串数组的一部分创建一个字符串
字符串的操作:
(1)字符串的连接:+
当其他数据类型与字符串相连时,会自动转换成字符串类型,再进行连接。
(2)str.length()
(3)str.indexOf(substr) ///返回substr首次在字符串中出现的索引
str.lastIndexOf(substr)
///返回substr最后一次在字符串中出现的索引
(4)str.charAt(int index) ///返回字符串中index处的字符
(5)字符串去除空格:
str.trim() ////去除字符串前导、尾部的空格
StringTokenizer(String str,String delim) ////采用分隔和追加的方式去除字符串中间的空格
str.replace(String regex,String replacement) ///采用空字符替换空格的方式去除字符串中间的空格
(6)字符串替换:
str.replace(String regex,String replacement)
str.replaceFirst(String regex,String replacement)
(7)判断两字符串是否相等
str.equals(String str2) ///在区分大小写的条件下判断两字符串是否相等
str.equalsIgnoreCase(String str2) /////在忽略大小写的条件下判断两字符串是否相等
如果用==来比较两个字符串时,比较的是这两个字符串的位置是否相同。
(8)判断字符串的开始与结尾
str.startsWith(String prefix) ///判断str是否以prefix开头
str.endsWith(String suffix) ///判断str是否以suffix结尾
(9)大小写字母转换
str.toLowerCase()
str.toUpperCase()
(10)字符串分割
str.split(String sign) ///根据sign为分隔符对字符串进行分隔,并将分隔结果存放在字符串数组中
str.split(String sign,int limit) ///根据sign为分隔符对字符串进行分隔,分隔份数限制为limit
注:如果分隔符有多个,可用“|”符号隔开,例如:",|="表示分隔符为“,”和“=”
(11)字符串翻转
str.reverse();
字符串的格式化:(主要用于处理时间和日期)format(String format,Object args); 按照format指定的格式对args进行格式化;
正则表达式
字符串生成器:(StringBuilder类)
(1)创建: StringBuilder builder=new StringBuilder("");
(2)builder.append(String str)
builder.append(StringBuffer sb) ///向对象builder的后面追加内容
(3)builder.insert(int offset,String str) //向对象builder的offset位置插入字符串str
(4)builder.delete(int start,int end) ///删除[start,end)位置的子字符串
(5)builder.toString() //转换成字符串
拓展:
创建一个字符串时直接用一个字符串赋值的方法和new一个String对象的区别:
e.g. String str1="abcd";
java有一个字符串缓冲区。你新建一个的时候它会先找缓冲区里有没有这个字符串,如果有,直接返回引用,没有就在里面新建。
e.g. String str2=new String("abcd");
它首先也会去缓冲区里边查找。不管有没有,它都会在堆里新建一个。如果缓冲区里面没有,则在缓冲区里面也新建一个。