1、请对比synchronized与java.util.concurrent.locks.Lock的异同
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
Java中sleep和wait区别
- 这两个方法来自不同的类分别是Thread和Object
- 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。
- wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
2、作用域public、private、protected 以及不写时的区别
private修饰的成员变量和函数只能在类本身和内部类中被访问。
protected 修饰的成员变量和函数能被类本身、子类及同一个包中的类访问。
public修饰的成员变量和函数可以被类、子类、同一个包中的类以及任意其他类访问。
3、HashMap和Hashtable的区别
1.(同步性)HashTable的方法是同步的,HashMap不能同步。
2.(继承的父类不同)HashTable是继承自Dictionary类,而HashMap是继承自AbstractMap类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。
3.(对null key和null value的支持不同).HashTable不允许null值(key和value都不可以),HashMap允许使用null值(key和value)都可以。这样的键只有一个,可以有一个或多个键所对应的值为null。
4.(遍历方法不同)HashTable使用Enumeration遍历,HashMap使用Iterator进行遍历。
5.(初始化和扩容方式不同)HashTable中hash数组初始化大小及扩容方式不同。
6.计算hash值的方法不同。
Hashtable直接使用key对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数法来获得最终的位置。
7.(对外提供的接口不同 )Hashtable比HashMap多提供了elements() 和contains() 两个方法。
elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。
4、java创建对象的方式有哪些
1.使用new关键字
2.使用反射机制创建对象:
(1)使用Class类的newInstance方法
(2)java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。
3.使用clone方法:先实现Cloneable接口并实现其定义的clone方法
4.使用反序列化
5、JDBC使用步骤过程
1、加载JDBC驱动程序:
2、提供JDBC连接的URL 例子URL:jdbc:mysql://ip:端口号/数据库名称 jdbc:mysql://localhost:8080/Student
3、创建数据库的连接
4、创建一个Statement
5、执行SQL语句
6、处理结果
7、关闭JDBC对象
6、Java 抽象类:具有抽象方法的类一定为抽象类。
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不fv是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
7、Java 接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口与类相似点:
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
接口特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
抽象类和接口的区别
- 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
8、什么是Spring框架?
Spring框架:
Spring是一个J2EE框架,这个框架提供了对轻量级IoC的良好支持,同时也提供了对AOP技术非常好的封装。
相比其他框架,Spring框架的设计更加模块化,框架内的每个模块都能完成特定的工作,而且各个模块可以独立的
运行,不会相互牵制,因此,在使用Spring框架开发时,开发人员可以使用整个框架,也可以只使用框架内的一部分
模块,例如只使用Spring AOP模块来实现日志管理功能,而不需要使用其他模块。
Spring框架主要由7个模块组成,分别是Spring AOP、Spring ORM、Spring DAO、Spring Web、Spring Context、
Spring Web MVC、Spring Core等。
Spring框架图:
下面是各模块的作用:
Spring AOP:采用了面向切面编程的思想,使Spring框架管理的对象支持AOP,同时这个模块也提供了事务管理,
可以不依赖具体的EJB组件,就可以将事务管理集成到应用程序中
Spring ORM:提供了对现有ORM框架的支持,例如Hibernate、JDO等
Spring DAO:提供了对数据访问对象(Data Access Object,DAO)模式和JDBC的支持。DAO可以实现把业务逻辑与
数据库访问的代码实现分离,从而降低代码的耦合度。通过对JDBC的抽象,简化了开发工作,同时简化了对异常的
处理(可以很好的处理不同数据库厂商抛出的异常)
Spring Web:提供了Servlet监听器的Client和Web应用的上下文。同时还集成了一些现有的Web框架,例如Structs
Spring Context:扩展核心容器,提供了Spring上下文环境,给开发人员提供了很多有用的服务
Spring MVC:提供了一个构件Web应用程序的MVC的实现
Spring Core:Spring框架的核心容器,它提供了Spring框架的基本功能,这个模块中最主要的一个组件为BeanFactory,
它使用工厂模式来创建所需的对象。同时BeanFactory使用IOC思想,通过读取XML文件的方式来实例化对象,可以说
BeanFactory提供了组件生命周期的管理,组建的创建、装配、销毁等功能
9、get和post的区别: GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
1. GET与POST都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
其他区别:
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
-
GET产生的URL地址可以被Bookmark,而POST不可以。
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
-
GET请求只能进行url编码,而POST支持多种编码方式。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST么有。
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET参数通过URL传递,POST放在Request body中。
- 最后一个:描述Java类加载器的原理以及其组织结构
- 答:类加载的方式分为隐式装载(使用new穿件对象时)和显示装载(直接调用class.forName());Java语言中类分为三类:系统类,扩展类,自定义类他们有不同的类加载器,通过委托方式实现;类加载主要分为三步:(1)装载:根据查找路径找到相对于的class文件,然后导入 (2)链接-检查(检查待加载class文件的正确性)、准备(给类中静态变量分配存储空间)、解析(将符号引用转换成直接引用) (3)初始化:对静态变量和静态代码块执行初始化