小药药面试纪要

题1: 一个数组 int[] A = {2,3,0,-2,-6,23,0,4,4......n}  如何把里面所有的正数放在左侧,0 放在中间,负数放在右侧?   (基于  三色排序法 )

 

/题一,方法一,用到两个数组。第一个(也就是要处理的数组),先计算出多少个>0 =0 <0 的,比如分别是 i,j,k 个。
    //然后第二个数组是个同尺寸的空的,把第一个取出的值一个一个检验后放进去,对于>0 的从新数组的头开始放。=0 的从位置 i 开始放。
    //<0 的,从 i+j 开始放。
    public static void Q1_Way1(int[] a)
    {
        int len = a.length;
        int i=0;//>0
        int j=0;//=0
        int k=0;//<0
        
        for(int p=0; p < len; p++)
        {
            if(a[p] > 0)
            {
                i++;
            }
            else if (a[p]==0)
            {
                j++;
            }
            else {
                k++;
            }
        }
        System.out.println("i="+i+" j="+j+" k="+k);
        
        int[] b = new int[len]; //同尺寸新 array
        int iCount=0;//>0 的计数
        int jCount=0;//=0 的计数
        int kCount=0;//<0 的计数
        
        for(int q = 0; q < len; q++)
        {
            if(a[q]>0)
            {
                b[iCount] = a[q];
                iCount++;
            }
            else if (a[q]==0)
            {
                b[i+jCount]=a[q];
                jCount++;
            }
            else {
                b[i+j+kCount]=a[q];
                kCount++;
            }
            
        }
        for (int bb : b)
        {
            System.out.print(bb+" ");
        }
        System.out.println("");
    }
    

 


题2: 数组 {1,1,2,3,5,8,13,21,34,..........n}.如何计算出 f(100) (递归)

 

 public static int f(int n){
  if(n==1||n==2){
   return 1;
  }else{
   return f(n-1)+f(n-2);
  }
 }


题3:  try/catch/finally,finally总会执行么?如果 try / catch 里 return, finally 还执行么?

当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了 System.exit() 退出程序。
3)程序所在的线程死亡。
4)关闭CPU。 

在try里边的return,同时有finally语句并且try中无异常,会先执行try里面的代码包括retrun表达式并将结果保存不立即返回,会将变量暂存起来(对象存的是引用的地址),再去执行finally中的语句,这时候,如果返回值是基本数据类型或者字符串,则finally相当于更改副本,不会对暂存值有影响;但是,如果返回值是对象,则finally中的语句,仍会根据地址的副本,改变原对象的值。执行完后再回到try返回。


题4:线程安全怎么实现的?synchronized 那是怎么实现安全的?一般是加在哪些线程上?一般加到哪些线程上才能保证既是同步的,也不冲突?
题5:ArrayList 和链表 (LinkedList) 的区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
2.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

题6:如何实现序列化

 

简要解释:
  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
  序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,
然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

详细解释:

      当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

  只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包

1.概念

  序列化:把Java对象转换为字节序列的过程。
  反序列化:把字节序列恢复为Java对象的过程。

2.用途

  对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

 

3.对象序列化

序列化API

  java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。

  java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。


题7:如何连接数据库,有哪些参数
题8:如何访问 Excel 表中某个行列的某个数据? 用的那个包?

org.apache.poi
题9:用过 java 反射么? java 反射的原理的?和类的实例化?是如何做到反射的?

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。总结说:反射就是把java类中的各种成分映射成一个个的Java对象,并且可以进行操作。

 

获取class的三种方式

先定义一个实体类Person:

Package reflex;
public class Person {
    //私有属性
    private String name = "Tom";
 
    //公有属性
    public int age = 18;
 
    //构造方法
    public Person() {   
 
    }
 
    //私有方法
    private void say(){
        System.out.println("private say()...");
    }
 
    //公有方法
    public void work(){
        System.out.println("public work()...");
    }
}

获取class方法 (类 对象 Class)

//1、对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
//  类型的对象,而我不知道你具体是什么类,用这种方法
  Person p1 = new Person();
  Class c1 = p1.getClass();   

//2、类名.class 的方式得到,该方法最为安全可靠,程序性能更高
//  这说明任何一个类都有一个隐含的静态成员变量 class
  Class c2 = Person.class;

//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
//   但可能抛出 ClassNotFoundException 异常
  Class c3 = Class.forName("reflex.Person");

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值