一.JAVA基础
1.八个基本数据类型,长,占几个字节,取值范围是多少。
基本类型:
Byte 一般的数据 1个字节 取值范围 -128—127
short 极大的数据 2个字节 取值范围 -2的15次方到2的15次方减一
int 4个字节 取值范围 -2的31次方到2的31次方减一
long 8个字节 取值范围 -2的63次方到2的63次方减一
byte、short、int、long都是整数类型,并且是有符号整数 分别占用、2、4、8个字节。
浮点数
float 有效数字最长是7位 占四个字节,共32位,称为单精度浮点数
double 有效数字最长是15位 占八个字节,共64位,称为双精度浮点数
Java中的浮点型常量数值默认是double类型
注意: java提供的浮点类型不适合进行精确的运算
boolean
Boolean在内存中占用一个字节。
当java编译器把java源代码编译为字节码时,会用int或byte来表示boolean。在java虚拟机中,用整数零来表示false,用任意一个非零整数表示true。 java虚拟机这种底层处理方式对java虚拟机是透明的,在java源程序中boolean类型的变量取值只能是true或false。
char
char是字符类型 占用两个字节,java语言对字符采用Unicode字符编码
2.面向对象的特征
1. 封装(Encapsulation)
封装是面向对象编程中最基本的特征之一,它将数据和操作数据的方法(即方法)封装在一个单独的单元(即类)中。通过封装,我们可以隐藏对象的内部细节,只暴露出必要的接口供其他对象进行交互,从而实现了信息的隐藏和保护。
2. 继承(Inheritance)
继承是面向对象编程中的另一个重要特征,它允许一个类继承另一个类的属性和方法,从而实现代码的重用和扩展性。被继承的类称为父类(或超类),继承这个类的类称为子类。子类可以继承父类的所有非私有属性和方法,并可以在其基础上添加新的属性和方法。
3. 多态(Polymorphism)
多态是面向对象编程的第三个特征,它允许一个对象在不同的情况下表现出不同的行为。多态分为编译时多态和运行时多态。编译时多态是通过方法重载来实现的,而运行时多态是通过方法重写和向上转型来实现的。
3.实现多态的几种方式
1. 方法重载
方法重载是一种实现多态的简单方式。它允许在同一个类中定义多个同名但参数列表不同的方法。当调用这些方法时,编译器会根据参数的类型和数量来确定具体调用哪个方法。这样就实现了多态性。
2. 方法重写
方法覆盖是一种实现多态的常用方式。它允许子类重新定义父类中已经定义的方法。当子类对象调用这个方法时,将会执行子类中的方法实现,而不是父类中的方法。
3. 接口实现
接口是一种定义了一组方法的抽象类型。类可以通过实现接口来达到多态的目的。当一个类实现了一个接口时,它必须实现该接口中定义的所有方法。
方法重载允许根据不同的参数类型来实现多态;方法覆盖允许子类重新定义父类中的方法以实现多态;接口实现允许类根据实现的接口来实现多态
4.什么叫装箱什么叫拆箱
装箱就是自动将基本数据类型转换为包装器类型;
装箱(Boxing): 装箱是指将基本数据类型转换为对应的包装类对象。这是通过调用包装类的构造函数或静态工厂方法来完成的。装箱过程将基本数据类型的值封装成一个包装类对象。
拆箱就是自动将包装器类型转换为基本数据类型
拆箱(Unboxing): 拆箱是指将包装类对象转换为基本数据类型。这是通过调用包装类的 xxxValue() 方法来完成的。拆箱过程将包装类对象中的值提取出来,转换为对应的基本数据类型。
5.装拆箱分别调用的是那个方法
装箱:这是通过调用包装类的构造函数或静态工厂方法来完成的。装箱过程将基本数据类型的值封装成一个包 装类对象。
拆箱:这是通过调用包装类的 GetValue() 方法来完成的。拆箱过程将包装类对象中的值提取出来,转换为对应 的基本数据类型。
6.Integer a=100; Integer b=100; a == b (true)
Integer a=200; Integer b=200; a == b(false)
为什么?
integer :integer是int的包装类,首先它是一个类用==比较的是内存的地址,在integer类里面有一个成员静态 内部类IntegerCache,这成员静态内部类缓存了-128到127之间的所有的整数对象,并在jdk1.5之后引用了自 动 装箱,在将整数类型装箱时进行了判断,如果这个之大于-128到127之间就会重新new一个新的integer, 所 以尽 管两个数值相同,但地址不同,所以返回false。
7.Object有那7个方法
- getClass():获取类的class对象。返回对象的运行时类。返回的是 Class 对象,可以获取类的信息,如类名、父类、接口等。
- hashCode:返回对象的哈希码值。哈希码是根据对象的内容计算得出的一个整数,用于快速查找和比较对 象。在重写 equals 方法时,通常也要同时重写 hashCode 方法,以保证相等的对象具有相同的哈希码
- equals():比较对象是否相等,比较的是值和地址,子类可重写以自定义。默认情况下,使用 == 运算符进行比较,即判断两个对象的 引用是否指向同一个内存地址。如果需要自定义比较规则,可以重写该方法。
- clone():克隆方法。创建并返回当前对象的副本。默认情况下,使用浅拷贝方式复制对象,即只复制对象的字段值,而不 复制引用类型的对象。如果需要实现深拷贝,可以重写该方法
- toString():将对象转换为字符串表示形式。 如果没有重写,应用对象将打印的是地址值。
- notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
- notifyall():解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
- wait():导致线程进入等待状态,并释放对象锁。直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
- finalize(饭no来吱):在对象被垃圾回收器回收之前调用。可以重写该方法来执行资源释放等清理操作。
8.常量(final)关键字的作用 他与finally,finalize的区别
final:
- 定义:在Java等编程语言中,final是一个关键字,用于表示某个变量、方法或类是不可变的。
- 用途:使用final关键字可以使变量成为常量,一旦赋值后不能修改;方法不能被子类重写;类不能被继承。
finally:
finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。
- 定义:在异常处理中,finally块是用来指定无论是否发生异常都要执行的代码块。
- 用途:无论try块中的代码是否抛出异常,finally块中的代码都会执行,例如关闭文件、释放资源等。
finalize:
- 定义:在Java等面向对象的编程语言中,finalize()方法是Object类的一个方法,当垃圾收集器决定回收对象时,会先调用该对象的finalize()方法。
- 用途:在这个方法中,你可以定义一些清理资源或执行必要操作的代码,以防止资源泄漏和其他问题。finalize()方法通常在对象的生命周期结束时被调用。
9.*Voliate,(单例模式)
单例模式:
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
特点
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
优点:
系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
Voliate:
volatile主要有两层语义:
- 内存可见性。
- 禁止指令重排序。
在实现单例模式时,通常会将构造函数私有化,并提供一个静态的getnstance()方法来获取单例对象。由于单例对象只会被创建一次,因此需要保证其线程安全性,避免多个线程同时访问导致的并
发问题。
在Java 1.5之前,通常使用双重检査锁定(double-checked locking)来实现单例模式的线程安全性,这种实现方式会在getlnstance()方法中使用synchronized关键字来保证线程安全,但synchronized关键字会影响性能。为了避免synchronized关键字的影响,可以使用volatile关键字来保证单例对象的可见性和原子性,从而保证线程安全性。
具体来说,当一个变量被声明为volatie时,它的值的修改会立即被其他线程可见,避免了多线程访问时出现的问题。在使用双重检查锁定实现单例模式时,使用volatile关键字可以保证在初始化单例对象时,多个线程能够正确地访问和修改变量。如果不使用volatile关键字,则可能出现多个线程同时访问变量导致的并发问题。
需要注意的是,使用volatile关键字不能完全避免线程安全问题,它只能保证可见性和原子性,不能保证有序性和互斥性。在实现单例模式时,需要考虑到多种因素,包括性能、可靠性和安全性等,选择最合适的实现方式。
10.Static的作用
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,
11.*String buffer和String 以及String builder的区别
12.==和equals的区别
13.Java当中的四种引用类型(后续补充)
二.集合
1.*Java当中有那些集合类
2.**HashMap的底层原理(存储结构,put的过程,0.75,8,6,16)
3.*ArryList和LinkdcList的区别
4.HashMap的HashTable的区别
5.*如何使用线程安全的Map
6.ConcurrentHashMap的原理
三.线程
1.*创建线程有几种方式
2.线程的生命周期
3.***线程池的原理以及7个参数是什么(有什么作用),4个拒绝策略是什么
4.线程安全,线程通信
5.*Reentrantlock和synchromied lock的区别
6.synchromied lock 修饰实例方法 静态方法 代码块 分别的含义
7.Sleep和wait的区别
8.什么是反射机制
9.*Cglib的动态代理和jdk的动态代理的区别
10.JVM内存模型(每一步分别放什么内容)
11.垃圾回收算法
12.Java当中的四种引用类型
13.(如何控制线程的执行顺序)
14.*接口和抽象类的区别
15.JDK1.8的新特性
16.什么是双亲委派
17.为什么需要双亲委派
四.Redis
1.Redis为什么快?(单线程,内存)
2.*Redis常用的数据类型(5个)
3.*Redis的持久化策略
4.数据淘汰策略
5.*Redis中的大K问题
五.Mysql
1.sql语句的执行顺序
2.***Mysql索引失效的场景
3.**Sql语句如何优化
4.***Mysql数据库的优化(数据库里加索引一定有效吗?一定效率快吗?)
5.Mysql中索引有哪些类型
6.*B+树索引和Hash索引的区别
7.Mysql为什么使用B+树索引而不使用B-树索引
8.*列举一些Mysql当中常用的聚合函数
9.列举Mysql开窗函数
10.行转列,列转行
11.****Mysql事务的隔离级别
12.*事务的四个特性
13.****Mysql是如何使用MVC解决,脏读,幻读,不可重复读现象的
14.*Mysql的七大日志
15.Union和UnionAll的区别
16.*Mysql中常用的日期函数和字符串函数
六.Linux
1.列举常用的Linux命令
ps , kill(和kill -9的区别), telnet, tail , source ,
top* ,grep |(管道符) ,mvn 查看帮助,history,cat,vim ,yum,rpm,ping ifconfig ipconfig