1面向对象的特征有哪些方面?
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象。
继承:继承就是从已有的类得到继承信息创建新类的过程
封装:封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过己定义的接口
多态:多态指的是允许不同的子类型的对象对同一个消息做出不同的响应
2.解释下内存中的栈(stack)、堆(heap)、静态区的用法
定义一个基本数据类型的变量,还有一个就是函数调用的现场保存都是使用内存中的栈,而new一个对象和构造器创建对象都是放在堆空间中,若直接书写100、“helloworid”和常量都是放在静态方法区。
3.重载和重写的区别
重写(Override):从字面上来看,重写就是冲新写一遍的意思,其实就在子类中把父类本身的方法重新写一遍,方法名、参数列表、返回类型必须相同,访问的修饰符一定要大于被重写的访问修饰符,
重载(Overload):在一个类中,一个方法如果有不同的参数列表则视为重载,同时,重载返回类型没有要求,可以相同或不同,是一个类中多态性的一个表现
4.equals与==的区别
==:比较的是变量(栈) 内存中存放的对象的(堆)内存地址,判断两个对象的地址是否相同,比较的是指针操作,比较的是操作符两端的操作数是否是同一个对象,两端的操作数必须是统一类型的
equals:比较两个对象的内容是否相等
5.HashCode的作用
hashcode他返回的就是根据对象的内存地址换算出来的一个值,当集合添加元素时,先调用这个元素的hashcode方法,就能定位到应该存放的物理位置上,若这个位置上没有元素,可以直接存储到这个位置上不用做任何比较,入这个位置上有元素,就调用他的equals方法进行比较,若相同就不存,不相同就散列其他的地址
6.String、StringBuffer和StringBuilder的区别
String:只读字符串,他不是基本数据类型,而是一个对象,每次对String操作都生成新的String对象
StringBuffer:对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
StringBuilder:没有对方法进行加同步锁,所以是非线程安全的
6.Array(数组)
是基于索引index的数据结构,使用索引在数组中搜索和读取数据是很快的,获取数据的时间复杂度是O(1)但删除数据却是开销很大的,因为这需要重排数组中的所有数据
7.ArrayList和LinkedList的区别
首先先说与一下List,list是一个有序集合,可以包含重复元素,提供了按索引访问的方式,继承于Collection,
List集合:有两个重要的实现类ArrayList和LinkedList,ArrayList的toArray方法返回是一个数组,asList方法返回是一个列表,ArrayList底层是Array实现的
LinkedList:是一个双向链表在添加和删除元素时有很好的性能,但是在get和set方面弱于ArrayList
8.HashMap和HashTable的区别
HashTable线程同步,HashMap非线程同步
HashTable不允许<key,value>有空值, HashMap允许<key,value>有空值
HashTable继承于Dictionary类,HashMap继承于AbstractMap类
9.MVCC解决的问题是什么
MVCC是一种用来解决数据库读写冲突的无锁并发控制,为事务分配单项增长的时间戳,可以为数据库解决并发数据库时,可以做到读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能;解决了脏读、幻读不可重复读等事务隔离问题,但不能解决更新丢失问题
10.final用法
被final修饰的类不可以被调用
被final修饰的方法不可以被重写
被final修饰的变量不可以改变
11.static用法
静态变量和静态方法,也就是被stataic修饰的变量、方法都属于类的静态资源,类实例所共享,stataic也可以用于静态代码块
12.线程
线程与进程相似,但线程是一个比进程更小的执行单位,一个进程包含多个线程
13.IO流
按照流的流向分为输入流和输出流
按照操作单元划分可以分为字节流和字符流
按照流的角色划分分为节点流和处理流
14反射的作用与原理
反射机制是运行时对于任何一个类,都能知道这个类的所有属性和方法,对于任意个对象,都能调用他的任意一个方法,在java中,只要定义好类的命中,就可以通过反射机制来获取类的所有信息,JDBC就是典型的反射,
反射的实现方式:获取Class对象
1)Class.forName(“类的路径”);
2)类名.class
3)对象名.getClass()
4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象
实现java反射的类:
1)Class:表示正在运行的java应用程序中的类和接口
2)Field:提供有关类和接口属性信息,以及对它的动态访问权限
3)Constructor:提供关于类的单个构造方法的信息以及他的访问权限
4)Method:提供类或接口中某个方法的信息\
15.Java中实现多线程的几种方法
继承Thread类;实现Runnable接口;实现Callable接口通过FutureTask包装器来创建Thread线程;
16如何停止一个正在运行的线程
1)使用退出标志,使线程正常退出,也就是说当run方法执行完以后线程终止
2)使用stop强制停止,但不推荐这种方法,因为stop和suspend及resume一样都是过期作废的方法
3)使用interrupt方法中断线程
17notify和notifyAll有什么区别?
notify可能会导致死锁,而notify则不会,任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized中的代码使用notifyAll,可以唤醒所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个
18.sleep和wait有什么区别
sleep方法是属于Thread类中的sleep方法导致了程序暂停执行指定的时间,让cpu切换其他线程,但是它的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁,而wait方法是属于Object类中的,当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态
19.Thread类中的Start()和run()方法有什么区别?
start()用来启动新的线程,而stat()内部调用了run()方法,这和直接调用run()方法不一样,当你调用run方法的时候,只会在原有的线程中调用,没有新的线程启动,start方法才会启动新的线程
20说一下你对synchronized关键字的了解
synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证它修饰的方法或者代码在任意时刻只能有一个线程执行