个人总结java常用面试题

来源:互联网 发布:淘宝修改差评步骤 编辑:程序博客网 时间:2024/05/23 19:17

1:java垃圾回收机制:(对象的失去引用,对象离开作用域)

 

         程序在运行期间会在内存中产生很多类的对象,对象在完成任务后,java垃圾回收机制会自动释放这些对象所占用的空间,回收的内存能被再次利用,提高程序的运行效率。

 

         优点:提高系统的可靠性,使内存管理与类接口设计分离,减少跟踪内存管理错误的时间,另外运行垃圾回收机制的线程是一种低优先级线程,只有在内存空闲时才有机会运行。

         特性:自动性和不可预见性。

Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。

2:java内存溢出:

应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。

         现象:操作一般时间后系统越来越慢,直到死机。

引起内存溢出的原因有很多种,常见的有以下几种:

l 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

l 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

l 代码中存在死循环或循环产生过多重复的对象实体;

l 使用的第三方软件中的BUG;

l 启动参数内存值设定的过小;

内存溢出的解决

第一步,就是修改JVM启动参数,直接增加内存

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误

第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置,重点排查以下几点:

l 检查代码中是否有死循环或递归调用。 

l 检查是否有大循环重复产生新对象实体。

l 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

l 检查ListMAP等集合对象是否有使用完后,未清除的问题。ListMAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况

 

3:==与equals的区别

当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。Equals比较的是地址值,值相等返回true,否则比较后结果为false;

 

4:重载和重写的区别:

Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。

调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。

重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。方法重写又称方法覆盖。

若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

子类函数的访问修饰权限不能少于父类的

 

5:List和Set,Map的区别

         List按对象进入的顺序保存对象,不做排序或编辑操作。

Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet或者LinkedHashMap.

ist Set Map都是接口,前两个继承至Collection接口,Map为独立接口
Set
下有HashSet,LinkedHashSet,TreeSet
List
下有ArrayList,Vector,LinkedList
Map
下有Hashtable,LinkedHashMap,HashMap,TreeMap
还有Collection接口下还有个Queue接口,有PriorityQueue类

 
6: 流的分类:(包括字节流和字符流)

            字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。

字节流类

抽象父类:InputStream,OutputStream

实现类包括如下几种:

BufferedInputStream 缓冲流-过虑流
BufferedOutputStream
ByteArrayInputStream 字节数组流-节点流
ByteArrayOutputStream
DataInputStream 处理JAVA标准数据流-过虑流
DataOutputStream
FileInputStream 处理文件IO流-节点流
FileOutputStream
FilterInputStream 实现过虑流-字节过虑流父类
FilterOutputStream
PipedInputStream 管道流
PipedOutputStream
PrintStream 包含print() 和println()
RandomAccessFile 支持随机文件

字符流

抽象父类:Reader, Writer

实现类:
Java中流的分类都有哪些?

BufferedReader
BufferedWriter
PrintWriter
CharArrayReader
CharArrayWriter
FileReader
FileWriter
FilterReader
FilterWriter
InputStreamReader
OutputStreamWriter
PipedReader
PipedWriter
StringReader
StringWriter

7:多线程的优点:

单线程就是进程只有一个线程   多线程就是进程有多个线程 

 

         多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能:

        (1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态; 

(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;

        (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务; 

(4)可以随时停止任务;

(5)可以分别设置各个任务的优先级以优化性能。

 

8:Thread中sleep()与wait()的区别:

sleep()方法属于Thread类中的。wait()方法属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。

调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

Sleep()不能访问同步代码块,wait()能够访问tongue代码块


9:int和Integer有什么区别:

int 是基本类型,直接存数值

integer是对象,用一个引用指向这个对象

  1.Java 中的数据类型分为基本数据类型和复杂数据类型

  int 是前者>>integer 是后者(也就是一个类)

  2.初始化时>>

  int i =1;   Integer i= new Integer(1);(要把integer 当做一个类看)

  int 是基本数据类型(面向过程留下的痕迹,不过是对java的有益补充)

  Integer 是一个类,是int的扩展,定义了很多的转换方法

  类似的还有:float Float;double Double;string String等

1.int是基本的数据类型;

  2.Integer是int的封装类;

  3.int和Integer都可以表示某一个数值;

  4.int和Integer不能够互用,因为他们两种不同的数据类型;

Integer类的内部, 有一个常量静态数组, 在Integer类被加载的时候, 预先创建了-128 ~ 127的Integer对象, 所以当声明的Integer类型变量的值在-128 ~ 127的范围内时, 不会新创建对象, 直接引用数组中创建好的. 所以第一个结果会输出true,第三个结果为false;

10. 

第一个人10岁,第二个人比第一个人大2岁,以此类推,请用递归算法求出第8个人多大???

def getAge(k):
    if k==1:
        return 10
    else:
        return getAge(k-1)+2

print (getAge(8))
结果24
       

11:存储过程和函数的区别

存储过程和函数目的是为了 可重复地 执行操作数据库的sql语句的集合。

区别是写法和调用上。

写法上:存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数;

            函数的参数列表只有输入参数,并且有return <返回值类型,无长度说明>。

返回值上:

    存储过程的返回值,可以有多个值,

           函数的返回值,只有一个值。

调用方式上:

    存储过程的调用方式有:

1)、exec <过程名>;

2)、execute <过程名>;

3)、在PL/SQL语句块中直接调用。

            函数的调用方式有:

      在PL/SQL语句块中直接调用。

具体分为:

  ----调用FUNCTION add_three_numbers

  ----1. 位置表示法调用函数

  BEGIN

  dbms_output.put_line(add_three_numbers(2,4,5));

  END;

  ----2. 命名表示法调用函数

  BEGIN

  dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));

  END;

  ----3. 混合使用位置表示法和命名表示法调用函数

  BEGIN

  dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));

  END;

  ----4. 排除表示法

  BEGIN

  dbms_output.put_line(add_three_numbers(12,c=>2));

  END;

  ----5. sql调用表示法 --混合表示法

  SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;

 

----1. 该函数接受3个可选参数,返回3个数字的和

  CREATE OR REPLACE FUNCTION add_three_numbers

  (

  a NUMBER:=0, b NUMBER:=0, c NUMBER:=0

  )

  RETURN NUMBER IS

  BEGIN

  RETURN a+b+c;

  END;

存储过程:

基本语法:

create procedure <过程名>(<参数列表,无参时忽略>)

as|is

变量声明、初始化

begin

业务处理、逻辑代码

exception

异常捕获、容错处理

end <过程名>;

参数:<参数名> in|out|in out <参数类型,无长度说明> ,如:v_name varchar2

in:入参

out:出参

in out:出入参

注:as|is表示as或is

调用语法:

1)、exec <过程名>;

2)、execute <过程名>;

3)、在PL/SQL语句块中直接调用。

例:

create or replace procedure up_wap(v_param1 in out varchar2,v_param2 in out varchar2)

is

v_temp varchar2(20);

begin

dbms_output.put_line('交换前参数1:'||v_param1||' 参数2:'||v_param2);

v_temp:=v_param1;

v_param1:=v_param2;

v_param2:=v_temp;

dbms_output.put_line('交换后参数1:'||v_param1||' 参数2:'||v_param2);

exception

when others then dbms_output.put_line('There is a error when the procedure up_wap executing!');

end up_wap;

/

-- 调用存储过程

declare

v_param1 varchar2(20):='param1';

v_param2 varchar2(20):='param2';

begin

up_wap(v_param1 => v_param1,v_param2 => v_param2);

end;

/

 

 自定义函数(function)

基本语法:

create function <函数名>(<参数列表,无参时忽略>)

return <返回值类型,无长度说明>

as|is

变量声明、初始化

begin

业务处理、逻辑代码

return <返回的值>;

exception

异常捕获、容错处理

end <函数名>;

参数:in 入参

注:只有入参的类型。

在存储过程和自定义函数中的参数的传递(入参和出参)不能使用%type或%rowtype匹配,不能使用空值null,但是存储过程可以返回空值。

例:

create function uf_select_name_by_id_test(v_id in number)

return varchar2

is

v_name t_test.t_name%type;

begin

select t_name into v_name from t_test where t_id=v_id;

return v_name;

exception

when others then dbms_output.put_line('error');

end uf_select_name_by_id_test;

/

select uf_select_name_by_id_test(1) 姓名 from dual;-- select调用

declare --pl/sql语句块调用

v_name varchar2(20);

begin

v_name:=uf_select_name_by_id_test(1);

dbms_output.put_line('name = '||v_name);

end;

/

12.什么是ORM?

对象关系映射(Object Relational Mapping, 简称ORM)是一种为了 解决面向对象与关系 数据库存在的互不匹配的现象的技术。简单 的说,ORM是通过使用描述对象和数据库之 间映射的元数据,将java程序中的对象自动 持久化到关系数据库中。本质上就是将数据 从一种形式转换到另外一种形式。

13:Connection类中的3个事务处理方法:

setAutoCommit(boolean bln)
commit():提交事务
rollback():撤销事务

14:常用字符串的翻转方法:




15:String StringBuffer StringBuilder的区别:

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

String:字符串常量

StringBuffer:字符变量

StringBuilder:字符串变量

StringBuffer 是线程安全的 

StringBuilder不保证线程安全(在1.5中引入的),一般情况下比StringBuffer快。

String类是不可变类,任何对String的改变都会引发新的String对象的生成;

StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象


16:final,finally,finalize的区别

final用于声明属性,方法和类,分别表示属性不可改变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。


17:Mybatis如何批量增加数据:

点击打开链接


0 1