接着上一篇再谈:
四:某游戏平台项目
1:自我介绍
2:简单说一下继承
java语言的三大特性:封装、继承、多态,其中封装就是把类中内部操作,来实现某种功能的变量或者方法私有化,不对外提供,
而是把具体的功能提供出去,例如电脑的内部实现原理被封装起来,暴露出来的只是usb接口,这样做的目的是更好的维护类,防止
使用者误操作修改内部属性。继承,就有子父类,父类拥有子类公共的属性和特征,是对子类的一个抽象,比如在现实生活中动物是
一个父类,有体重、颜色等属性,吃饭、运动等行为,这是公共的部分,但是不同的个体又有各自的方式,例如鸟这种动物运动就是fly,
而都运动就是run,颜色也有可能不同,有黄色、黑色,所以子类继承父类的属性、方法,但是可以重写父类的方法,因为父类的方法
描述的不够具体。多态,顾名思义,就是多种形态,动物是一个大的概念,鸟和狗都是动物,接口的多种实现方式,
Annimal an = new Bird(); 这就是多态的一种形式。
3:排序List集合中User对象(按照id的大小排序)
如果是数组中的排序,可以直接使用Arrays工具类中sort()方法,如果是集合List,可以使用Collections工具类中sort方法,其实底层
还是数组的sort排序方法,那么如果想排序list集合中的user对象(按照user对象的id大小),那么我们可以使user对象实现compable接口
重写tocompare方法,如下:
/** * */package com.hlcui.test;/** * @author Administrator * */public class User implements Comparable{ private int id; private String name; public User(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public int compareTo(User u) { if (u.id < id) { return -1; } else if (u.id > id) { return 1; } else { return 0; } } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
测试排序前后的结果:
/** * */package com.hlcui.test;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * @author Administrator * */public class TestUser { public static void main(String[] args) { ListuserList = sortUsers(); printMap(userList); Collections.sort(userList); System.out.println("====排序后===="); printMap(userList); } public static void printMap(List userList) { for (User user : userList) { System.out.println(user); } } public static List sortUsers() { List userList = new ArrayList (); userList.add(new User(3, "tom" + 3)); userList.add(new User(1, "tom" + 1)); userList.add(new User(2, "tom" + 2)); return userList; }}
User [id=3, name=tom3]User [id=1, name=tom1]User [id=2, name=tom2]====排序后====User [id=3, name=tom3]User [id=2, name=tom2]User [id=1, name=tom1]
重写tocompare()方法之后,运行结果是按照id降序
4:说一下hashMap的存储原理
HashMap的存储,其内部是hash表结构,当我们调用put方法存储时,首先会根据key调用hash方法计算hashcode值,
hashcode值代表在hash表中的存储位置,然后将value值存储,当我们get(key)时,还是会根据key计算hashcode值,然后
到hash表中找到对应的value值。
5:重写hashCode以及equals方法的意义
重写hashCode以及equals方法,可以避免存储在map中的两个key计算得到相同的hashcode,造成冲突。
五:某自研公司(电网项目)
1:自我介绍
2:sql优化
a:尽量避免使用select * from tableName;因为在预编译时,会查询数据字典将*转换为字段,降低了效率
b:where后面的条件约束,能够过滤掉数据量比较大的放到前面
c:对于经常检索查询或者排序的字段应该加索引
d:一张表的索引不能超过4个,因为索引过多在insert或者update操作时会牺牲效率
e:在已经建立组合索引的字段,无需再建立单个索引
f:在索引字段上尽量避免使用聚会函数super,lower,trunc等或者is null is not null等,因为这样可能会不走索引
3:springMVC的整个流程
a:首先是浏览器客户端发送请求(地址栏填写请求地址http://www.baidu.com)
b:发送到dns服务器查询到对应的ip地址
c:建立连接,解析url地址,dispatchServlet分发器会调用handlerMapping,与后台的controller控制器进行映射,找到
对应的方法入口。
d:控制器调用service业务层,业务层调用dao层与数据库交互,处理业务逻辑,处理结果返回到controller层。
e:dispatchServlet分发器调用viewResolver组件将页面拼接前缀后缀,然后将jsp页面返回给前台
f:前台浏览器得到jsp页面以及data数据,渲染显示
4:string与StringBuilder、StringBuffered的区别
String字符串,一经创建就不可变动,但是StringBuilder与StringBuffered是可变的,
StringBuilder是非线程安全的,StringBuffered是线程安全的,一般情况下用的比较多的还是StringBuilder
5:遍历map的几种形式以及效率
遍历map,可以使用keyset或者entryset,map.keyset()得到的是key 的集合,map.entryset()得到的是
key-value映射关系的集合,一般情况下entryset的效率会高
public static void listMap(MaptmpMap){ for(String key:tmpMap.keySet()){ Object value = tmpMap.get(key); System.out.println(key+"==="+value); } }
public static void listMap(MaptmpMap){ for(Map.Entry entry:tmpMap.entrySet()){ String key = entry.getKey(); Object value = entry.getValue(); System.out.println(key+"==="+value); } }