Q:对内存溢出的理解,什么情况下会内存溢出,你写代码时遇到过内存溢出吗
A:个人理解,内存溢出就是可用内存不够了,(它还有个亲戚叫内存泄漏,申请内存用完了不释放,大量内存泄漏就会导致内存溢出)
可能会出现溢出的情况:
一次性在内存中处理的数据过多,或者对象调用资源但是最后没有释放,JVM无法回收;也可能是死循环造成的;还有静态集合类,因为静态集合类的生命周期是和jvm一致的,如果其引用的对象一直得不到释放也会造成内存溢出;
OutofMemoryError....
第一次遇到内存溢出好像是因为递归吧,没设置结束条件很容易这样。
Q:jdbc连接数据库的步骤
A:(啊这,不都是mybatis搞定了吗,现在谁还写老jdbc啊)传统jdbc连接步骤如下:
注册驱动,Class.forName.....
设置三个参数:连接(url);用户名,密码
获取连接:Connection co = DriverManager.getConnection(参数1,参数2,参数3)
//建立完连接jdbc其实就结束了,剩下就是执行sql语句
//Connection的对象创建startment语句 :Statement st=conn.createStatement();
//然后就是执行SQL语句,处理结果集ResultSet:ResultSet rs=st.executeQuery(sql语句),结果集是用来显示的
Q:为什么要分页查询,Mysql如何分页查询?如果有几万条数据不使用分页查询,直接查询可能会有什么后果?
A:为什么要分页查询:使用分页查询可以节省查询耗费的时间,而且每次“翻页”只查询当前页面的数据,虽然增加了与数据库的交互次数但是每次查询很快很轻便,数据库里的数据量越大优势越明显。
Mysql如何实现分页查询:
使用limit: SELECT * FROM 表名 LIMIT 5,10; // 检索记录行 6-15,5的意思是从第六行开始查询, 10的意思是一次查询十条(行)
不过太多数据的时候limit也会很慢,而且是偏移量越往后越慢,必须增加索引限定,比如根据唯一主键id查询,或者使用子查询(子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率)
不优化直接查询那后果可能是几十秒的查询时间。
Q:判断String中是否包含有其他字符串的方法
A:可以用IndexOf,假如待测试字符串为a = “I love you”,判断是否包含“love” :打印 a.indexOf("love") ,应当是待测试字符串中的位置下标
String a = "I love you";
System.out.println(a.indexOf("love"));//2
System.out.println(a.indexOf("you"));//7
Q:List和set的区别
A:Set不允许重复对象,而且只能有一个null,存储是无序的;List允许重复对象,可以有多个null,存储顺序有序
Q:获取map中的key的方法
A:for遍历中使用get方法,或者entrySet()方法,或者迭代器
//<Sting,String> HashMap<String,String> hashMap1 = new HashMap<String,String>(); hashMap1.put("1","a"); hashMap1.put("2","b"); hashMap1.put("3","c"); hashMap1.put("4","d"); //entryset for (Map.Entry<String,String> entry : hashMap1.entrySet()) {//entrySet方法 String key = entry.getKey(); String v = entry.getValue(); System.out.println("------key----"+ key + "------value-----" +v); } //迭代器遍历法 System.out.println("迭代器遍历法"); Iterator<String> iter = hashMap1.keySet().iterator(); while(iter.hasNext()){ String key=iter.next(); String value = hashMap1.get(key); System.out.println(key+" "+value); }
Q:linux如何编辑文件
A: touch hello.c //创建文件
vi hello.txt //进入vi打开文件,
按a或者i进入文本编辑
Ps:也可以用echo命令,或者cat命令
Q:对反射的理解,反射常用在哪些地方,如何用反射创建对象?
A:反射是java的一种特性,java是静态语言,不过通过反射可以形成“伪动态”,也就是说可以在程序运行时获得类,类的对象,属性,接口等,并可以进行修改。
和正常类先实例化后取得实例化对象不同,反射是根据实例化对象获取类的名字,再进行下一步操作。
每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,可以说,每个Class对象对应的是一个加载到JVM中的.class文件,
所以,第一步是获取class对象:
方式一:Class.forName("xxx")
方式二:对象.GetClass
方式三:类.class
第二步就是创建对象:
方法一:通过newInstence()
Phone instance1 = (Phone) class1.newInstance();
方法二:先调用构造器,再通过newInstence()创建
Constructor<?> constructor = userinfoClass1.getConstructor(String.class,Integer.class);
UserInfo newInstance = (UserInfo)constructor.newInstance("张三",15);
System.out.println(newInstance);//UserInfo [name=张三, age=15]
Q:创建线程的三种方式,如何获取线程的返回值
A: 方法一:继承Thread类
public class MyThread extends Thread{ xxx },可以MyThread myThread1 = new MyThread();然后myThread.start()来创建线程
方法二:使用Runnable接口
public class Mythread implements Runnable{ xxx },不能直接调用,需要多一步Thread实例化:
MyThread myThread2 = new MyThread();
Thread thread = new Thread(myThread2);
thread.start();
方法三:用Callable<V>接口通过FutureTask包装器来创建Thread线程(这种方法有返回值)
需要使用FutureTask对象作为Thread对象的target创建并启动新线程。
调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
FutureTask<Integer>