一,基础。
1.JDK,JRE,JVM的区别?
JDK:是整个java的整体核心(开发环境),它包含了java运行环境,一堆java工具和java基础的类库。
JRE:java程序的运行环境集合,主要由java虚拟机,java平台核心类和若干支持文件。
JVM:java运行环境最核心的部分,是运行java程序最基本环境。
JDK>JRE>JVM;
2.GC是什么?
GC是垃圾收集机制(Gabage Collection)。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。
3.说出一些常用的类,包,接口,请各举5个
常用的类:BuffereReader BuffereWriter FileReader FileWirte
常用的包:java.long java.io java.awt java.util java.sql
常用的接口:Collection List Map Set Iterator
4.& 和 && 的区别?
按位与: a&b 就是转换为二进制然后进行与运算。
逻辑与(短路与): a && a就是当且仅当两个操作数为true,其结果才为true。
5.==和equals()都可以用于比较两个操作数是否相等,它们有什么区别?
==是一个关系运算符,基本数据类型用于判断两个值是否相等,引用数据类型中:两个引用变量的引用地址
是否相等。两个对象是否为同一个(判断内存栈中的内容)。
equals是一个方法,在Object类和==一样判断两个对象是否相等,一般在具体对象中重写方法,用于判断变量引用地址指向的存储内容是否相等。两个对象所指内存堆中的内容是否相等。
6.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
7.在JAVA中,如何跳出当前的多重嵌套循环?
用break,和return。
8.作用域public,private,protected,以及不写时的区别
作用域 当前类 同包 子孙类 其他
public √ √ √ √
protected √ √ √
friendly √ √
private √
不写时默认为friendly
9.Java常用的设计模式?说明工厂模式。
Java中的23种设计模式:Factory(工厂模式),Builder(建造模式), Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)。
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
10.short s1 = 1; s1 = s1 + 1;有什么错?short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译)
11.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte,String。
12.面向对象:
- 面向对象的特征有哪些方面?
封装、抽象、继承和多态。
封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性;(简而言之就是隐藏一些细节,外部不能直接访问。)
抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言是由抽象类来体现的。比如鸟就是一个抽象实体,因为抽象实体并不是一个真正的对象,它的属性还不能完全描述一个对象,所以在语言中体现为抽象类不能实例化;
继承:继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;
多态:多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为。
2.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
Override重写:是父类与子类之间的多态性的一种表现
方法名相同,参数类型、个数相同,返回类型也要相同
Overloaded重载:是一个类中多态性的一种表现
方法名相同,参数类型、个数不同,跟返回值无关
Overloaded的方法是可以改变返回值的类型。
3.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
4.abstract class和interface有什么区别?
抽象类:1)仅仅只是声明方法,没有方法体的类,叫抽象类。
2)包含抽象方法的类一定是抽象类。抽象类可以包含完整的方法,也可以包含抽象方法,所以抽象类可以没有抽象方法。
3)抽象类是给子类继承的,抽象类不能实例化
接口:1)特殊的抽象类:所有的方法都是抽象方法,不能包含完整的方法
2)接口是给子类继承或实现的,不能实例化
3)接口可以多继承
5.接口和内部类、抽象类的特征。
接口:在一个类里,只有申明没有实现。
内部类:是在一个类的内部定义的一个类;
抽象类:是以abstract 定义的,里面至少有一个抽象方法。
6.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可继承实体类,但前提是实体类必须有明确的构造函数。
7.java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
8.静态变量和实例变量的区别?
1) 静态变量是类加载时创建,实例变量是创建对象(new)时创建。
2)静态变量是程序退出时释放内存,实例变量是对象不存在时释放内存。
3)静态变量是所有对象共享,是属于类的,实例变量是每个对象独有的。
4)静态变量可通过类名来调用,实例变量只能通过对象名来调用。
9.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
10.什么是内部类?用内部类有什么好处?
定义在一个类内部的类被称为内部类。
内部类的优点有一下几点:
a.内部类对象能访问其所处类的私有属性和方法。
b.内部类能够隐藏起来,不被同一个包中的其他类访问。
c.匿名内部类可以方便地用在回调方法中。
11.写clone()方法时,通常都有一行代码,是什么?
Clone 有缺省行为,super.clone();它负责产生正确大小的空间,并逐位复制。
12.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
13.一个“.java”源文件是否可以包含多个类?有什么限制?
可以包含多个类,但只能有一个public的类,并且该类的名字必须和文件名一致
二,容器模块
18.java 的容器有哪些
java容器分为Collection和Map两大类。子类:
Collection
List
ArraysList
LinkList
Vector
Stack
Set
HashSet
TreeSet
Map
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable
2.Collection和Collections有什么区别:
Collection:是一个集合接口,他提供了对集合对象进行基本操作的通用接口方法,所有集合都是他的子类,比如:List,Set,等
Collections:是一个工具类,包含了很多静态方法,不能被实例化,比如提供排序方法:Collections。sort(list)
3.List,Set,Map之间的区别:
List:存储一组有序的,可重复的元素。主要有三类:
ArrayList | 内部用数组存储;非线性安全;查询数组快 |
LinkedList | 内部用链表存储;非线性安全;查询慢 |
vector | 内部用数组存储;线性安全;效率低 |
Set : 存储一组无序的,不可重复的元素。(相同的对象只能存放一个)获取元素只能遍历。
HashSet | 必须使用HashCode方法,数据无序,可存放null, |
TreeSet | 二差树实现,自动排序,不允许存放null,一般不用Set的接口来引用,使用其子接口ortSet |
Map: 提供一种映射关系,其中元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value
4.异常中常见的面试题:
- java中什么是Exception,Error?他们之间有什么关系?有什么区别?
联系:Exception 和Error 两者都是继承 Throwable类。 区别: Error指出错。(不是编译出错,而是程序运行过程中发生的错误),一般发生在jvm中。这些错误是程序员无法处理的。不可控制的。 Exception:异常,是程序员可以处理的可被catch捕获。可以是可控制的,也可是不可控的。 |
- Java中的检查型异常(checked exception)和非检型异常(runtime exception)有什么区别?
检查型异常:这类异常是由外部一些偶然因素所引起的。Java编译器强制要求处理。也就是说程序必须对这类异常进行处理。 (常见的受检异常:Exception FileNotFoundException IOException SQLException) 非检查型异常:这类异常时程序员编程逻辑问题,java编译器不强制要求处理。 (常见的非受检异常:NUllPointerException ClassCasException ArrayIndexsOutOfBoundsException ArithmetichException(算术异常)) |
- Throw 和throws 这两个关键字在java中有什么不同?
相同点:两者都是用于异常的抛出处理。 不同点:
如:public int read() throws IOException,FiledNotFoundException{..} Throw后是一个被抛出的异常对象。 |
- Java 中final finalize,finally关键字的区别?
final 当这个关键字修饰一个类时表示最终类,意味着他不能派生出新的子类,也就是说不能被继承,因此一个类不能被同时声明为abstract和final。当final修饰变量或者方法时,可以保证他们在使用中不会被改变。被声明为final的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改。同样,当final修饰一个方法时,这个方法不能被重载,也不能重写,但可以继承。 finally 异常处理时提供finally来执行任何清楚操作(必须执行的代码块)。如果抛出一个异常,那么相匹配的catch子句就会被执行,然后控制就会转入finally块。 finalize 方法名。finalize方法在垃圾回收器执行内存对象清理时会调用finalize()方法进行前期的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
|
5.为什么针对安全保密的信息,char[]比String更好?
String是不可变的,一但创建就不可以更改,而char[]数组创建后可以随时可以更改,而不会保留原始数据。所以char[]比String更好。 |
三. IO
1.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流字符流。字节流继承于InputStream OutputStream。字符流继承于InputStreamReader OutputStreamWriter.在java.io包中提供了许多其他流,主要为了提高性能和使用效率。
2.字节流和字符流的区别。
字节流在本身操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流操作的时候使用到缓冲区的。
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
3.什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
4.文件读写的基本类。
File Reader 类和FileWriter类分别继承自Reader类和Writer类。FileReader类用于读取文件,File Writer类用于将数据写入文件,这两各类在使用前,都必须要调用其构造方法创建相应的对象,然后调用相应的read()或 write()方法。
5.串行化的注意事项以及如何实现串行化。
如果有循环引用是不可以串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法
四.进程和线程
1.进程和线程的关系:
1.进程是操作系统来管理的,而线程是由进程控制的。
2.不同进程的内存都是完全独立的;一个进程内的不同线程则是共享本进程的内存和资源,不同线程之间有可能发生并发冲突。
3.线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈
4.一个进程中的所有非守护线程退出后,进程也会退出。
5.不同线程之间是并发运行的,他们之间的运行顺序是由操作系统调度的,是随机的,但是,一个线程内部还是按照程序的流程顺序执行,和线程调度是没关系的。
2.run方法和start方法的区别:
* 1.run方法是定义在runable接口中的方法,当线程启动后,jvm来调用run方法(线程的入口方法)
* 2.start方法。启动线程方法。该方法定义在Thread类中。需要认为调用来启动指定的线程(调用start方法
之后,只是让线程进入到就绪状态-可执行状态,然后得到执行资源的时候再进行执行(执行run方法中的指令))
3.jion ,yield,sleep的区别:
jion方法:等待指定的方法执行完再执行当前线程。
yield礼让方法。暂停当前线程的执行,而让其他线程去执行。
sleep:让线程休眠设置时间再执行。
4. sleep() 和 wait() 有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
5.synchronized的使用:
1.任意的一个对象都可以成为锁对象。
2.在同步代码块调用了sleep方法并不释放锁对象。
3.只有真正存在线程安全问题时候才使用同步代码块,否则会降低效率
4.多个线程操作共享数据的锁对象必须是同一个锁,否则加锁无效。
五,网络编程
1.socket通信(tcp/udp区别及JAVA的实现方式)?
TCP——传输控制协议,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。UDP——使用者数据元协议,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。
大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无关紧要。
2.如何利用socket实现基于TCP和UDP的通信?
基于TCP实现计算机之间的通信,需要编写客户端和服务器端程序,在客户端主要使用Socket类,在服务器端主要使用ServerSocket类。
基于UDP实现计算机之间的通信,发送端,创建一个UDP的socket(数据报套结字DatagramSocket),socket.send发送。
接收方sock.receive()是一个阻塞方法,等待发送方消息。
六.数据库:
1.范式:
1NF:数据库表中的字段都是单一属性,不可以再分。
2NF:在一范式的基础上,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖
3NF:在二范式的基础上,数据库表中不存在非关键字段对任一候选关键字段的传递函数依赖。
2.事物的ACID属性
原子性:事物是一个不可分割的整体,事物要么发生,要么不发生。
一致性:事物必须使数据库从一个一致性状态转变到另一个一致性状态
隔离性:一个事物执行时不被另外的事物干扰
持久性:一个事物一旦提交,它在数据库的改变就是永久的。