作者:孙英鹏 撰写时间:2019年5月8日
java之父是谁:詹姆斯.高斯林
Java的语言主要特点有:
面向对象的、跨平台、简单的、分布式的、健壮的、多线程的、解释型的语言
Java有哪两大机制:
(JVM)虚拟机 和 垃圾收集机制(GC)。
使用java编译:java源文件.java。
JDK:开发工具包。
JRE: java运行时环境。
JVM:虚拟机。
JRE、JDK、JVM 分别是什么?三者之间有什么联系?
分别时:JRE:java运行时环境,JDK:开发工具包,JVM:虚拟机。
联系:一层层的嵌套关系,JDK包含JRE,JRE包含JVM。
java 基本语法:
大小写敏感。
类名的首字母一定要用大写。
Java 标识符:
类名、变量名以及方法名都被称为标识符。
注意:关键字不能用作标识符。非法标识符举例:123abc、age。
Java 基本数据类型
JAVA有两大数据类型:基本类型、引用类型。
JAVA提供了八种基本数据类型和六种数字类型(四个整数型,两个浮点型),一种字符类型和一种布尔值。
Java的包装类:
整形:
byte: Byte 占1字节, 8位 (bit)
short: Short 占2个字节,16位
int:Integer 占4个字节,32位
long:Long 占8个字节,64位
浮点型:
float:Float 占4个字节,32位
double:Double 占8个字节,64位
字符类型 ,占2个字节,16位
char:Character
布尔类型 1字节 8位
boolean:Boolean
包装类的图片:
装箱及拆箱 :
- 将基本数据类型变成包装类称为装箱
- 将包装类的类型变为基本数据类型称为拆箱。
- 在JDK1.5之后,提供了自动装箱和自动拆箱功能。
什么时候会出现精度丢失
在强制性转化下会出现精度丢失。
算术运算符:
+:加法 相加运算符两侧的值
-:减法 左操作数减去右操作数
*:乘法 相乘操作符两侧的值
/:除法 左操作数除以右操作数
%:取余 左操作数除以右操作数的余数
++:自增: 操作数的值增加1
–:自减: 操作数的值减少1
注意:自增(自减)在前面和在后面的区别:
- ++y(y):先将 y 的值自增(自减)1,然后再在当前表达式中使用 y 的值
- y++(y):先在当前表达式中使用 y 的值,然后再将 y 的值自增(自减)1。
关系运算符:
: 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。
=:检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真
<: 检查左操作数的值是否小于右操作数的值,如果是那么条件为真
<=:检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。
==:检查如果两个操作数的值是否相等,如果相等则条件为真。
!=: 检查如果两个操作数的值是否相等,如果值不相等则条件为真。
Java中 == 和 equals()方法的区别:
==是用来比较值是否相同或是比较地址。
逻辑运算符:
&&: 与,前后两个操作数必须都是true才返回true,否则返回false。
&: 不短路与,作用与&&相同,但不会短路。
||:称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。
|:不短路或,作用与
!:称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将 得到false。
^: 异或,当两个操作数不同时才返回true,如果两个操作数相同则返回false。
要声明数组吗?
必须声明数组变量,才能在程序中使用数组
数组的初始化主要有两种方式:
静态初始化和动态初始化
声明数组然后初始化,遍历
switch语句:可以拥有多个case语句。
Break语句:如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
switch语句:
While循环和do-while循环的区别:
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
Java增强型for循环:Java5 引入了一种主要用于数组的增强型for循环。但需要注意一点:Java增强型for循环只能取值,不能赋值
对象和类的概念
类:是指一个大的范围。(鸟类)
对象:是指一个范围的单调对象。(鸵鸟)
构造器:也叫构造方法或者构造函数,构造器与类名相同,没有返回值,连void都不能写;
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候 实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
创建对象需要三步:
声明:声明一个对象,包括对象名称和对象类型。
实例化:使用关键字new来创建一个对象,只是为对象在内存中开辟空间。
初始化:使用new创建对象时,会调用构造方法初始化对象,对象中的值赋初始值。
封装一个变量
封装的优点:
1.良好的封装能够减少耦合。
2.类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。
实现Java封装的步骤:
- 修改属性的可见性来限制对属性的访问(一般限制为private)
- 对每个值属性提供对外的公共方法访问,也就是创建getter 和 setter方法(将实 例变量的首字母大写,在前面添加get或者set, 变成getter 和 setter方法名)
super于this关键字:
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
初始化块与静态初始化块的区别:
- 不使用static修饰的是初始化块
- 使用static修饰的是静态初始化块
单个类中初始化块、静态初始化块、构造器的执行顺序:
静态初始化块、初始化块、构造器。
多个类的继承中初始化块、静态初始化块、构造器的执行顺序:
在继承中,先后执行父类A的静态块,父类B的静态块,后子类的静态块,然后 再执行父类A的非静态块和构造器,然后是B类的非静态块和构造器,后执行子 类的非静态块和构造器
Java 单例模式有五种实现方式:
- 饿汉式:
特点:线程安全,调用效率高,但是不能延时加载 - 懒汉式:
特点:线程安全,调用效率不高,但是能延时加载 - Double CheckLock实现单例:
Double CheckLock也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题, 不建议使用),是在懒汉式单例上发展而来。 - 静态内部类模式:
特点:线程安全,调用效率高,可以延时加载 - 枚举类:
特点:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用
如何选择:
1.单例对象占用资源少,不需要延时加载时:枚举 好于 饿汉
2.单例对象占用资源多,需要延时加载时:静态内部类 好于 懒汉式
final修饰符主要有以下四种:
- 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法 被改变。对于成员变量来讲,我们必须在声明时、构造方法或者初始化块中对它赋值。
- 用来修饰局部变量,表示在变量的生存期中它的值不能被改变。
- 修饰方法,表示该方法无法被重写。
- 修饰类,表示该类无法被继承。
什么时抽象类:
如果一个类中没有包含足够的信息来描绘一个具体的对象,这种类称为抽象类。
Java抽象类的特点:
必须被继承,才能被使用。
必须使用abstract修饰符来修饰。
抽象方法的特点:
抽象方法只包含一个方法名,而没有方法体,使用abstract修饰。
接口特性:
1.接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
2.接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
3.接口中的方法都是公有的。
4.编译时自动为接口里定义的方法添加public abstract修饰符 5.Java接口里的成员变量只能是public static final共同修饰的,并且必须赋初值,可以不写public static final,编译的时候会自动添加
接口的继承:接口允许多继承
写个接口,实现并调用:
Java的集合是用来存储什么的:
储存数量不等的对象,并可以实现常用的数据结构,如栈、队列等。
Java的集合类主要由两个接口:
Collection 和 Map。
List集合:
List是有序且允许元素重复,允许元素为null。
Comparable排序接口:
Comparable 排序接口 是在类的内部实现。
Comparator比较接口:
该类不支持排序,所以要建立一个“该类的比较器”来进行排 序。
Comparable和Comparator区别比较:
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持 排序”。
Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的 比较器”来进行排序。
Set集合:
不允许包含相同的元素,否作会失败。
HashSet类:不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化,集合元素可以null,但只能一个。
LinkedHashSet类:保证元素的排列顺序,顺序怎么写,添加顺序就怎么出来,可以放入null,但只能放入一个null。
TreeSet类:TreeSet类不能放null,不然会报错,添加顺序不管怎么写,结果都是按顺序排列出来。
由于TreeSet是有序的,也支持Comparable和Comparator两种排序方式。
Map集合的特点:
Map接口中键和值一一映射. 可以通过键来获取值。
TreeMap类:与 TreeSet类似的是,TreeMap中也提供了一系列根据key顺序访问key¬value对的方法
由于TreeMap是有序的,也支持Comparable和Comparator两种排序方式。TreeMap 主要是Key值排序
List、Map、Set三个接口存取元素时,各有什么特点?
答:List以特定索引来存取元素,有序,可以有重复元素。Set无序,不能存放重复元素(用对象的equals()方法来区分元素是否复)。Map保存键值对(key-value pair)映射。