1、环境变量:(在windows中是不分大小写的,可以是Path或PATH,但是在Linux系统中是区分大小写的,只能是PATH)
JAVA_HOME:指向jdk目录,启动类加载器会加载$JAVA_HOME/jre/lib/rt.jar,扩展类加载器会加载$JAVA_HOME/jre/lib/ext/*.jar
CLASSPATH:应用程序类加载器会加载$CLASSPATH,在使用1.4以前版本的JDK,则需要在CLASSPATH环境变量中添加一点(.),用以告诉JRE需要在当前路径下搜索Java类,除此之外,编译和运行Java程序还需要JDK来编译和运行Java程序,常常需要设置CLASSPATH环境变量的值为:.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
但是后来使用JDK1.5以上的版本的时候,JRE会自动搜索当前路径下的类文件,而且使用Java的编译和运行工具时,系统可以自动加载dt.jar和tools.jar文件中的Java类,因此不再需要设置CLASSPATH环境变量
PATH:在cmd命令行中执行可执行文件时,如果该文件不能在当前路径下找到,则依次寻找PATH中的每一个路径
2、对象和实例:
对象是类的实例。对象在构造时以类为蓝本,创建对象的过程叫做实例化
3、所有变量:
成员变量(实例变量、类变量)和局部变量(形参、方法局部变量、代码块局部变量)
4、静态变量
在静态方法中是不能直接访问类的非静态成员的,如下
public class Person{ int arr[] = new int[10]; public static void main(String args[]){ System.out.println(arr[1]); } }
静态变量的使用
public class Person{ private static int x; public static void main(String args[]){ name(x); System.out.println(x); } public static void name(int x){ x++; } } //上面的输出应该是0,其中x++改变的是参数的x的值,而不是静态变量x的值
public class Person{ private static int x; public static void main(String args[]){ name(x); System.out.println(x); } public static void name(int y){ x++; } } //上面的输出应该是1,其中x++改变的是静态变量x的值
5、Java中变量
变量的命名是以字母、下画线(_)、美元符($)开始的,后面可以跟字母、下画线、美元符、数字。Java语言使用Unicode字符集,对字母不仅仅只限于是英文的,还可以是日文的、韩文的、阿拉伯文的甚至汉字。如声明public String 我的名字=“张三”;这样的声明是没问题的,当然,这只会出现在比较变态的笔试题中,平时是不会出现的。
6、Java中的关键字(除了Void、String、Class常见的是大写开头的其他大部分都是小写的。如null、true、false
7、Java的注释:单行(//)、多行(/*... */)、文档注释(/**... */)。多行的里面不可以嵌套,但是可以/*//*/
8、取模:不管是整型还是实型的取模运算,余数的符号与被除数a的符号相同,如(-5)%2=-1, 5%(-2)=1
9、equals()函数和==
10、String
String str = "abc";和String str = new String("abc");有什么区别,各产生了多少个对象
String不是基本类型
String和StringBuffer的区别
11、位运算
& 与
| 或
^ 异或
~ 非
<< 带符号左移
>> 带符号右移
>>> 无符号右移:移后补0
12、一些赋值语句:
x++=y+1这也是不合法的,因为左操作数必须为其右操作数指明一个确定的可存储位置
赋值运算具有右结合性a+b+c可以理解为a+(b+c)
13、float和double
浮点数的赋值是带有小数点的数字默认是double型的,如果在浮点数后面加f或F,则是float型;后面加d或D是double型,科学计数法形式的浮点数也是double型,double的精度比float高,故一个float可以直接赋值给double型的,反之则需要强制转换
float f=11.1;(错误,必须是float f = (float)11.1;) double d = 5.3E12; double d = 3.14159; double d = 3.14D; double d = 2.3F;
14、||和&&操作符
操作符在第一个语句为真则不会去执行第二个语句,和&&操作符则第一个语句为真才会去判断第二个语句
15、基本数据类型和封装类
16、八进制:八进制用0~7这8个数字和正负号组成的,八进制是以0开头的
十六进制:用0~9这10个数字以及字母A~F(对大小写不敏感,代表了10-15)和正负号组成。以0X或0x开头的都是十六进制数
17、int的取值范围:-2³¹~(2³¹-1)
18、数组
数组的声明:可以是int a[][]或int [][]a或int [] a[]
数组的初始化:数组在声明时并不为数组分配存储空间,因此在声明的[]中不能指出数组中元素的个数,所以声明后不能立即使用,必须经过初始化并分配存储空间
数组的引用:[]中的下标是介于[0,数组长度-1]之间的整型数,也可以是byte、short、char等类型或合法的表达式,但是不允许为long型
获得数组的大小a.length;,而不是a.length();而字符串的是用str.length();
19、 transient关键字:当串行化某个对象时,如果该对象的某个变量是transient,那么这个变量不会被串行化进去。也就是说,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。因为当从磁盘中读出这个对象的时候,对象的该变量会没有被赋值。
20、浮点型变量分为单精度和双精度两类,分别用float(32位)和double(64位)来声明
科学记数法:2.8E3表示2.8*10³
21、字符型数据:
Java中的char类型是16位,其取值范围是0-65535,没有负数的char。char型变量能够存储一个中文,因为java采用的是unicode编码,一个char占16个字节,而一个中文汉字只有两个字节
22、对于布尔型数据:java中的布尔型是一个独立的类型,它不像C语言中的布尔型可以代表0和1,所以布尔类型是不能转成int型的
public class A { public static void main(String args[]){ int s = 0; boolean b; if(++s){//这里编译错误 System.out.println("hello"); } if(b){ System.out.println("world"); } } }
23、数据类型转换:除了布尔型外,其余类型的数据是可以进行混合运算的,在运算中,如果数据类型不一致,就必须先转成同一类型,然后才能运算,这是就要用到类型转换。如果低级数据想高级数据看齐,那么Java就能实现自动数据类型转换。转换的基本原则是:低级的转换变成高级的,精度小的转换成精度大的
数据类型的转换方式主要可以分3种:自动类型转换、强制类型转换、包装类过渡类型转换
char和int的转换:在Java中每个字符都会有一个ASCⅡ码,在与数字进行计算时,是由字符的ASCⅡ码进行计算,例如,A的ASCⅡ码是65,a的是97
包装类型的强制转换(其中String和Date本身就是类了)
String n= Integer.toString(12);
int m = Integer.parseInt("123");
基本数据类型与String之间的转换:表达式10.4+“4.2”的结果是“10.44.2”(当一个操作数为原始数据类型,另一个为字符串时,则基本数据类型的操作数要转换为等价的字符串)
24、final的参数传递
public class A { public static void main(String args[]){ int x = 0; final int y = 1; int [] z = {2}; final int [] n = {3}; use(x,y,z,n); } static void use(final int x,int y,final int[] z,int[] n){ //下面哪些插入会引起编译错误 } } x++;//引起编译错误 y++; y = x; z[0]++; n[0]++; z = n;//引起编译错误
数组和字符串
25、Java在数组声明时并不为数组分配存储空间,因此在声明的[ ]中不能指出数组元素的个数(即数组的长度),所以声明后并不能立即使用,必须经过初始化并分配存储空间后,才能访问数组的元素。为数组分配存储空间有两种方式:初始化和使用关键字new
一旦数组初始化或用new为数组分配了存储空间后,该数组的长度即被固定下来,不能再进行修改,除非再新建一个数组,重新分配存储空间
26、数组中[ ]的下标是介于[0,数组长度-1]之间的整型数,也可以是byte、short、char等类型,但是不允许为long型,当然下标也可以是合法的表达式
27、数组声明的形式
一维:int a[ ];int [ ] a
二维:int [ ] a [ ];int [ ][ ] a;int a [ ][ ]
(二维数组与一维数组不同,二维数组在分配内存时,必须告诉编译器二维数组行与列的个数)
28、默认的初始化值:
元素类型 初始化值
Byte 0
Short 0
Int 0
Long 0
Char '\U0000'
Float 0.0f
Double 0.0d
Boolean false
Object Reference null
29、字符和数值的转换
要获得一个字符的ascii码或者通过ascii码获取字符
(int)'a'
(char)97
包装类型的使用:一般用于类型的转换
Integer.parse("123");
初始化:(下面初始化都没问题)
int a = new Integer(123);
int b[] = new int[3];
Integer[] b = new Integer[]{new Integer(1),new Integer(2),new Integer(3)};
Integer类中下面几个方法的区别:
static int parseInt(String s)
将字符串参数作为有符号的十进制整数进行分析。
static Integer valueOf(int i)
返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s)
返回保持指定的 String 的值的 Integer 对象。
很明显,parseInt和valueOf的区别是返回类型不同,parseInt返回int,而valueOf则返回Integer对象
Character类的digit方法
static int digit(char ch, int radix) :根据基数返回当前字符的值的十进制。如果不满足Character.MIN_RADIX <= radix <= Character.MAX_RADIX,或者,ch不是radix基数中的有效值,返回"-1";如果ch是“大写”的A到Z之间,则返回ch - 'A' + 10 的值;如果是“小写”a到z之间,返回ch - 'a' + 10 的值。
泛型
List<int> s = new ArrayList<int>();//编译错误,泛型应该是类 List<Integer> s = new ArrayList();//ok List s = new ArrayList<Integer>();//ok List s = new ArrayList();//ok
获取数组和字符串的长度(经常容易混淆)
int a[ ] = new int[5];
String b = "cef";
则分别的:a.length;和b.length();
String不是基本类型,java.lang.String类是final类型的,因此不可以继承且修改该类,为提高效率节省空间,我们应该使用StringBuffer或StringBuilder
判断下面程序执行过程创建了几个对象,分别在哪一行创建,且输出结果是什么
public static void main(String args[]){ String str = new String("good");//创建了两个对象 String str1 = "good";//没有创建对象 String str2 = new String("good");//创建了一个对象 System.out.println(str == str1);//false System.out.println(str.equals(str2));//true System.out.println(str2 == str1);//false }
String、StringBuilder和StringBuffer的区别
String的长度是不可变的,StringBuilder和StringBuffer的长度是可变的。对于那些经常要进行操作的字符串,特别是内容要修改时,那么使用StringBuilder(线程不安全)或StringBuffer(线程安全),如果最后需要String,那么使用StringBuilder或StringBuffer的toString()方法
说明:深入理解JVM里面提到String的+操作是在编译阶段的字节码生成阶段替换成StringBuilder或StringBuffer的append()操作