1.使用length获取数组长度,public,protected,friendly,private的作用域?
数组名.length即可获取。
public | 当前类,同包,子类,其他包 |
protected | 当前类,同包,子类 |
friendly | 当前类,同包 |
private | 当前类 |
2.Conllection和Collections的区别?
Collection是一个集合接口(顶级接口),提供了对集合对象进行基本操作的通用接口方法。
Collections是一个包装类,其中有关于集合的操作方法(静态多态-->搜索排序等),不能实例化,服务于Collection框架。
3.String s = new String("abc")创建了几个对象?
创建了两个对象。 一个在堆中,一个在文字池中。
4.short s1; s1=s1+1;会报错吗?
如果short s1定义为全局变量,s1=s1+1会报错,提示类型不一致。
如果short s1定义为局部变量,s1=s1+1会报错,提示未初始化。
5. Overriding和Overloading区别
Overriding是重写,发生在子类和父类之间。需要子类的方法名和参数相同与父类相同,访问修饰权限大于等于父类,抛出的异常不大于父类。
Overloading是重载,在一个类中,多个方法的方法名相同,参数列表不同(参数类型,参数个数)。跟返回类型和访问修饰符无关,可以有不同的异常。
6.Set里面的元素不能重复,用什么来区分?
1.TreeSet子类是利用Comparable接口实现重复元素的判断。
2.HashSet是利用Object类中的hashCode()和equals()方法来判断的。
3.进行判断的时候首选利用hashCode()进行编码匹配,如果该编码不存在,则表示数据不存在。如果编码存在则进一步使用equals()对对象进行比较处理,如果重复,则不能继续保存。
4.set集合就是利用hashCode()和equals()来处理的,需要排序的时候才利用Comparable实现。
7.Collection详细描述
(每次只能保存一个操作对象)单值集合操作的最大接口。常用子类有List和Set。
List:允许保存重复数据。常见子类有三个ArrayList、Vector、LinkedList。
ArrayList:保存顺序即为存储顺序,允许有重复数据。数据类型为数组,jdk1.8后第一个插入元素会分配10个数据空间,发现不够会以1.5倍扩容。使用自定义对象的时候,需要对象覆写equals()方法。
LinkedList:基于链表实现,允许为null。
Vector:数据结构也是数组,实例化时默认创建10个数据空间。其中操作方法是通过synchronized同步处理,是线程安全的。性能不如ArrayList。
Set:最大的特点是不能保存重复数据,子类一般使用HashSet和TreeSet
HashSet子类,保存的数据无序,通过hashCode()方法和equals()方法判断重复数据。
TreeSet基于平衡二叉树实现,子类中保存的数据是有序的,需要自定义类实现Comparable来确认是否重复。
8.Map接口简介
Map是进行二元偶对象保存的最大父接口。常用子类有HashMap,HashTable,TreeMap、LinkedHashMap。
注意:自定义类作为Map的key,需要在自定义类中覆写equals()和hashCode()方法。
HashMap:数据存储无序,键和值可以为null。
默认16个数据空间,超过空间0.75(12)个时,成倍扩容。
JDK1.8开始如果保存的数据超过8个由链表转换为红黑树存储,并利用左旋和右旋保证数据的查询性能。
LinkedHashMap:基于链表实现,保存顺序即为存储顺序。
Hashtable:键和值不允许为null,其中的方法是同步操作,线程安全。
9.常见的Runtime Exception?
NullPointerException :空指针异常 在要求使用对象的地方使用了null
ClassCastException :类型强制转换异常 类型不一致强制转换出现此异常
IndexOutOfBoundsException :下标越界异常 访问某个序列索引值小于0或大于序列大小时
NumberFormatException :数字格式化异常 将一个不满足数字类型的String转换为指定数字类型
SecurityException :安全异常 违反安全情况的异常。
10.error和Exception的区别?
两者都继承Throwable类。Error表示系统的错误和程序不必处理的异常,是java运行环境中的内部错误或硬件问题。对于这种错误,程序基本无能为力,除了退出运行外别无选择,是由java虚拟机抛出的。
Exception表示需要捕捉或需要程序进行异常处理,处理的问题是程序设计的瑕疵而引起的问题或在外的输入等引起的一般性问题。是程序必须处理的。
Exception又分为运行时异常和受检查异常。
运行时异常,表示无法让程序恢复的异常,导致的原因是因为执行了错误的操作,建议终止程序。
受检查异常,表示程序可以处理的异常,(由程序自己接受异常并作出处理)
11.抽象类和接口的区别?
抽象类中可以有构造方法,接口中没有。
抽象类中可以有普通成员变量,接口中没有普通成员变量。
抽象类中可以包含静态方法,接口中不能包含静态方法(jdk1.8之前)
一个类可以实现多个接口,但是只能继承一个抽象类。
接口可以被多重实现,抽象类只能被单一继承。
如果抽象类实现接口,则可以把接口方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口方法。
相同点: 都可以被继承
都不能被实例化
都可以包含方法的声明
都有静态方法(jdk1.8之后)
派生类必须实现未实现的方法
12.final finally finalize的区别?
final可以用来修饰变量,修饰方法,修饰类。
修饰变量表示该变量变为常量,处理化后不能修改。
修饰方法表示该方法不能被重写。
修饰类表示最终类,不能被其他类所继承。
finally是异常处理的一部分,只用用于try/catch语句中,附带一个语句块,表示语句最终一定会被执行(特殊情况,finally对应的try语句块没有被执行/终止虚拟机运行System.exit(0))。
finalize每个对象都有,当该对象要被回收时调用。可以实现finalize方法,在对象被回收的时候释放一些资源。
13.equals()和hashCode()方法
两个对象equals()相等,则hashCode()一定相等,反之不一定成立。
14.值传递和引用传递?
值传递是传递过程中将实参的值复制一份传递到方法中,在方法中操作形参的值不会影响到实参的值。在大量数据传递下,效率低。
引用传递是将对象的地址传给方法,在方法中实参和形参内容相同,都指向同一块内存空间,方法的执行会影响到实际对象。
15.switch可以接受的数据类型有哪些?
byte,short,int,char(jdk1.6),枚举,String(jdk1.7)
16.GC?
GC是java中的垃圾回收器,主要用于发现没有用的对象。回收被对象占用的内存空间以便程序再次使用。使java程序员编程时不再考虑内存管理,可以防止内存泄漏,有效的使用空闲内存。
常用算法有引用计数法,给每个对象添加引用计数器,当有一个地方引用他,计数器+1,引用失效时-1。为0时执行回收。
可达性分析算法:以根基对象为起始点进行搜索,如果有对象不可达,即是垃圾对象。
17.String,StringBuffer与StringBuilder的区别?
String对象声明后不可改变,改变的只是内存的指向。
StringBuffer需要通过构造方法实例化,在进行字符串处理时,可以修改字符串。线程安全
StringBuilder需要通过构造方法实例化,在进行字符串处理时,可以修改字符串。线程不安全。速度比String和StringBuffer快。
18.面向对象的特征?
三大特征
封装:隐藏对象的属性和实现细节,仅对外公开接口。使用者可以不必了解具体的实现细节,只是通过外部接口,以特定的访问权限使用类的成员。
继承:子类可以继承父类的特征和行为,提高代码复用率。
多态:同一行为具有多个不同的表示形式,是指一个类实例的相同方法在不同的情形有不同的表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。不同的对象,操作不同,通过一个公共类,可以通过相同的方式调用。
五大基本原则:
单一职责原则:一个类应该只有一项工作。
开放封闭原则:对象或实体对扩展开发,对修改封闭
里氏替换原则:对父类的调用同样适用于子类
依赖倒置原则:高层次的模块不应依赖低层次的模块,他们应该都依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
接口隔离原则:不应强迫客户端去实现一个它用不上的接口,使用多个专门的接口比使用单个接口要好的多。
19.运行时异常和一般异常的区别?
受检查异常java要求程序员对其进行try catch处理。
运行时异常可以不处理,由虚拟机处理。系统会一直往上抛异常,直到出现处理代码。可能会发生线程终止或主程序终止。
20.heap和stack的区别?
heap表示堆,stack表示栈。
栈内存的空间是由操作系统自动分配和释放,堆内存是手动审核,释放。
栈内存表示程序进入一个方法后,会为这个方法分配一块存储空间,用于存储这个方法的内部变量。当方法结束后,空间会被释放。
堆内存存储方法中final修饰的变量,new创建的对象,不会随方法的结束而消失。在java中声明对象时,先在栈中为其分配空间,在new之后,则在堆中分配内存地址。
21.Java中的异常处理机制的简单原理和应用
当程序违反了java语义规则时,java虚拟机会将发生的错误表示为一个异常。
1.java类库内置的语义检查。
2.java允许程序员扩展这种语义检查,可以创建自己的异常。并自由选择在何时用throw关键字引发异常。
22.JVM加载Class文件的原理和机制
java中的类,都需要由类加载器装载到jvm中才能运行。类加载器需要把class文件读入到内存中。
java类的加载是动态的,并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类完全加载到jvm中,其他类在需要的时候才加载,可以减少内存的消耗。
java的类加载器有三个,对应三种类
Bootstrap Loader :负责加载系统类 jre/lib/rt.jar
ExtClassLoader:负责加载扩展类 jre/lib/ext
AppClassLoader:负责加载应用类(自定义的类) classpath环境变量
三个类加载器各自完成自己的工作,通过委托模型机制进行协调
委托模型机制原理:当类加载器加载类的时候,先请示Parent(上一层加载器)搜索路径载入,如果找不到才在自己的搜索路径搜索该类。加载器自上而下的搜索,因为加载器必须保证基础类的加载。
加载器的原理:装载,查找和导入class文件。
连接: 检查,检查载入的class文件的正确性。
准备,为类的静态变量分配存储空间,初始化默认值。
解析,将符号引用转换为直接引用(可选)
初始化:初始化静态变量,静态代码块。
23.数据结构
线性表是最常用且简单的数据结构,是n个数据元素的有限序列。
实现方式两种:数组/链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必再内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一节点,当需要添加或删除时,只需要改变相关节点的next的指向即可,效率高。
24.java中有几种类型流,分别有什么抽象类?
java中的流分为两种,字节流和字符流。InputStream,OutputStream,Reader,Writer。字符流处理2个字节的Unicode字符,字节流处理1个字节的Unicode字符。
25.java会存在内存泄漏吗?
会,1.长生命周期的对象持有短生命周期对象的引用。
26.什么是java序列化,如何序列化?
序列化是一种处理对象流的机制,所谓对象流就是将对象的内容流化。可以对流化后的对象进行读写操作,也可以将流化的对象传输与网络之间。
实现序列化需要对象实现java.io.Serializable,此接口没有方法,只表示实现它的类可以被序列化的能力。
27.java如何跳出多重循环?
抛异常跳出多重循环
使用条件标识符控制循环
给循环添加标记,更精准的控制循环
28.java中实现多线程的方法,用什么关键字修饰同步方法
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口通过FutureTask包装器创建线程
用synchronized修饰同步方法
29.同步和异步的区别?
同步指发送一个请求,需要等待返回,然后才能发送下一个请求。有等待过程
异步指发送一个请求,不需要等待返回,可继续发送下一个请求。
30.线程同步的方法
使用synchronized关键字。修饰静态方法时会锁住整个类。
wait和notify
使用重入锁实现线程同步ReentranLock类
使用局部变量
使用阻塞队列实现线程同步
31.11位手机号的正则
^[1][3,5,7,8][0-9]{9}$
32.run()和start()区别?
run()是线程体,start()用于启动线程。
33.webService?
一组模块化的API,可以通过网络调用,执行远程系统的请求服务。
34.servlet的声明周期,与CGI的区别?
1.加载2.初始化 3.实例化 4.处理请求 5.销毁
35.Sleep()和wait()的区别?
sleep()属于Thread类,wait()属于Object类
sleep()不会释放对象锁
wait()会释放对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()后本线程才进入对象锁定池准备获取对象锁,进入运行状态。
36.什么是反射,如何实现的?
在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用他的属性和方法。这种动态获取信息以及动态调用对象的方法称为java的反射机制。
实现:通过Class.forName("")加载字符串,可以得到该字符串代表的Class对象。
通过类名调用class属性得到class对象。
调用实例getClass()方法。
如果是基本类型的包装类,可以通过调用包装类的Type属性获取该包装类的Class对象。
37.Tcp/ip的三次握手?
在tcp/ip协议中,tcp协议提供可靠的连接服务,连接是通过三次握手进行初始化的。所谓的三次握手是指建立一个TCP连接时需要客户端和服务器端共发送三个包已确认连接的建立。三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。
第一次握手:客户端发送一个TCP标志位SYN=1,ACK=0的数据包给服务端,并随机产生一个Seq=J,当服务端接受到这个数据后服务端由SYN=1得知客户端想要建立连接
第二次握手:服务器要对客户端的联机请求进行确认,向客户端发送应答号ACK=1、SYN=1 确认号Ack=J+1,此值是客户端序列号加1,还会产生一个随机的序列号Seq=K,这样就告诉客户端可以连接。
第三次握手:客户端接收到请求后检查Ack是否为J+1,以及标志位ACK的值是否为1,若为1,则会发送ACK=1、确认号Ack=K+1,告诉服务端,你的请求连接已被确认,连接可以被建立。Client和Server进入ESTABLISHED状态,完成三次握手,之后服务器和客户端就可以开始传输数据了。
38.Http协议的几种请求方法,区别?
options:允许客户端查看服务器性能
head:获取响应消息头的元信息
get:向特定资源发出请求
post:向指定资源提交数据进行处理请求
put:向指定资源上传其最新内容
delete:请求服务器删除标识的资源
track:回显服务器收到的请求,主要用于测试或诊断
connect:Http/1.1中预留给能够将连接改为管道方式的代理服务器
39.ajax是否可以设置为同步
可以,将async设置为true即可
40.Spring中的事务管理有哪几种方式,如何实现的?
声明式事务:注解方式使用@Transactional注解,可以用在需要事务的方法上。/基于xml配置文件的形式
编码方式:在方法执行前后进行拦截,再目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚。
41.Spring常用注解
@Component:标注一个普通的springbean类
@Repository:标注一个DAO组件
@Service:标注一个业务逻辑类
@Controller:标注一个控制器类
@Autowired:为类的属性,构造器,方法进行注值
@RequestMapping:将url映射到整个处理类或特定的处理请求的方法
@RequestParam:将请求的参数绑定到方法中的参数上
@ResponseBody:将返回类型输入到response body中
42.Hibernate的缓存级别?
43.Hibernate是什么,工作原理?
Hibernate是封装了JDBC的一种开源代码的对象/关系映射(ORM Object-Relation Mapping)框架,使程序员可以使用面向对象的思想来操作数据库。
Configuration读取Hibernate的配置文件和映射文件中的信息,通过hibernate配置文件生成一个多线程的SessionFactory对象。
然后多线程SeesionFactory对象生成一个线程Session对象;Session生成Query对象或Transaction对象,可以通过session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除等。
在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些数据到数据库中。
44.Hibernate的延迟加载?
延迟加载也称之为懒加载,是Hibernate为提高程序执行效率而提供的一种机制,只有真正使用该对象的数据时才创建。
Hibernate中主要通过代理(proxy)机制来实现延迟加载。具体过程:Hibernate从数据库获取某个对象时,或获取某个对象的集合属性时,或获取一个对象所关联的另一个对象时,由于没有用到该对象的数据,hibernate并不从数据库中加载真正的数据,而只是为这个对象创建一个代理对象来代表这个对象,这个对象的所有属性都是默认值;只有在真正需要使用该对象的数据时才创建这个真实的对象,真正从数据库加载它的数据,这样在某些情况下,可以提高查询效率。
调用session上的load()加载一个实体时,会采用延迟加载。
当session加载某个实体时,会对这个实体中的集合属性值采取延迟加载。
当session加载某个实体时,会对这个对象所有单端关联的另一个实体对象采用延迟加载。
45.Hibernate如何处理类之间的关系?
通过配置文件中的 many-to-one、one-to-many、many-to-many来实现类之间的关系
46.Spring是什么?
Spring是一个开源框架,为了解决企业级应用程序开发的复杂度而创建的。是一个轻量级的控制反转和面向切面的容器框架。
IOC:当某个角色需要另一个角色协助的时候,在传统的程序设计中,通常由调用者来创建被调用者的实例。在Spring中创建被调用者的工作不再由调用者完成,因此称之为控制反转。创建被调用者的工作由spring来完成,然后注入调用者。因此成为依赖注入。Spring容器启动的时候会把appilcation.xml中配置好的bean都初始化,在需要调用的时候,把已经初始化的bean分配给你要调用的bean,而不是去创建一个对象的实例。
ioc常见的容器有ApplicationContext和BeanFactory
AOP:将安全,事务,权限等程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,提高复用性。
47.Spring的优点?
降低了组件间的耦合性,实现了软件各层之间的解耦
可以使用众多服务
提供aop技术,利用它很容易实现如权限,监控等功能。
低侵入式设计,代码污染低
独立于各种应用服务器
DI机制降低了业务对象的复杂性
48.Mybatis的工作流程
读取配置文件mybatisConfig.xml(数据库连接信息,map配置文件的位置)
引用map文件方式
相对路径引用
绝对路径引用
包路径引用
建立sqlSessionFactory(读取配置信息,与数据库连接 生命周期为程序级,程序开始运行建立,程序结束消亡)
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader)。
建立sqlSession进行数据库操作 (生命周期,过程级。如在方法中建立sqlSession,方法执行完之后消亡)
SqlSession session = SqlSession.openSession();
可通过session提供的方法进行操作
操作完成后关闭session
49.Mybatis中的#和$
使用#引用参数的时候,Mybatis会把这个参数认为是一个字符串,并自动加上'',是预编译的,是安全的;
使用$引用参数的时候,Mybatis会直接替换参数。存在sql注入危险。
50.数据库中的索引和约束?
约束被用来对数据业务规则和数据完整性进行实施、维护。常见的约束有主键约束(以一列或多列的组合用以唯一标识表中某行数据)。外键约束,检查约束,唯一约束等
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
51.sql实现分页
数据量小时可以用limit实现分页,需要传递页码和每页条数
数据量达到万级或百万级需要用主键或索引进行分页(id自增)
52.百万级别数据库优化方案?
对数据查询,尽量避免全表扫描,考虑在where或order by涉及的列上建立索引。
尽量避免在where子句中对字段进行null值判断。
避免在where字句中使用or来连接条件
in和not in慎用,会进行全表扫描
避免在where子句中对字段进行表达式操作。