01:面向对象
1:什么是面向对象
面向对象,面向过程
面向对象的三大基本特征和五大基本原则
三大特性:封装,继承,多态。
五大基本原则:
1:万物皆对象,2:程序是对象的集合,他们通过发送消息来告知彼此所要做的,3:每个对象都有自己的由其他对象所构成组成,4:每个对象都有其类型,5:某一特定类型的所有对象都可以接受同样的消息。
对象具有状态,行为和标识。
2:Java的垮平台性
Java如何实现垮平台性
Java是通过Java虚拟机(jvm)实现跨平台性的。jvm是一个软件,不同的平台有不同的版本,我们编写的Java源码,编译后会生产.class的Java源文件(字节码文件),jvm就是负责将字节码文件翻译成特定平台下的机器码然后运行。不同的平台需要安装不同的jvm。而在这个过程中我们的Java程序没有任何改变,通过jvm实现了一次编译,多处运行的目的。
跨平台的是Java程序,不是jvm,jvm是用c/c++开发的,使用来将字节码文件编译成机器码的。机器码不能快平台,不同的平台需要安装不同版本的jvm。
JVM还支持那些语言(kotlion ,Groovy ,JRuby ,Jython,Scala)
还有:Java,clojure,Ceylon,Eta,Haxe
3:值传递
值传递,引用传递
值传递:在方法调用过程中,实际参数把他的值传递给对应的形参,此传递过程中就是将实参的值复制一份传递到函数中,这样在函数中对该值进行改变,就不会影响到实参的值,
引用传递:在方法的调用的时候,将对象地址的值传递过去,函数接受的是原始值的首地址值。在方法调用过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的都是源数据,所以方法的执行将会影响到实际对象。
基本数据类型的传值,对形参的修改不会影响到实际参数;引用传递,形参和实参指向同一内存地址同一对象,对参数指向对象内容修改时会影响到实际对象,String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
为什么说Java中只有值传递。
https://blog.csdn.net/bjweimengshu/article/details/79799485
4:封装,继承,多态
什么是多态,方法重载和重写
多态是具有表现多种形态的能力的特征,同一个实现接口,使用不同的实例而执行的不同操作。
多态的作用就是消除类型之间的耦合关系。
重载:同一个类的同名方法,要求方法名相同,参数列表不同,与返回值类型无关。
重写:子类和父类之间的同名方法,要求方法名相同,参数列表相同,返回值类型相同(或者是其子类)。
Java的继承与实现
继承通过extends关键字来实现,不可以使用private和protected修饰类。Java中只支持单继承,每个类只有一个父类,所有的类都直接或间接的继承了Java。lang。object类
继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里。
继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
无法继承private修饰的属性和方法。
无法继承父类的构造方法。
构造函数与默认构造函数
创建对象时初始化对象,为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中,一个类可以有多个构造函数,可以根据参数类型和参数个数的不同来区分他们,就是构造函数的重载。如果类里面没有构造函数,那么编译器会默认加上一个无参且方法体为空的构造函数。
构造函数必须与类名相同,包括大小写。
构造函数没有返回值,也不能用void修饰,如果给构造函数前面添加了返回值类型,那么这个构造函数就是一个普通方法,在运行时会产生找不到构造方法的错误。
一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
类变量,成员变量与局部变量
类变量:
归属类的变量,在定义类的属性时,增加static修饰符,所以又称之为静态变量,类变量可以通过类名+点+变量名来操作
成员变量:
1:成员变量定义在类中,在整个类中都可以被访问。
2:成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象的堆内存中。
3:成员变量有默认初始化值。
局部变量:
1:局部变量只定义在局部范围内。(如:函数内,语句内,只在所属区域内有效)
2:局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3:局部变量没有默认初始化值。
成员变量和方法作用域
在Java中,变量的作用域分为四个级别:类级、对象实例级、方法级、块级。
类级变量又称全局级变量或静态变量,需要使用static关键字修饰。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。 对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。 方法级变量就是在方法内部定义的变量,就是局部变量。
说明:
方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。
块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。
方法级和块级的变量必须被显示地初始化,否则不能访问。
02:Java基础
1:基本数据类型
8种基本数据类型
byte,short,int,long,boolean,double,float,char
整形中byte,short,int,long的取值范围
byte(字节型)默认值是0,最大值:127(2^7-1),最小值:-128(-2^7)
short(短整型)默认值是0,最大值:32767(2^15 - 1),最小值:-32768(-2^15)
int(整形)默认值是0,最大值:2,147,483,647(2^31 - 1),最小值:-2,147,483,648(-2^31)
long(长整型)默认值是0L,最大值:9,223,372,036,854,775,807(2^63 -1),最小值:-9,223,372,036,854,775,808(-2^63)
什么是浮点型,什么是单精度和双精度
float(单精度)double(双精度)
为什么不能用浮点型表示金额
金额计算要使用BigDecimal
会产生丢失精度的问题,我们在程序里写的是10进制的小数,计算机内部无法用二进制的小数来精确表达。
正确的做法是:统一用字符串保存,然后在工具类里面将字符串进行格式化为BigDecimal
2:自动装拆箱
什么是基本类型,什么是包装类型,什么是自动装拆箱
基本类型就是Java的八种基本类型byte,short,int,long,boolean,double,float,char
包装类型就是与基本类型所对应的包装类Byte,Short,Integer,Long,Boolean,Double, Float,Character
将基本数据类型转换为包装类型称之为装箱。
将包装类型装换为基本类型称之为拆箱。
Integer的缓存机制
3:String
字符串的不可变性
一但一个字符串在堆内存创建,它是不能被改变的,我们应该注意所有的关于String类的方法不是改变一个字符串本身,而是重新返回一个新的字符串。如果我们需要一个频繁的改变一个字符串对象,我们可以使用StringBuffer或者StringBuilder,否则将会浪费大量时间进行垃圾回收,因为每次创建一个新的字符串。
JDK6和JDK7中的substring的原理及区别,
replaceFirst,replaceAll,replace区别,
String对+的重载,字符串的几种拼接方式和区别
String.valueOf和String和.toSting的区别
string是标准类型的转换,将对象强制转换为String类型,前提是该对象必须能保证转成String类型,否则将抛出ClassCastException异常
。toString方法返回对象本身,在Java。lang。Object类中也有toString()方法,所以Java对象都可以调用此方法,但使用时必须保证要转换的对象不为null,否则将抛出NullPointerException异常。
String。valueOf()不用担心Object为null,但是用的时候也要小心,当Object为Null时,它的返回值时”null“。而不是null,有区别。
switch对String的支持
字符串池,常量池(运行时常量池,Class常量池),intern
4:熟悉Java中的各种关键字
transient, instanceof, final, Static , volatile , synchronized , const原理及用法
5:集合类
常用集合类的使用,ArrayList和LinkedList和vector的区别,synchronizedList和vector的区别,
HashMap,HashTable,ConcurrentHashMap的区别
Set和List区别,Set如何保证元素不重复
Java8 中stream相关用法,Apache集合处理工具类的使用,不同版本JDK中的HashMap的实现区别及原因
Collection 和 Collections 区别
Arrays.asList 获得的 List 使用时需要注意什么
Enumeration 和 Iterator 区别
fail-fast 和 fail-safe
CopyOnWriteArrayList、ConcurrentSkipListMap
6:枚举
枚举的用法、枚举的实现、枚举与单例、Enum 类
Java 枚举如何比较
switch 对枚举的支持
枚举的序列化如何实现
枚举的线程安全性问题
7:IO
字符流、字节流、输入流、输出流、
同步、异步、阻塞、非阻塞、Linux 5 种 IO 模型
BIO、NIO 和 AIO 的区别、三种 IO 的用法与原理、netty
8:反射
反射与工厂模式、反射有什么用
Class 类、java.lang.reflect.*
9:动态代理
静态代理、动态代理
动态代理和反射的关系
动态代理的几种实现方式
AOP
10:序列化
什么是序列化与反序列化、为什么序列化、序列化底层原理、
序列化与单例模式、protobuf、为什么说序列化并不安全
11:注解
元注解、自定义注解、Java 中常用注解使用、注解与反射的结合
Spring 常用注解
12:JMS
什么是 Java 消息服务、JMS 消息传送模型
13:JMX
java.lang.management.*、 javax.management.*
14:泛型
泛型与继承、类型擦除、泛型中 KTVE? object 等的含义、泛型各种用法
限定通配符和非限定通配符、上下界限定符 extends 和 super
List<Object> 和原始类型 List 之间的区别?
List<?> 和 List<Object> 之间的区别是什么?
15:单元测试
junit、mock、mockito、内存数据库(h2)
16:正则表达式
java.lang.util.regex.*
17:常用的Java工具库
commons.lang、commons.*...、 guava-libraries、 netty
18:API & SPI
API、API 和 SPI 的关系和区别
如何定义 SPI、SPI 的实现原理
19:异常
异常类型、正确处理异常、自定义异常
Error 和 Exception
异常链、try-with-resources
finally 和 return 的执行顺序
20:时间处理
时区、冬令时和夏令时、时间戳、Java 中时间 API
格林威治时间、CET,UTC,GMT,CST 几种常见时间的含义和关系
SimpleDateFormat 的线程安全性问题
Java 8 中的时间处理
如何在东八区的计算机上获取美国时间
21:编码方式
Unicode、有了 Unicode 为啥还需要 UTF-8
GBK、GB2312、GB18030 之间的区别
UTF8、UTF16、UTF32 区别
URL 编解码、Big Endian 和 Little Endian
如何解决乱码问题
22:语法糖
Java 中语法糖原理、解语法糖
语法糖:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with-resource、Lambda 表达式
03:阅读源代码
String、Integer、Long、Enum、
BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、
ArrayList & LinkedList、
HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet
04:Java并发编程
1:并发与并行
什么是并发、什么是并行
并发与并行的区别
2:什么时线程,与进程的区别
线程的实现、线程的状态、优先级、线程调度、创建线程的多种方式、守护线程
线程与进程的区别
3:线程池
自己设计线程池、submit() 和 execute()、线程池原理
为什么不允许使用 Executors 创建线程池
4:线程安全
死锁、死锁如何排查、线程安全和内存模型的关系
5:锁
CAS、乐观锁与悲观锁、数据库相关锁机制、分布式锁、偏向锁、轻量级锁、重量级锁、monitor、
锁优化、锁消除、锁粗化、自旋锁、可重入锁、阻塞锁、死锁
6:死锁
什么是死锁
死锁如何解决
7:synchronized
synchronized 是如何实现的?
synchronized 和 lock 之间关系、不使用 synchronized 如何实现一个线程安全的单例
synchronized 和原子性、可见性和有序性之间的关系
8:volatile
happens-before、内存屏障、编译器指令重排和 CPU 指令重
volatile 的实现原理
volatile 和原子性、可见性和有序性之间的关系
有了 symchronized 为什么还需要 volatile
网友评论