面试总结二

接着上一篇再谈:

四:某游戏平台项目

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<User> {

	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) {
		List<User> userList = sortUsers();
		printMap(userList);
		Collections.sort(userList);
		System.out.println("====排序后====");
		printMap(userList);
	}

	public static void printMap(List<User> userList) {
		for (User user : userList) {
			System.out.println(user);
		}
	}

	public static List<User> sortUsers() {
		List<User> userList = new ArrayList<User>();
		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(Map<String,Object> tmpMap){
		for(String key:tmpMap.keySet()){
			Object value = tmpMap.get(key);
			System.out.println(key+"==="+value);
		}
	}

 

public static void listMap(Map<String,Object> tmpMap){
		for(Map.Entry<String,Object> entry:tmpMap.entrySet()){
			String key = entry.getKey();
			Object value = entry.getValue();
			System.out.println(key+"==="+value);
		}
	}

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值