1.谈谈对java的理解
答:java是一种面向对象的语言,语言特性有封装、继承、多态、泛型、Lamda表达式等。
java是一种面向对象的语言,它具有跨平台性,一次书写,到处运行。因为java把源码通过javac编译,生成字节码.class文件,然后用jJVM(java虚拟机)的解释器再翻译成对应的机器码来运行。
java通过垃圾回收器(GC)回收和分配内存,大多数情况下程序员不用关注内存的分配和回收。
平常还会接触到JRE、JDK。JRE是java运行环境,包含了JVM和java类库等。而JDK可以看作是JRE的一个超集,提供了更多工具,比如编译器,各种诊断工具等。
另外:通过JVM的解释器将字节码转换成最终的机器码"。其实不太准确,绝大部分情况下Java都是通过解释执行的,但是常见的JVM都提供了JIT(Just-In-Time)编译器,也就是动态编译器,JIT可以在运行时将热点代码编译成机器码,那这部分代码就是编译执行了。
2.面向对象
答:面向过程是具体化的,侧重于怎么做。
面向对象(OOP)是模型化的,侧重于谁来做,基于面向过程而言,面向对象简单说是将功能封装到对象(数据和操作结合)里,可以让对象完成这些功能。
面向对象的底层其实还是面向过程,将面向过程抽象成类,然后封装。
面向对象的三大特性:封装、继承、多态。
封装:将内部的实现隐藏起来,然后只暴露必要的方法让外部调用。(封装隐藏了对象的属性和实施细节,私有属性和方法无法被访问,表现了封装的隐藏性,增加数据的安全性)
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
多态:多态性指允许不同子类型的对象对同一消息做出不同的响应。即:用同样的对象引用调用同样的方法做了不同的事情。
多态分为:编译时多态、运行时多态。方法重载(overload)实现的是编译时多态性(前绑定),根据实际参数的数据类型、个数和次序,java在编译时能够确定执行重载方法中的哪一个;方法重写(override)实现的是运行时多态性(后绑定),一般是指在执行期间(非编译期间)判断引用对象的实际类型,根据实际类型判断并调用相应属性和方法,主要用于继承父类和实现接口时,父类引用指向子类对象。
方法重写:是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
方法重载:重载(overloading) 是在一个类里面,方法名字相同,而参数列表不同(参数个数、参数类型或者参数的顺序不同),返回类型可以相同也可以不同。
3.死锁
所谓死锁,是指两个或者两个以上线程在执行过程中,因争夺资源而产生互相等待的现象,若无外力作用,他们都将无法推进下去,此时,称系统处于死锁。
死锁产生的四个必要条件:
(1)互斥条件:进程对所分配的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时,还有其它的进程请求该资源,则请求者只能等待。
(2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,但是该资源正在被其他进程占有,此时,请求进程阻塞,但又对自己所获得的资源保持不放。
(3)不剥夺条件:指进程已经获得的资源,在没有使用完之前,不能被剥夺,只能由该进程使用完后自己释放。
(4)环路等待条件:指在发生死锁时,必然存在一个进程资源的环形链,即进程集合{p0、p1、p2、p3、…pn}中的p0正在等待一个p1占用的资源,pn正在等待一个p0占用的资源。
避免死锁的解决办法主要有:
(1)死锁预防:破坏导致死锁必要条件中的任何一个就可以预防死锁。例如,要求用户申请资源时一次性申请所需要的全部资源,这就破坏了保持和等待条件。将资源分层,得到上一层资源后,才能够申请下一层资源,它破坏了 环路等待条件。
(2)死锁避免:避免是指进程在每次申请资源时判断这些操作是否安全。例如,使用银行家算法。
(3)死锁检测:死锁预防和避免都是事前措施,而死锁的检测则是判断系统是否处于死锁状态,如果是,则执行死锁解除策略。
(4)死锁解除:与死锁检测结合使用。它使用的方式就是剥夺。即将某进程所拥有的资源强行收回,分配给其他的进程。
4.java创建线程的方式
继承Thread类,重写run()方法,创建线程类(多个线程间无法共享线程类的实例变量);
实现Runnable接口,实现run()方法,创建线程类(互相共享资源);
使用Callable和Future创建线程。实现Callable接口,重写call()方法。
三种创建线程方法对比:实现Runnable和实现Callable接口的方式基本相同,但是后者执行call()方法有返回值;线程只是实现Runnable或者Callable接口,还可以继承其它类;继承Theread类的线程类不能再继承其它父类。do
5.多线程
6.如何保证线程安全?
保证操作的原子性、可见性、加锁。
原子性:操作的不可分割性。
可见性:一个线程在对变量修改之后其它线程立刻可见。
java保证线程安全的机制是加锁。内置锁:通过synchronized关键字实现的加锁机制,可分为同步方法和同步代码块。显示锁:lock,需要手动释放锁。
7.数据库索引了解多少,有哪几种?
索引是对数据库表中一列或者多列的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。
使用索引的目的:提高查询效率。
索引种类:唯一索引、非唯一索引、主键索引、聚集索引。