软通动力
1.面向对象的四大特性
答:(1)抽象:就是将一类对象的共同特征总结出来构造类的过程,包括包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
(2)封装:通常认为封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过以定义的接口,面向对象的实质就是将现实世界描绘成一系列自治,封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写的一个类就是数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
(3)继承:继承是从已有的类得到继承信息创建新类的过程。继承信息的类被称为父类;得到继承信息的类被称为子类。继承让变化的软件有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
(4)多态:多态就是允许不同子类型的对象对同一消息做出不同的响应,多态分为编译时多态和运行时多态,方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
2.string,stringbuffer,stringbuilder的区别
答:String:不可变字符串,适用于少量的字符串操作的情况
StringBuilder:可变字符串,效率高,适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:可变字符串,效率低,适用多线程下在字符缓冲区进行大量操作的情况
参考资料:https://docs.oracle.com/javase/tutorial/java/data/buffers.html
3.在项目上新之后,如果项目出现了内存溢出,应该如何查看
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
引起内存溢出的原因有很多种,常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小;
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
重点排查以下几点:
1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
2.检查代码中是否有死循环或递归调用。
3.检查是否有大循环重复产生新对象实体。
4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况。
参考地址: http://baike.baidu.com/view/79183.htm
4.书写一段代码,当输入数组或者集合abc时,输出cba
//当为数组时
public class test {
public static void main(String[] args) {
String[] str = {"a", "b", "c", "d"};
for (int i = str.length - 1; i >= 0; i--) {//倒序输出
System.out.print(str[i] + "\t");
}
}
}
//输出的结果为dcba
//当为集合时
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");
Collections.reverse(list);
for (String str:list){
System.out.print(str);
}
}
}