1.面向对象的特征
答案:继承、多态、抽象、封装
继承:子类可以继承父类,但是只能继承一个
多态:重写(子类重写父类的方法),重载(同一个类中方法参数类型或者个数不一样)
抽象:把事务抽象出来,数据抽象(类的属性),方法抽象(类的方法)
封装:类,可以把属性、方法封装起来,允许可信的其他类调用;
2.final, finally, finalize 的区别
final可以修饰类(表示该类是最终类,不可被继承)、方法(表示该方法是最终方法,不可被重写,但是可以重载)、变量(表示该变量是最终变量,不可修改)
finally用在try catch后面,最终要执行。即使try中return返回。
finalize可以为任何一个类添加,主动回收内存,在垃圾回收前调用。finalize原理。
3.int 和 Integer 有什么区别
int属于基本类型,而Integer属于包装类型。java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127)
Integer i5 = 127;
Integer i6 = 127;
i5 == i6 return true;
如果
Integer i5 = 128;
Integer i6 = 128;
i5 == i6 return flase
4.重载和重写的区别:
重载是同一个类中,方法名相同,形参个数和类型不同的描述。
重写(覆盖)是子类重写父类的方法(形参和返回值必须相同,子类必须重写父类的abstract方法,不能重写父类的final方法)
5.抽象类和接口有什么区别
抽象类是用abstract修饰的类,一定有抽象方法,可以有非抽象方法;抽象方法必须被子类实现;抽象类被子类继承
接口是接口,所有方法都是抽象方法,被类实现。
6.说说反射的用途及实现
反射机制是指在JVM运行时,对于任何一个对象,都能动态知道它的类、属性和方法。应用:ide使用时,按点自动加载出方法,属性;还有各种框架比如spring,
先在xml中配置好,等到需要使用时在加载。
三种实现方式:
对象的getClass()方法;
forname()方法,Class.forName("全限定类名")
Person.class 从类中获取。
7.说说自定义注解的场景及实现
各种框架Spring、springMVC等,验证属性完整性等
实现:@interface xxx {},通过反射检测是否使用注解,getAnnottion
8.HTTP 请求的 GET 与 POST 方式的区别
http格式:请求行、请求头、空行、消息体
状态行、响应头、空行、消息体
GET产生一个数据包;POST产生两个数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
9.session 与 cookie 区别
session是一种上下文机制,作用于服务端,可以存在数据库、集群或者文件中。用户首次发起请求,服务端会产生一个SessionID,用来保存用户的登录信息。
同时,cookie作用于客户端,用来跟踪用户的状态,分为浏览器cookie和文件cookie。用户再次请求时,服务端会检查cookie是否带有sessionid。
cookie 存在本地文件中,可能不安全。而session是存在服务端的。
10.说说session的分布式处理
问题起因:现在的web-server都是分布式部署,nginx代理。如果第一个请求,分发到1号web-server上;客户端再次请求就不应定分发到1号服务器上,session保存就没有用。
解决方案:
1.session同步复制。(所有的web-server都赋值一份相同的,保存到各个服务器上。优点是简单。缺点显而易见,所有的web服务器都需要复制,占用带宽;而且数据量受内存限制)
2.客户端存储法。客户端cookie
3.反向代理hash一致性。(ip一致性,nginx将ip一致的请求发送到一个服务器上;七层:根据应用id来分发。)
4.后端存储。数据库或者缓存。 web-server重启或者扩容都不会有session丢失,没有安全隐患。缺点:需要增加一次网络调用。
11.HashMap的工作原理
通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,
HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,
并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,
如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。
12.hashmap和hashtable的区别:(两者都是无序的)
hashmap非线程安全,允许value为null
hashtable是线程安全,不允许null
单线程hashmap快。Synchronize
13.ConcurrentHashMap:
线程安全,hashtable升级。
1.7版本,最小粒度是segment数组和hashentry,put、get要进行两次hashcode()计算。
1.8版本,最小粒度是hashentry
14.JDBC 流程
第一步;加载Driver类,注册数据库驱动
第二部:通过DriverManager,使用url,用户名和密码建立连接;
第三步:通过connection,使用sql语句打开Statement对象
传入参数,之所以这样是为了防止sql注入
preparedStatement.setInt(1,18)
第四步:执行语句,将结果返回resultset
第五步:关闭连接
15.MVC 设计思想
Model View Controller
16.equals 与 == 的区别
基本数据类型使用== 比较的是他们的值;引用数据类型==比较的是他们的堆内存地址,因此比较引用数据类型的值需要用equals
17.runnable和callable有什么区别?
callable是1.5版本新增的,最大的区别是实现callable接口的线程能返回执行结果;而实现runnable接口的线程无法返回执行结果。call()方法能够允许抛出异常,而run()只能内部处理异常。
集合:
1.List 和 Set 区别:
list允许重复元素,set不允许重复元素
2.List 和 Map 区别
list存放单个元素,map存放key-value键值对。hashmap、treemap,treemap有序。
3.Arraylist 与 LinkedList 区别
Arraylist 与 LinkedList 区别:
Arraylist基于动态数组,LinkedList基于链表。
一般来说,ArrayList的查找速度比LinkedList快,但是增加、删除元素LinkedList快。
Arraylist和Vector区别:
Arraylist和Vector都是基于数组的List,但是Vector是线程安全的,资源开销大。
两者的区别还有:如果数组的大小不够,需要扩展的大小不一样。Arraylist是50%+1,Vector是扩展一倍。
HashMap 和 Hashtable 的区别:
两者都是基于哈希表来实现键值映射的工具类。
hashtable是线程安全的。hashmap支持value为null,hashtable不行。
hashmap扩容是2倍,hashtable
HashSet 和 HashMap 区别:
HashSet实现的set接口,HashMap实现map接口。一个存储对象,一个存储键值对。
Set通过add添加元素,map使用put添加元素。
4.HashMap 和 Hashtable 的区别
Hashtbale是线程安全,而HashMap是非线程安全。HashMap支持null值,HashTable不支持。两个扩容方式不一样:Hashmap是直接括两倍,hashtable是2n+1
5.HashSet 和 HashMap 区别
HashMap存的是键值对,hashtable存的是对象,实现了set接口,是collection子集
6.HashMap 和 ConcurrentHashMap 的区别
ConcurrentHashMap是线程安全的,Hashmap非线程安全
7.HashMap的实现原理:
简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,
也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
线程:
1.创建线程的方式及实现
实现Runnable接口(callable接口),或者继承Thread。
1.什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。程序员可以通过它进行多处理器(并发)编程,也可以使用
多线程对运算密集型任务提速,
2.线程和进程有什么区别?
线程是进程的子集,一个进程可以有多个线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
每个线程都有单独的栈内存在存储本地数据。
3.如何java中实现线程?
三种方式,分别是实现Runnable接口、Callable接口,或者集成Thread.
4.用Runnable还是Thread?
因为java不支持多继承,但是支持调用多个接口,因此建议使用Runnable接口。
5.Java中Runnable和Callable有什么不同?
Runnable没有返回值,不能抛出异常;Callable有返回值且能抛出异常。Callable是JDK1.5增加的。
6.Java中CyclicBarrier和CountDownLatch有什么不同?
两个都可以实现一组线程等待其他线程。但是CountDownLatch不能重新使用。
7.java的内存模型是什么?
java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性的行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的
变动能被其他线程可见提供了保证,他们之间是先行发生关系,这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如:先行发生关系确保了:
*线程内的代码能够按先后顺序执行,这被称为程序次序规则。
*对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则;
*前一个对volatile的写操作在后一个volatile的读操作之前。
*一个线程内的任何操作必须在这个线程的start()调用之后,也要作线程启动规则。
*一个线程内的任何操作都会在线程终止之前,线程终止规则。
*一个对象的中介操作必须在这个对象构造完成之后,也叫对象终结规则。
*可传递性;
8.Java中的volatile变量是什么?
是一个特殊的修饰符,只有成员变量才能使用它。在java并发程序缺少同步类的情况下,多线程对成员变量的操作对其他线程是透明的。volatile变量可以保证
下一个读取操作会在前一个写操作之后发生。
*保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
*进制进行指令重排序。
9.什么是线程安全?Vector是一个线程安全类吗?
线程安全:如果一个代码会在多个线程中运行的,其结果与单个线程运行结果一致,且其他的变量的值也和预期的是一样的,就是线程安全。Vector是线程安全的集合。
10.Java中什么是竞态条件? 举个例子说明。
竞态条件会导致程序在并发情况下出现一些bugs。举例:两个线程对一个文件进行操作,如果文件a不存在,就创建一个新的;一个先判断不存在,创建;另一个也会这么多,就出现的文件的重复创建,覆盖。
11.Java中如何停止一个线程?
jdk1.0本来有stop、suspend等方法,但是由于潜在的死锁威胁因此被弃用。当线程执行完线程会自动结束,可以用volatile布尔值来中断线程。
12.一个线程运行时发生异常会怎样?
如果该异常被捕获或抛出,则线程继续运行;如果没有没有被捕获,线程将会停止。Tread.UncaughtExceptionHandler是用于处理未捕获一场造成
线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候,JVM会使用Thread.getUncaughtExceptionHandle()来查询线程的UncaughtExceptionHandler,
并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。
13.如何在两个线程间共享数据?
共享数据场景有两种:
*卖火车票。
解决方案:创建一个Runnable,这个Runnable里有共享数据。如果每个线程执行的代码相同,那么可以使用同一个runnable对象,这个runnable有那个共享数据,例如,卖票系统就是这么做的.
*银行存钱问题。
解决方案:如果每个线程执行的代码不同,那么要使用不同的runnable对象,有如下两种方式可以实现runnable对象间的数据共享
实现两个runnable对象,将共享数据分别传递给两个不同线程.
将这些Runnable对象作为一个内部类,将共享数据作为成员变量.
http://www.cnblogs.com/dolphin0520/p/3958019.html
MySQL 索引使用的注意事项
◆索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
◆使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
◆索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
◆like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
◆不要在列上进行运算
select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01’;
◆不使用NOT IN和<>操作
网友评论