赞
踩
1.面向对象的特征?
答:三大特性:继承、封装、多态。(抽象)
继承是通过关键字extends实现的,子类继承父类的非私有方法(实现代码重用)。封装是将客观事务抽象成类,每个类对自身数据和方法实现保护(隐藏数据)。多态是子类继承父类非私有方法,在编译和运行时产生不同的结果(一种接口,多种方法)。
2.单例模式会不会?
答:会一点,有两种经典的模式,懒汉(在第一次调用的时候实例化) 和 饿汉模式(在类初始化时,已经自行实例化) // 懒汉和饿汉的本质区别,就是实例化对象的时机,即是什么时候将对象创建起来)。
a.只能有一个实例(不是对象)b.单例类必须 创建一个实例 c.必须给其他对象提供这个实例。
深入理解:
懒汉模式:(有if的)
- public class LanHan {
- //首先私有默认构造函数
- private LanHan(){}
- //实例化对象
- private static LanHan single=null;
- //公共的方法来访问私有的实例
- public <span style="color:#FF0000;"><span>synchronized</span></span> LanHan singleGet() {
- if(single==null){
- single=new LanHan();
- }
- return single;
- }
- }
饿汉模式:
- public class singleton {
- //首先私有默认构造函数
- private singleton(){ }
- //已经自行实例化
- private static final singleton single = new singleton();
- //静态工厂方法、同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问
- public static singleton getInstance(){
- return single;
- }
- }
补充:
1、饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。 2、从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、 能用则用。但是它是加载类时创建实例(上面有个朋友写错了)、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。3、和全局变量的区别:全局变量可以提供一个访问点,但是不能达到只提供一个实例的目的。
3.arrayList的结构特征,长度为什么可变?
它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作
当默认10的长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。这里在添一点就是:ArryList是线程不安全的,Vector是安全的。由于是否有锁的判断将影响效率。故Arrylist效率远远高于Vector。而且只要是常用的容器就不是同步的,因为同步效率比较低。
4.写一下网络编程。(TCP)
我实在是忘记了,然后提出了可以看下书找个思路的wuchi请求,晕!
下篇专门写一篇!!
5.单例模式体现面向对象的什么性?
必须是封装性啊!!我把实例说成对象,面试官说我说法不规范,和上次说死锁一个样,顿时懵了。
单例模式体现了面向对象的封装性,单例模式能够保证一个类仅有唯一的实例,并提供一个全局访问点。
我们是不是可以通过一个全局变量来实现单例模式的要求呢?我们只要仔细地想想看,全局变量确实可以提供一个全局访问点,但是它不能防止别人实例化多个对象。通过外部程序来控制的对象的产生的个数,势必会系统的增加管理成本,增大模块之间的耦合度。所以,最好的解决办法就是让类自己负责保存它的唯一实例,并且让这个类保证不会产生第二个实例,同时提供一个让外部对象访问该实例的方法。自己的事情自己办,而不是由别人代办,这非常符合面向对象的封装原则。
6.了解事务吗?
事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态。
运行嵌入式SQL应用程序或脚本,在可执行SQL语句第一次执行时(在建立与数据库的连接之后或在现有事务终止之后),事务就会自动启动。在启动事务之后,必须由启动事务的用户或应用程序显式地终止它,除非使用了称为自动提交(automatic commit)的过程(在这种情况下,发出的每个单独的SQL语句被看做单个事务,它一执行就被隐式地提交了)。
在大多数情况下,通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT语句时,自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时,自从事务启动以来对数据库所做的一切更改都被撤销,并且数据库返回到事务开始之前所处的状态。不管是哪种情况,数据库在事务完成时都保证能回到一致状态。
一定要注意一点:虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的,从而提供了一般的数据库一致性,但还是须要用户或应用程序来确保每个事务中执行的SQL操作序列始终会导致一致的数据库。
7.数据库查询 先根据x分组再将y做个运算?
select x sum(y) from a group by x
8.线程池?
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程(和常量池有些类似)。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务。
9.哪个项目是最近做的?对哪个项目更加熟悉?
第二个项目是最近做的,不过对第一个项目更加熟悉,是用javaee写的,然后也没有问我啥。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。