面试题1


1.sql优化(博客园上有,先总结这么多,应付面试)
  0.一般不用select *
  1.不能用null作索引,即如下这种方法是不可以的:select...form ...where xyz is null 或者 is not null 
  2.联连接  
    不推荐:select * from employss where first_name||''||last_name ='Beill Cliton';
    推荐:*** where first_name ='Beill' and last_name ='Cliton';
  3.带通配符(%)的like语句
    不推荐: select * from employee where last_name like '%cliton%';
    推荐:select * from employee where last_name like 'c%';
  4.not
    不推荐:... where not (status ='VALID')或者... where status <>'INVALID';
    推荐:select * from employee where salary<3000 or salary>3000;
    
2. instanceof 检查是否是类的对象,用于判断对象是否所属于指定类或者接口

3.
   打印1-100的6的倍数 出现的次数
   int count=0;
   for(int x=1;x<=100;x++)
   {
     if(x%6==0)
      count++;
   } 
     System.out.println("count="+count); 
   }
   ------------------------------------------
   3000米,每天去除一半,需要多少天会小于5米
   思路:定义个变量表示天数
   除的动作和天数累加的动作是重复进行。
   int day=0;
   for(int x=3000;x>=5;x/=2)
   {
           day++;    
    }
    System.out.println(day);
   }

4. break continue
   break:用于选择结构或者循环结构。
   continue: 用于循环结构,结束本次循环,开始下一次循环
 
5. 重载,overload。
   当多个函数的功能一致,只是参与运算的参数不同。为了提高代码的阅读性,以及方便调用,
   所以将这些函数都定义成一个名字,通过参数列表来进行这些函数的区分。

6.排序
  选择:
  /// <summary>
        /// 简单选择排序
        /// </summary>
        /// <param name="arry">待排序的数组</param>
        public static void SimpleSelectSort(int[] arry)
        {
            int tmp = 0;
            int t = 0;//最小数标记
            for (int i = 0; i < arry.Length; i++)
            {
                t = i;
                for (int j = i + 1; j < arry.Length; j++)
                {
                    if (arry[t] > arry[j])
                    {
                        t = j;
                    }
                }
                tmp = arry[i];
                arry[i] = arry[t];
                arry[t] = tmp;
            }
        }
  冒泡:
  /// <summary>
        /// 冒泡排序
        /// </summary>
        /// <param name="arry">要排序的整数数组</param>
        public static void BubbleSort(int[] arry)
        {
            for (int i = 0; i < arry.Length-1; i++)
            {
                for (int j = 0; j < arry.Length - 1 - i; j++)
                {
                    //比较相邻的两个元素,如果前面的比后面的大,则交换位置
                    if (arry[j] > arry[j + 1])
                    {
                        int temp = arry[j + 1];
                        arry[j + 1] = arry[j];
                        arry[j] = temp;
                    }
                }
            }
        }


7.内存图:
  栈内存:存放局部变量,函数上和函数内定义的变量都是局部变量
          变量一旦使用完毕,自动清空
  堆内存:new 关键字建立的, 都称为对象,或者实体(数组实实在在存在的东西)
          在堆内存里面
  堆里面一开辟空间,就有一个头部值。(内存地址值,16进制开始)
 
  堆内存
  1.每一个数组(数组其实也是对象,比较特殊的对象)或对象
      都有自己的内存地址值
  2.堆内存中的变量都有默认初始化值

  **引用数据类型    (null常量是给引用数据类型使用的)
      类 class
      接口  interface
      数组 ([])

  3.堆内存是通过垃圾回收机制回收

8.一个实体可以被多个引用型变量引用

9.数组遇见问题:
  异常出现在运行时期
  角标越界异常:使用到数组中不存在的角标。
  (ArrayIndexOutOfBoundsException)   数组特有异常

  空指针异常:引用型变量等于null,也就是没有指向。
 (NullPointsException)

10.数组(也可以存储对象)
   本身就是一个容器,用来存储数据。
   特点:是固定长度的。
   好处:给元素进行编号,从零开始。同时也可以通过length属性获取数组长度。
   什么时候使用数组呢?
		当数据较多时,通常为了方便操作这些数据都需要进行临时存储。	
   习惯:通常操作数组都需要进行遍历。获取数组中的元素需要一个指针。通过对指针的值的改变就可以对数组中的数据进行操作。

11.int[] arr = new int[3];
   该句代码在内存中的分配情况。
	
   堆内存:开辟一个空间,建立一个数组实体,并对数组中的元素进行了默认初始化。
   栈内存:定一个局部变量,存放了该实体在堆内存中的首地址值。

   栈内存特点:存放局部变量,当该变量使用完毕(生命周期结束),自动被释放。
   堆内存特点:存放数组和对象,每一个实体都有内存地址值,堆内存中的变量都有默认初始化值,通过垃圾回收机制对堆内存中	
   
12.对象和类的关系。
   类描述事物,对象既该类事物实在的个体。

13.类中的变量就是成员变量
   方法中的就是局部变量

14.封装:隐藏实现细节,提高了安全性
   程序中的其中 一种体现:通常将类中的成员变量私有化(private),通过对外提供方法(set,get)对该变量进行访问。

15.对象的存在有什么好处?或者说为什么创建对象呢?
   对象可以用于封装数据。可以在对象中定义属性和行为,并被指挥。

16.静态 :
   1.静态随着类的加载而加载,直接类名调用。静态生存周期最长。占内存。
   2.静态优先于对象存在
   3.静态被所有对象所引用
                         
   共有的静态,不共有的不静态。例:饮水机
   直接被类名所访问。

17.单例设计模式:保证类在内存中的对象唯一性
   步骤:                            
   1.定义私有并静态的本类对象
   2.私有化构造函数
   3.提供静态方法返回该对象

   有时间看看《大话设计模式》一书:
   单例模式除了可以保证唯一的实例外,还有什么好处呢?
   答:单例模式因为Singleton类封装它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。
 
   饿汉式:即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源
   懒汉式:又面临多线程访问安全性的问题	

18.构造函数:
   对象一建立,就被调用,给对象初始化。构造函数不需要返回值。
   凡是class定义的类, 都有默认的构造函数。

   什么时候定义构造函数?
   当对象产生时,需要一些具体的属性或者行为的时候。就定义在构造函数中。
   比如,人对象一产生就需要具体的姓名和年龄,这些值都在构造函数中进行指定。

19.static关键字:可以把对象中重复的东西抽取出来,以便共用。
   静态成员,可以直接被类名访问调用。
   静态随着类的加载而加载。静态优先于对象存在。
   静态被所有对象所共享。

20.继承:
   注意:
   子类的方法权限应该是大于等于 父类方法的权限,才能覆盖

21.Override和Overload的区别?Overload是否可以改变返回值类型?
   Override方法重写:在子类中,出现和父类中一模一样的方法声明的现象
   Overload方法重载:同一个类中,出现的方法名相同,参数列表不同的现象
   方法重载能改变返回值类型,因为它和返回值类型无关

   博客园:
   父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
   在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。
   但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
 
   重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。

22.抽象方法和接口(java面试葵花宝典,经典问题,基本上必问)。。。。重点
   
   抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
   抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
   举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。
   那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,
   但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。
   此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。
   然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。
   从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,
   则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),
   能飞行则可以实现这个接口,不能飞行就不实现这个接口。

   下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:
   abstract class Door {
     public abstract void open();
     public abstract void close();
   }

   interface Door {
    public abstract void open();
    public abstract void close();
   }
   但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

  1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

  2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

  从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

   interface Alram {
    void alarm();
   }

   abstract class Door {
    void open();
    void close();
   }

   class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值