学习Java的Java面试问题
前锋区重庆Java边肖整理了一些中级Java软件开发面试问题,供大家参考:
1.谈谈对面向对象的理解;以及三个特点;
面向对象是基于一切都是对象的观点。把一个对象抽象成一个类,也就是Java抽象类,具体来说就是把一个对象的静态和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类中,程序由多个对象组成,相互通信。
比如你把一个人当成一个对象,这个人就会有他的属性和行为;他有手、有脚、有嘴等等,这是他的属性,或者他会说话、会走路、会吃饭,这是他的行为。同样,我们也可以把这些看作对象,所以一个对象可以由多个对象组成。
面向对象的特点是封装、继承和多态。封装是将对象内部不需要暴露的细节隐藏起来,使内部细节的变化与外界分离,只依靠接口进行沟通;也就是说,这个方法怎么实现并不重要,只要知道它能实现这个功能就可以了。封装降低了编程的复杂性。继承使得创建一个新类变得容易。如果类继承父类,父类的所有非私有方法和公共属性都可以由该类调用。但是继承和实现接口产生的多态性,使得不同类产生的对象对同一条消息的反应不同,即实现接口时,同一方法的行为不同,大大提高了代码的通用性。
总之,面向对象的特性提高了大型程序的可重用性和可维护性。
2.两者的区别。String、StringBuffer和StringBuilder
(1)1)String对象是不可变的。
(2)如果想在不创建新对象的情况下修改字符串,可以使用StringBuilder类。例如,当许多字符串在一个循环中连接在一起时,使用StringBuilder类可以提高性能。
(3)由于String的值一旦创建就不能修改,所以称为常量。看似能够修改字符串的方法实际上只是返回一个包含修改内容的新字符串。
(4)StringBuffer可以改变Unicode字符序列,允许并发操作,是线程安全的。
(5)StringBuilder:可变Unicode字符序列操作与StringBuffer相同,但不支持并发操作,不是线程安全的。
(6)不考虑线程安全,StringBuilder性能最高,其次是StringBuffer,String相对较差。StringBuffer性能高于String的主要原因是String类是不可变的,对String引用指向的String的任何修改都会导致新字符串(对象)的生成,而对StringBuffer的修改不会导致新对象的生成。
那么为什么StringBuilder的性能比StringBuffer高呢?这与线程安全有关。StringBuilder是线程不安全的。
3.hashmap、LinkedHashMap和TreeMap的区别;
HashMap、链接HashMap和treemap都属于map。
Map主要用于存储键值对,根据键获取值,所以键不允许键重复,但值允许重复。
HashMap是最常用的地图之一。它根据密钥的HashCode值存储数据,其值可以直接根据密钥获取,访问速度快。HashMap只允许最多一条记录的关键字为Null允许多个记录的值为空;HashMap不支持线程同步,即多个线程可以随时同时写HashMap;可能导致数据不一致。如果需要同步,可以通过Collections的synchronizedMap方法来同步HashMap。
LinkedHashMap也是一个HashMap,但是在内部它维护一个双向链表,可以保持顺序;
TreeMap不仅可以保持秩序,还可以用于排序;
4.4之间的区别。数组列表、链表和向量;
同步
数组列表、链表是异步的,而Vestor是同步的。因此,如果不需要线程安全,可以使用ArrayList或LinkedList,这样可以节省同步。
而耗费的开销。但在多线程的情况下,就得使用Vector。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。
(2)数据增长
从内部实现机制来讲ArrayList和Vector都是使用Object的数组形式来存储的。
当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度;
ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以要在集合中保存大量的数据那么使用Vector有一些优势。
(3)检索、插入、删除对象的效率
ArrayList和Vector中,是用下标来检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长。
LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的,但它在查询一个元素的时候比较慢。
一般大家都知道ArrayList和LinkedList的大致区别:
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
5.抽象类与接口(interface)的区别;
(1)abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
(2)在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
(3)abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
(4)实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
(5)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
(6)抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
(7)接口中的方法默认都是 public,abstract 类型的。
6.多线程是什么用什么实现
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。如:火车是一个进程,而车厢就是线程,车厢脱离了火车是不能开动的,同理可以由多个车厢,则一个进程是有多个线程来提高效率的。
在JAVA中,要开始一个线程,有两种方式。一是直接调用Thread实例的start()方法,继承Thread类;二是实现Runnable接口,将Runable实例传给一个Thread实例然后调用它的start()方法。
实现同步也有两种,一种是用同步方法,一种是用同步块, 同步方法就是在方法返回类型后面加上synchronized, 比如:public void synchronized add(){...}同步块就是直接写:synchronized (这里写需要同步的对象){...}
7.spring事务怎么配置的。
第一种方式:每个Bean都有一个代理;
第二种方式:所有Bean共享一个代理基类;
第三种方式:使用拦截器;
第四种方式:使用tx标签配置的拦截器;
第五种方式:全注解;
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124342.html