Java面试题

一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

11、HashMap和Hashtable的区别。 
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(如果是ArrayList:List lst = Collections.synchronizedList(new ArrayList());如果是HashMap:Map map = Collections.synchronizedMap(new HashMap());)。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

21.HashMap和HashTable有何不同?

(1)HashMap允许key和value为null,而HashTable不允许。

(2)HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。

(3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。

(4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

(5)HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。


HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:

(1)HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都经过synchronized修饰

(2)因为同步、哈希性能等原因,性能肯定是HashMap更佳,因此HashTable已被淘汰。

(3) HashMap允许有null值的存在,而在HashTable中put进的键值只要有一个null,直接抛出NullPointerException

(4)HashMap默认初始化数组的大小为16,HashTable为11。前者扩容时乘2,使用位运算取得哈希,效率高于取模。而后者为乘2加1,都是素数和奇数,这样取模哈希结果更均匀。


13、sleep() 和 wait() 有什么区别? 
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

 11、"=="和equals方法究竟有什么区别? 

==操作符专门用来比较两个变量的值是否相同,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个 基本类型的数据或两个引用变量是否相等

只能用==操作符。

equals方法用来比较两个独立对象的内容是否相同,就好比去比较两本书是否相同,ta比较的两个对象是独立的:看下面的代码

String a = new String("AA");
String b = new String("AA");
System.out.println(a==b);
System.out.println(a.equals(b));

两条new语句创建了两个对象,然后用a,b两个变量分别指向其中的一个对象,这是两个不同的对象,ta们的首地址是不同的,即a,b中存储的数值是不同的,所以

表达式a==b将返回false,而两个对象中的内容是相同的,所以a,equals(b)返回了true。

注意啊,字符串的比较基本上都是使用equals方法。


如果一个类没有自己定义的equals方法,那么ta将继承Object类的equals方法,Object类的的实现代码如下:

boolean equals(Object o)

{

return this==o;

}

这说明如果一个类没有自己定义的equals方法,ta默认的equals方法,等同于使用==操作符,也就是比较两个变量指向的对象是同一个对象。这时候使用equals和==

会得到相同的结果!!如果希望写的类能够比较两个实例对象的内容是否相同,则需要覆盖equals方法!!



sql实现Oracle分页查询?

Select * from (select RowNum rn,*  from Student  where  RowNum<=PageNo*PageSize) where rn>(PageNo-1)*Pagesize
sql实现Mysql分页查询?
select * from Student Limit (pageNo-1)*pageSize,pageSize;

去掉字符串中的空格?

1. String.trim() 
trim()是去掉首尾空格 

2.str.replace(" ", ""); 去掉所有空格,包括首尾、中间 
String str = " hell o "; 
String str2 = str.replaceAll(" ", ""); 
System.out.println(str2); 


3.或者replaceAll(" +",""); 去掉所有空格 

4.str.replaceAll("\\s*", ""); 
可以替换大部分空白字符, 不限于空格 
\s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 

ArrayList和HashSet的比较


ArrayList是数组存储的方式
HashSet存储会先进行HashCode值得比较(hashcode和equals方法),若相同就不会再存储
HashCode和HashSet类
Hashset就是采用哈希算法存取对象的集合

对象用完之后没有回收就是内存泄漏
一个对象一旦hashCode生成之后,再对属性值修改后
其Hashcode值就会发生改变
再通过hashSet删除就删除不掉了

    Collection collections = new HashSet();
    ReflectPoint pt1 = new ReflectPoint(3,3);
    collections.add(pt1);
    pt1.y =7;
    collections.remove(pt1);//删除不了 
 
   

String、StringBuilder和StringBuffer的区别?

  • String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的
  • StringBuffer是同步的,数据安全,效率低,StringBuilder是不同步的,数据不安全,效率高

StringBuffer和数组区别?

StringBuffer的数据最终是一个字符串数据,数组可以放置多种数据,但必须是同一种类型

1.多线程有几种实现方案,分别是哪几种?

  • 两种。
  • 一种是继承Thread类。  
  • 一种是实现Runnable接口。

2.同步有几种方式,分别是什么?

  • 两种。
  • 同步代码块。
  • 同步方法。

3.启动一个线程是run()还是start()?它们的区别?

  • start()。
  • run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用
  • start():启动线程,并由JVM自动调用run()方法

4.sleep()和wait()方法的区别?

sleep():必须指定时间;不释放锁

wait():可以不指定时间,也可以指定时间;释放锁

5.为什么wait(),notify(),notifyAll()等方法都定义在Object类中

  • 因为这些方法的调用时依赖于锁对象的,而同步代码块的锁对象是任意锁,而Object代表任意的对象,所以,定义在里面。
6.线程的生命周期图
新建——就绪——运行——死亡
新建——就绪——运行——阻塞——就绪——运行——死亡
7.Spring事务管理

事务就是对一系列的数据库操作进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,则回滚之前的所有操作,这样可以防止出现脏数据,防止数据库数据出现问题。

Spring中的事务管理机制,一般是使用TransactionMananger进行管理,可以通过spring的注入来完成此功能。

spring提供的事务管理可以分为两类:编程式和声明式的。

  • 编程式主要使用transactionTemplate。省略了部分的提交,回滚。一系列的事务对象定义,需注入事务管理对象
  • 声明式事务管理建立在aop之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中做相关的事务规则声明,便可以将事务规则应用到业务逻辑中。
  • 声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。


事务的四大特征

1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做

2.一致性:数据不会因为事务的执行而遭到破坏

3.隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰

4.持久性:一个事物一旦提交,它对数据库的改变就是永久的







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值