题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");