`
lydawen
  • 浏览: 464618 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一道关于使用List保存数据做快速检索面试题

    博客分类:
  • java
 
阅读更多

原文:http://www.iteye.com/topic/1112278

 

 

 写道
有大数据量的User对象(name,sex,age)属性。

现要求直允许使用List存放,如何实现按name快速检索到对应的User对象?

 

 

主类:

 

 

 

package com.kanmenzhu.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
 * 测试主类
 *
 * @param <V>
 */
public class FastList<V extends BaseUser> {

	//能保存的个数
	private int LIST_SIZE=16;
	
	private List<LinkedList<V>> storeList;
	
	//当前保存个数
	private int CUR_SIZE;
	//初始化list
	public FastList(int initSize){
		this.LIST_SIZE=initSize;
		storeList=new ArrayList<LinkedList<V>>(LIST_SIZE);
		for(int i=0;i<LIST_SIZE;i++){
			storeList.add(null);
		}
	}
	
	/**
	 * 添加用户到list
	 * @param bu 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public V addUser(V arg){
		CUR_SIZE++;
		if(CUR_SIZE>LIST_SIZE){
			throw new RuntimeException("容量超标,初始化容量设置太小!");
		}
		int hashCode=(arg.getUserName()).hashCode();
		int i=hashCode&(LIST_SIZE-1);
		Object o=storeList.get(i);
		
		BaseUser v;
		if(o!=null) {
			o=(LinkedList<V>)o;
			LinkedList<V> linkList=(LinkedList<V>)o;
			Iterator<V>  iter=linkList.iterator();
			
			for(v=iter.next();v!=null;v=iter.next()){
				if(v.getUserName().equals(arg.getUserName())&&v.equals(arg)){
					return arg;
				}
				if(!iter.hasNext())
					break;
			}
			linkList.addLast(arg);//如果遍历下来,发现不存在姓名相同且用户也不相同的,则表示为同名或同索引用户,添加到链表未
			return null;
		}else{//当前位置无数据
			LinkedList<V> tempLinked=new LinkedList<V>();
			tempLinked.add(arg);
			storeList.set(i, tempLinked);
			return null;
		}
	}
	/**
	 * 根据姓名获取用户
	 * @param arg
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<V> getUser(String arg){
		int hashCode=arg.hashCode();
		int i=hashCode&(LIST_SIZE-1);
		List<V> retuList=new ArrayList<V>();
		LinkedList<V> linkList=storeList.get(i);
		Iterator<V>  iter=linkList.iterator();
		BaseUser v;
		//遍历对应索引位置是否存在多个用户(用户姓名经过hash&list.size()之后可能存在同一位置多个不同名数据情况)
		for(v=iter.next();v!=null||iter.hasNext();v=iter.next()){
			if(v.getUserName().equals(arg)){
				retuList.add((V)v);
			}
			if(!iter.hasNext())
				break;
		}
		
		if(retuList.size()==0)
			return null;
		
		return retuList;
	}
	
	public static void main(String[] args) {
		FastList<MyUser> fl=new FastList<MyUser>(16);
		MyUser mu1=new MyUser();
		mu1.setAge(1);
		mu1.setUserName("张三");
		MyUser mu2=new MyUser();
		mu2.setAge(2);
		mu2.setUserName("张三");
		MyUser mu3=new MyUser();
		mu3.setAge(3);
		mu3.setUserName("李四");
		fl.addUser(mu1);
		fl.addUser(mu2);
		fl.addUser(mu3);
		
		List<MyUser> ml=fl.getUser("张三");
		for(MyUser mu:ml){
			System.out.println(mu);
		}
	}
}
 

辅助用户类:

 

package com.kanmenzhu.test;
/**
 * 用户基类,以保证用户存在用户名方法
 *
 */
public abstract class BaseUser {

	protected  abstract String getUserName();
} 

 

用户类:

 

package com.kanmenzhu.test;
/**
 * 测试用户类
 *
 */
public class MyUser extends BaseUser {

	private String userName;
	private int age;
	@Override
	public String getUserName() {
		return userName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public String toString(){
		return "userName:"+userName+" age:"+age;
	}

}
 

代码上没太大难度,这里没考虑扩容的情况,hash与index的关系可以参数HashMap,重复度非常小。

分享到:
评论
3 楼 lydawen 2011-08-15  
hyj1254 写道
我曾被问过重写HashMap的问题,由于平常没接触过这方面的工作,所以即使知道HashMap的构造原理也不知道出于什么目的要重写。不知道除了lz所写的可以处理name重名的情况外,实际项目中还有什么典型应用吗?

重名问题考虑了,如果有重名的这个时候将返回一个重名List,HashMap原理也与这个类似,当两个Key最后算出来的索引一致且hashCode,equals都不相等,则添加到一个双向链表末端。我上边的实现是如果算出来的索引相等,则判断两个User是否equals,这里需要重载User的equals,如果equals不相等则添加到LinkedList末端。.
2 楼 lydawen 2011-07-18  
hyj1254 写道
我曾被问过重写HashMap的问题,由于平常没接触过这方面的工作,所以即使知道HashMap的构造原理也不知道出于什么目的要重写。不知道除了lz所写的可以处理name重名的情况外,实际项目中还有什么典型应用吗?

很少有涉及到复杂数据结构,一般面试的时候会有这些。
1 楼 hyj1254 2011-07-18  
我曾被问过重写HashMap的问题,由于平常没接触过这方面的工作,所以即使知道HashMap的构造原理也不知道出于什么目的要重写。不知道除了lz所写的可以处理name重名的情况外,实际项目中还有什么典型应用吗?

相关推荐

    10个Java经典的List面试题!.zip

    10个Java经典的List面试题!.zip

    caokegege#Interview#BAT面试笔试33题:JavaList、Java Map等经典面试题!答案汇总1

    1、List集合:ArrayList、LinkedList、Vector等 2、Vector是List接口下线程安全的集合 3、List是有序的 4、Array

    Java 基础面试题

    该文档主要整理了常见的Java基础面试题,包含以下内容: 1. 抽象类和接口的区别 2. 什么时候使用抽象类,什么时候使用接口 3. 八大基本数据类型,所占字节数 4. List、Set、Map的区别 5. 什么情况下使用List、...

    java面试题总结

    对于平时java面试的一些总结,关于基础java的一些原理题型、还有map、list、set等相关的知识面试题

    10个Java经典的List面试题

    10个Java经典的List面试题

    Redis面试题.pdf

    Redis通常被称为数据结构服务器,因为值(value)可以是 字符串(String)、哈希(Map)、列表(list)、集合(sets)、有序集合(sorted sets)等类型。 Redis是一个key-value存储系统,它支持丰富的数据类型,这些数据类型...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    JAVA面试题最全集

    如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多...

    java面试题以及技巧

    │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ 孙卫琴精通struts.基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科...

    CoreJava面试题汇总.html

    CoreJava面试题总结。 1 常用的集合有哪些?为什么这么用? 2 静态变量和成员变量的区别 3 filter过滤器用过么,一般用在什么地方? 4 多线程一般用在什么地方? 5 list用过哪些?ArrayList如何排序?list跟set的...

    java面试题精选

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

    面试题:robotframework题.pdf

    ⾯试题: ⾯试题:robotframework题 题 根据我之前总结的robotframework笔记,相信这些题不在话下,否则的话,只能再去回顾⼀遍啦! 01: :RF⽀持的四种表? ⽀持的四种表? Setting,Variable,Testcase,keywords...

    Redis常见面试题汇总.pdf

    Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现-个轻量 级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存 入的Key-Value设置expire时间,因此也可以被...

    Python经典面试题 Python常见面试考试题目整理总结 Python面试题手册 共15页.pdf

    Python经典面试题 Python常见面试考试题目整理总结 Python面试题手册 1:Python 如何实现单例模式? 2:什么是 lambda 函数? 3:Python 是如何进行类型转换的? 4:Python 如何定义一个函数 5:Python 是如何进行...

    redis面试题.txt

    以下是一个关于Redis面试题的例子: 1. Redis的优势是什么? Redis具有以下几个优势: - 高性能:Redis是基于内存的数据库,读写速度非常快。 - 支持丰富的数据结构:Redis支持字符串、哈希表、列表、集合、有序...

    前端上机面试题

    实现列表数据渲染,点击对应的筛选条件(全部、按进度排序、按总需人次排序、即将揭晓)加载及渲染相应的数据,所有筛选条件的url请求地址都为http://192.168.2.10:90/app/mock/21/list,(返回的数据不需要排序,...

    Redis面试题50道(含答案)_.pdf

    36、Redis 持久化数据和缓存怎么做扩容? 37、分布式 Redis 是前期做还是后期规模上来了再做好?为 什么? 38、Twemproxy 是什么? 39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同...

    关于python的面试题

    Python基础 文件操作 1.有一个jsonline格式的文件file....企业面试题 15.python新式类和经典类的区别? 16.python中内置的数据结构有几种? 17.python如何实现单例模式?请写出两种实现方式? 18.反转一个整数,例如-123

    前端大厂最新面试题-Linked List.docx

    前端大厂最新面试题-Linked List.docx

Global site tag (gtag.js) - Google Analytics