面向对象的思想本质:以类的方式组织代码,以对象的方式组织数据。java
JDK:java开发工具包,开发者用;程序员
JRE:运行时环境,运行Java程序只需jre就够了;数据库
JVM:java虚拟机。编程
三者关系:JDK 包含 JRE 包含 JVM。api
IDE:集成开发环境。数组
一个源文件能够对应多个class文件;缓存
一个源文件中能够有多个class,每一个class编译时会对应生成一个class文件,该源文件中public修饰的class名必须和文件名同样。安全
Java语言释型仍是编译型?仍是二者都是?网络
编译型语言:在程序运行以前,经过编译,将源程序翻译成机器语言,此后执行该程序就不用再进行翻译了。app
解释型语言:每次程序运行的时候,边运行边翻译。
Java的运行过程:Java源文件(.java)经过Java编译器(javac)编译生成一个ByteCode字节码文件(*.class),字节码由Java本身设计的一个
计算机(即Java虚拟机,JVM)解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定的机器上的目标机器码,而后在特定的机器上运行。Java的解释器的优势是比较容易让用户实现本身跨平台的代码,同一套代码能够在几乎全部的操做系统上执行。
虽然Java的第一道工序是javac编译,但其目标文件是ByteCode,而并不是机器语言,但后续可能有三种处理方式:
一、运行时,ByteCode由JVM逐条送给解释器,解释器将翻译成机器码运行。
二、运行时,部分ByteCode可能由实时编译器(Just In Time Compiler,JIT)编译为目标机器码再执行(以method为翻译单位,还会保存起来,第二次执行就不用再翻译为机器码了),由于考虑到有些JVM是采用纯JIT编译方式实现的,其内部没有解释器,例如:JRockit、Maxine VM。
三、RTSJ,继javac以后执行AOT二次编译,生成静态的目标平台码。
有的时候,多是以上三种方式同时在使用,至少,1和2是同时使用的,3则须要程序员手工指定。
我认为java是编译与解释二者之间的混合式语言。
不少资料说,C/C++等是编译型语言,而Java、C#、Python、JavaScript都是解释型语言,是经过解释器来实现的,其实这么说很容易引发误解:语言通常只会定义其抽象语义,而不会强制性要求采用某种实现方式,例如说C通常被认为是编译型语言,但C的解释器也是存在的,例如Ch……因此通常被称为“解释型语言”的是主流实现方式为解释器的语言,但并非说它就没法编译。
编译时注释跳过,字节码文件中没有注释。
标识符不能以数字开头;标识符不能包含除了字母、数字、下划线、$以外的其余字符。
Java内部采用Unicode字符集,能识别汉字。
字符集问题:
1.ISO8859-1:西欧字符集,1个字节;
2.GB2312:大陆使用最先、最广的简体中文字符集;
3.GBK:上者的扩展,能够表示繁体中文;
4.GB18030:上者的扩展,能够表示名族语言;
5.Unicode(UTF-8):国际通用字符集,2个字节;
byte:1字节;-128 ~ 127
short:2字节;-2的15次幂 ~ 2的15次幂-1(-32768~32767)
int:4字节;-2的31次幂 ~ 2的31次幂-1(正负21亿,不用记)
long:8字节;-2的63次幂 ~ 2的63次幂-1(不用记),定义long类型变量时后面加“L”;
在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,理论上可以表示无线大的数,只要计算机内存足够大;
这两个类都在java.math.*包中;
float:4字节;浮点数有舍入偏差。定义float类型变量时后面加“F”;
double:8字节;浮点数有舍入偏差;
char:4字节;
科学记数法:“e”表示10的次幂;3.14e5 = 3.14*10的5次幂 = 314000
Java中八进制数以“0”开头;十六进制数以“0x”开头;
二进制:Binary
八进制:Octal
十六进制:Hex
运算符详解:
关于取余运算“%”:小数也能够进行取余运算。
关于移位运算符:
<<:左移运算:左移一次至关于乘以一个2;
>>:右移运算:右移一次至关于除以一个2;
如:
12<<2=48;12>>2=3;
math类:Math.random()——产生随机数方法(随机产生的是一个小于1的小数);
int e = (int)(Math.random() * 5);//随机产生一个0-5之间的数;
switch语句注意:
1:每个case要加上一个break。
2:JDK7新特性:switch(a)中a能够是字符串。
每行输出定量个数后换行:
乘法口诀:System.out.peintln(i+"*"+m+"="+(i*m)+"\t");
API相关:
API:应用程序编程接口;
经过javaDOC生成api文档;
生成API文档专用注释防范:/**
接收键盘输入类:Scanner
自动类型转换:容量小的数据类型能够自动转换为容量大的数据类型。
特例:int类型数只要范围不超过范围比之小的byte、short、char,均可以直接转换。
全部二元运算(+-*/···)都有类型提高的问题。
对象属性默认值:
八种数据类型之外的任何默认值都为null;
数字默认0;
bool默认false;
小数默认0.0;
内存分析:
栈:
1. 每一个线程私有,不能实现线程间的共享;
2. 局部变量放置于栈中;
3. 栈是由系统自动分配,速度快;
4. 栈是一个连续的内存空间;
堆(包含方法区):
1. 放置new出来的对象;
2. 堆是一个不连续的内存空间,分配灵活,速度慢;
方法区(也是堆):
1. 被全部线程共享;
2. 用来存放程序中永远是不变或惟一的内容。(类的代码信息、static静态变量、字符串常量)
虚拟机内存管理垃圾回收机制:
程序员无权调用垃圾回收器;
程序员能够经过system.gc()通知GC运行,可是并不能保证马上运行;
finalize方法,是java提供给程序员用来释放对象或资源的方法,不多用。
static详解:
static变量从属于类————存放在内存中的方法区,而new出来的对象发在堆区,从属于对象。
因此在普通方法中能够调用静态方法和属性,反之在静态static方法中不能调用非静态的属性和方法。
this、super关键字详解:都是隐式参数。
普通方法中:this老是指向调用该方法的对象;
构造方法中:this老是指向正要初始化的对象;
注意:this不能用于static方法。由于静态方法不能调用非静态的方法和属性;
特殊用法:this(参数);//在一个构造方法中调用另外一个构造方法,可是必须在当前构造方法的第一行;
final关键字详解:Cannot override the final method
修饰的变量不能再次被赋值;其修饰的方法不能被重写,但能够被重载;
其修饰的类不能被继承(类中包括若干方法);
内部类详解:
适用场景:只考虑为其外部类提供服务;
每一个内部类能独立实现接口或继承类;
成员内部类:能够无条件访问外部类的全部成员属性和成员方法(包括private)。当成员内部类的field或method与外部类相同时默认访问的是内部类的。每一个实例都包含一个指向外围实例的引用,若须要访问外围实例可以使用:外部类名.this.field/method。在外部类中访问内部类的成员时须要先建立一个外部类,使用 .new语法。
Outter outter = new Outter();
Outter.Inner inner = new outter.new Inner();//必须经过Outter对象来建立
局部内部类:定义在一个方法内部或者是一段做用域内的类,仅限于在做用域内访问;
静态内部类:不依赖于外部类,不能用外部类的非static的域或者方法;
非静态内部类必须寄存在一个外部类对象里,非静态内部类对象单独属于外部类的某个对象;
非静态内部类可使用外部类的成员,可是外部类不能访问非静态内部类的成员;
内部类是 java的一颗语法糖,编译以后会生成两个 class 文件,匿名内部类名字为:外部类名$x,成员内部类名字为:外部类名$内部类名,编译器会默认为成员内部类添加一个参数类型为指向外部类对象的构造方法。
好比咱们在一个方法内写了一个 Thread 匿名内部类,当外部的方法执行完 毕后,方法内的局部变量生命周期结束,而 Thread 对象的生命周期尚未结束,因此必须使用 final 修改外部类的局部变量以使它在编译阶段就被放入常量池当中。
当咱们须要实例化一个成员内部类的时候,能够经过 OuterClass.new InnerClass 的方式初始化;
若是咱们须要在内部类中生成对外部类对象的引用 可使用 OuterClassName.this。
数组详解:
数组的本质仍是一个对象,操做数组就是操做指向该数组对象的引用;
String字符串:
一个String字符串自己属性是final的,不能改变的,可是指向它的指针的属性是能够改变的——即当须要改变它的内容的时候会返回一个新对象;
eg: String str = new String("abc");
例子中字符串“abc”自己的属性是不能改变的,可是其指针str是能够改变的。
String对 + 运算符的重载其实是使用StringBuilder.append()建立了一个新的String对象;
String 为何设计成不可变对象?
源码分析:
public final class String // 不能被继承
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
包含两个成员变量:value:String 的字符序列;hash:该 String 对象 hash 值 的缓存。咱们经过普通代码对一个 String 的改变都是经过返回一个新的 String 对 象来完成的。可是 String 也不是绝对不可变的,咱们能够经过反射拿到 value 对 象,而后改变它。 (final 域是不能修改的,可是若是 final 域指向的对象是可变的, 咱们就能够修改 final 域指向对象的内容)
设计成不可变对象的好处:
1. 由于它是不可变的,因此其 hashCode()永远保持一致,也就是每次在使 用一个 String 对象的 hashCode 的时候都不用从新计算,直接返回 hash 值便可,效率更高;
2. 不可变对象天生线程安全,能够无需同步的在多个线程间共享;
3. 安全性,经常使用于数据库链接、网络链接、打开文件等,避免了参数修改。
StringBuilder可变字符串,线程不太安全,但效率高,推荐使用;
StringBuffer可变字符串,线程安全,但效率低,不推荐使用;
三者执行速度上:StringBuilder > StringBuffer > String
Integer缓存处理详解:
[-128,127]之间的数,仍然看成基本数据类型(比对象的处理速度快)来处理;
eg:若int a=1234;int b=1234;则代码a==b与a.equals(b)的结果不一样:
"==":比较的是指向该变量的地址;——return false;
equals函数:比较的是两个变量的值;——return true;
若上例中a和b处于[-128,127]之间,则"=="和equals均返回true;
集合与容器Collection详解:
1.集合只能存放对象。好比你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型;
2.集合存放的是对各对象的引用,对象背身仍是放在对内存中;
3.集合能够存放不一样类型,不限数量的数据类型;
迭代器/游标iterator:
为容器遍历而生——提供遍历容器对象中各个元素的方法;相似于公交车上的售票员——关注公交车上的每一个乘客;
一般分为三个步骤:获取迭代器对象、先检查、再获取;
ArrayList<String> list = new ArrayList<String>();
list.add(“马云”);
list.add(“马化腾”);
//一、根据容器获取迭代器对象
Iterator<String> it = list.iterator();
//二、检查是否 存在下一个元素
while( it.hasNext() ){
//三、内部移动游标,获取元素
String element=it.next();
//…其余处理
}
容器相关详解:
ArrayList底层实现是数组,查询快,增删慢;线程不安全效率高;
LinkedList底层实现是链表,查询慢,增删快;线程不安全效率高;
Vector线程安全,效率低;
HashMap:键值对(key-value)详解:
经过对象来对对象进行索引,用来索引的对象叫作key,其对应的对象叫作value