`

面试题(用栈代替队列的操作和原生map实现)

 
阅读更多

是skype电话面试,先行记录下来,总共有两道:

1. 通过栈的操作实现队列的操作:

即 用栈的基本方法push  pop 实现 出队和入队的方法

难点在于在不给出提示的情况下,能不能想出使用两个栈来实现队列操作。

  (1) 先将stack1 的所有数据pop,然后push至stack2 。

  (2) 取出stack2 的顶部元素, 实现出队操作。

  (3) 将stack2的所有元素,取出并压入至stack1中,此时可以在stack1中进行入队操作。

 

2. 如何实现一个map

我们知道,Map<K,V>是一个通用的接口,保存的对象时一个一个的键值对,核心就是如何在内部将键值对进行保存。

看过源码之后可以发现,除了在接口中存在put,get的操作方法,还有一个 内部接口Entry<K,V>(保存键值对)。

jdk中,对Map有一个抽象的实现类abstractMap, 其中有一个内部类SimpleEntry继承Entry接口,内部实现通过内部类的构造方法保存K,,V

 

 

private final K key;
private V value;
public SimpleEntry(K key, V value) {
	this.key   = key;
        this.value = value;
}

 

 

该抽象类对于map中通用put方法添加键值对的方式是无效的,调用是会抛出异常。

任何对于entrySet的操作,即取出键值对的集合操作,在此抽象类中均是无效的,必须在实现类中进行具体实现。在Haspmap中,键值对保存的集合为数组类型Entry table[DEFAULT_INITIAL_CAPACITY=16],计算key对象的哈希值。重写entryset方法等。

 

在此抽象类中,有效操作只能是基于键值对的最基本的getkey,getvalue方法。

自己在实现一个键值对的操作时,我们可以借助map接口和这一个抽象类。

在保存键值对集合时,我们可以使用数组,或者链表。

List<Map.Entry<KeyObject, Object>> returnList = new ArrayList<Map.Entry<KeyObject, Object>>();

Map.Entry<KeyObject, Object> entryTmp = new AbstractMap.SimpleEntry<KeyObject, Object>(K, V);
			
returnList.add(entryTmp);

 

在遍历hashmap以及其他实现map的方法时,有两种方法:

1. keyset 遍历;

2. entryset 遍历

而使用第二种方法进行遍历时,我们需要采用Map.Entry<KeyObject, Object> entry为遍历对象,直接对其进行entry.getValue(), entry.getKey() 两种方法操作即可。

for (Map.Entry<KeyObject, Long> entry : hashMap.entrySet()) {
		entry.getValue() .....
                entry.getKey() .....
}

 

在已知value的情况下,判断当前map中是否存在该value情况,

调用原生containValue方法即可。

或者使用上述第二种遍历方法,取出键值对中的value进行equal判断。此时进行的操作与原生containvalue方法的原理一致。代码如下:

public boolean containsKey(Object key) {
	Iterator<Map.Entry<K,V>> i = entrySet().iterator();
	if (key==null) {
	    while (i.hasNext()) {
		Entry<K,V> e = i.next();
		if (e.getKey()==null)
		    return true;
	    }
	} else {
	    while (i.hasNext()) {
		Entry<K,V> e = i.next();
		if (key.equals(e.getKey()))
		    return true;
	    }
	}
	return false;
    }

 

 

0
0
分享到:
评论

相关推荐

    js高级面试题

    - **Set 和 Map 数据结构**:为集合操作提供了更多灵活的选项。 - **Proxy 和 Reflect**:增强了反射机制,可以用来拦截和定制基本操作。 ### 原型如何实际应用 JavaScript 中的所有对象都具有一个原型对象。通过...

    字节最新前端面试题.pdf

    - 深度优先拷贝通常使用递归实现,广度优先拷贝通常使用队列实现。 7. ES5和ES6继承的区别: - ES5通过原型链和构造函数实现继承,而ES6提供class关键字,让原型链继承的写法更加直观、简洁。 8. setTimeout、...

    2023 Java 面试真题一本通

    1. **Java基础**:包括面向对象编程、异常处理、集合框架(List, Set, Map的区别与使用)、IO流、NIO、网络编程等。 2. **JVM**:理解内存模型(堆、栈、方法区)、垃圾回收机制、类加载器、JVM调优参数等。 3. **...

    【美团】Java 岗 154 道面试题1

    【美团】Java 岗 154 道面试题涵盖了Java集合、JVM调优和并发编程等核心领域,下面将详细解释其中的部分知识点。 1. **ArrayList 和 Vector 的区别**:ArrayList 是基于动态数组的数据结构,而 Vector 是线程安全的...

    Java全栈相关的【知识技术解决方案难题面试题】知识库

    7. **面试题总结**: - 技术原理:例如Spring Boot的自动配置原理、Spring Cloud的微服务架构等。 - 实战经验:如何解决线上问题,项目中的优化措施等。 - 系统设计:大型网站架构设计、高并发处理、负载均衡策略...

    高级Java人才培训专家-微服务常见面试题

    ### 高级Java人才培训专家-微服务常见面试题 #### SpringCloud常见组件有哪些? Spring Cloud 是一套基于 Spring Boot 的微服务解决方案,它提供了一系列工具和服务来帮助开发者快速构建微服务架构的应用。Spring ...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.19.docx

    以上是针对 Java 后端开发的高频面试题,涵盖了反射、Spring 框架、微服务、数据库、并发编程、函数式编程、API 设计、测试、容器化、数据库和版本控制等多个方面,这些都是 Java 开发者需要掌握的基础知识和技能。

    46道史上最全Redis面试题

    - **Hash(哈希):**用于存储字段和值的映射关系,类似于 Map 结构。 ### Redis 资源消耗 Redis 主要消耗的是内存资源。由于所有数据都存储在内存中,因此内存是 Redis 运行过程中最重要的物理资源。 ### Redis ...

    Android技术面试整理附有详细答案(包括百度、新浪、中科软等多家公司笔试面试题)

    ### Android技术面试整理知识点 #### 1. Android的四大组件及其作用 - **Activity**: Activity是Android应用程序中负责用户交互的主要部分。它是Android四大组件之一,用于构建应用程序的界面,并处理与用户相关的...

    面试准备.pdf

    - **创建线程的方式及实现**:包括继承Thread类和实现Runnable接口。 - **sleep()、join()、yield()的区别**:sleep()方法让线程进入阻塞状态,join()方法用于等待其他线程终止,yield()方法使当前线程让出CPU执行权...

    蚂蚁中间件团队面试题:Netty+Redis+Kafka+MongoDB+分布式

    2. **其他集群方案**:除了Twemproxy之外,还有Redis Cluster原生支持的集群模式,该模式下每个节点都可以是主节点或从节点,支持数据分区和故障转移等功能。 #### Redis的内存管理 - **LRU算法**:Redis使用近似...

    1000道 互联网Java工程师面试题 485页_PDF密码解除.pdf

    从提供的文件内容来看,这份文档是一份为准备互联网Java工程师面试的题集,涉及了多个Java领域的技术栈,包括但不限于MyBatis、ZooKeeper、Dubbo等。以下是按照文件内容整理出的知识点: ### MyBatis知识点 1. **...

    IT面试宝典

    综合部分可能包含更多跨领域的面试题,比如算法与数据结构、操作系统原理、网络协议、软件工程、项目管理等。例如: 1. **算法与数据结构**:排序算法(快速排序、归并排序等)、查找算法(二分查找、哈希查找),...

    java面试集锦

    面试集锦中的"面试题2"可能包含了以上各个领域的具体问题,准备面试时,应逐一深入学习和实践,确保对每个知识点都有扎实的理解和实际操作经验。同时,掌握面试技巧,如如何清晰地表达自己的思路,如何应对压力,也...

    挖财(24问).pdf

    例如,使用数组来存储有序集合,使用栈或队列处理任务的先后顺序,或者使用对象和Map来存储键值对数据。 16. Native提供给RN的能力:React Native是一个能够在原生平台上使用React来编写本地渲染应用的框架。通过...

    java题库perfect

    原始类型与封装类在内存管理和使用上有显著区别,原始类型直接存储在栈中,封装类则作为对象存储在堆中。 13. **Java 简单类型与封装类的区别**:Java 的简单类型(原始类型)包括 byte, Boolean 等,它们是直接...

    202101-interview-data:2021年01月面试准备资料

    最后,题库整理部分可能涵盖了常见的算法和数据结构题目,如排序(快速排序、冒泡排序、选择排序等)、查找(二分查找、哈希查找等)以及栈、队列、链表、树等。理解并能熟练应用这些基础知识将使你在面试中表现出色...

    leetcode-daily:LeetCode日常刷题

    对于C++编程来说,理解如何高效地操作内存(如指针和引用)、掌握STL(Standard Template Library)容器(如vector、list、set、map等)的使用、以及熟悉算法库(如排序、搜索函数)是至关重要的。在解题过程中,...

    LeetCodeLife:我的LeetCode进阶之路

    例如,你可以学习如何使用JavaScript的`Array.prototype`方法(如`map()`、`filter()`和`reduce()`)来处理数组数据,或者利用`String.prototype`方法进行字符串的拼接、查找和替换。 接着,进阶到数据结构的学习。...

Global site tag (gtag.js) - Google Analytics