GVKun编程网logo

在Java中同时实现Map和List接口?(java map和list)

7

本文将为您提供关于在Java中同时实现Map和List接口?的详细介绍,我们还将为您解释javamap和list的相关知识,同时,我们还将为您提供关于Javalist接口、javaList接口中常用类

本文将为您提供关于在Java中同时实现Map和List接口?的详细介绍,我们还将为您解释java map和list的相关知识,同时,我们还将为您提供关于Java list接口、java List接口中常用类、java – 为什么LinkedHashMap类实现Map接口?、JAVA 集合类1-List接口与Set接口的实用信息。

本文目录一览:

在Java中同时实现Map和List接口?(java map和list)

在Java中同时实现Map和List接口?(java map和list)

我想拥有一个在Java中同时实现Map和List接口的对象。这个想法与以下问题类似:Java Ordered
Map

我想将名称/值对添加到列表中,并让列表保留序列,但还可以按名称进行查找:

foo.put("name0", "value0");foo.put("name1", "value1");foo.get(1); --> Map.Entry("name1", "value1")foo.get("name0"); --> "value0"

这是问题所在:创建此类时:

class Foo implements Map, List {    // add all methods here}

我收到一个编译错误:

"The return type is incompatible with Map.remove(Object)"public boolean remove(Object o) {    return false;}

如果我没有实现Map和List接口,那么有很多Java集合方法无法在此数据结构上使用。

(此外,上面的Java Ordered Map中提出的解决方案不起作用的原因是LinkedHashMap没有get(int)方法。无法通过索引选择条目。)

答案1

小编典典

当你发现你不能同时实现List,并Map在同一类。但是对于您所需要的也没有必要。您需要的是data可以同时通过MapList接口访问。有点像Map作为entrySet()中的集合或使用Map.values()的Collection
访问数据。

简而言之,您需要在数据上有2个视图,一个视图实现List,另一个视图实现Map

如果有一个视图占主导地位(例如Map),则可以为地图实现提供一种方法ListgetAsList(),该方法将数据显示为List,并以Map的数据为后盾。

编辑

Paulo
Guedes给出的答案应该为您服务。已经有符合您要求的Map实现。关于使用多个不兼容的接口(一个简单的适配器还不够)呈现相同的数据的问题,我的回答更为笼统。

Java list接口

Java list接口

list中的元素可以重复,父接口是collection,实现类是:arraylist和vector。

arraylist:

package com.jike.list;

import java.util.ArrayList;
import java.util.List;

public class ListDemo01 {

	public static void main(String[] args) {
		List<String>lists=null;
		lists=new ArrayList<String>();
		lists.add("A");
		lists.add("B");
		lists.add("A");
		for (int i = 0; i < lists.size(); i++) {
			System.out.println(lists.get(i));
		}
		lists.remove(0);
		System.out.println("删除之后-------");
		for (int i = 0; i < lists.size(); i++) {
			System.out.println(lists.get(i));
		}
		System.out.println("lists为空:"+lists.isEmpty());
		System.out.println(lists.indexOf("A"));
	}

}

 vector:

package com.jike.list;

import java.util.List;
import java.util.Vector;

public class ListDemo02 {

	public static void main(String[] args) {
		List<String>lists=null;
		lists=new Vector<String>();
		lists.add("A");
		lists.add("B");
		for (int i = 0; i < lists.size(); i++) {
			System.out.println(lists.get(i));
		}
	}

}

 arraylist和vector的区别:

 


 

set:元素不能重复,可以排序。

两个实现的子类:

HashSet:散列存放

TreeSet:有序存放

package com.jike.list;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class setDemo01 {

	public static void main(String[] args) {
		Set<String>s=null;
		s=new HashSet<String>();
		s.add("A");
		s.add("B");
		s.add("D");
		s.add("C");
		s.add("F");
		s.add("E");
		System.out.println(s);
	}

}

 输出:

[A, B, C, D, E, F]

 

java List接口中常用类

java List接口中常用类

Vector:线程安全,但速度慢,已被ArrayList替代。

ArrayList:线程不安全,查询速度快。

LinkedList:链表结构,增删速度快。取出List集合中元素的方式:

get(int  index):通过脚标获取元素。

iterator():通过迭代方法获取迭代器对象。

ArrayList和Vector类都是基于数组实现的List类,Vector比较古老,被ArrayList取代了;

ArrayList是线程不安全的,而Vector是线程安全的,但是即使这样,也不推荐使用Vector,因为Collections有方法可以得到线程安全的ArrayList对象;

Collections类: static  List synchronizedList(List list) 返回指定列表支持的同步(线程安全的)列表。

 

Queue接口

 

继承Collection接口

模拟队列:先进先出(FIFO);

void add(Object e):将e插入到队列尾部;

Object element():获取队列头部的元素;

boolean offer(Object e):将e插入到队列的尾部,当使用有容量限制的队列时,此方法比add(Object e)方法更好。

Object peek():获取队列头部的元素。如果此双端队列为空,则返回 null。

Object poll():获取并删除队列头部的元素。如果此双端队列为空,则返回 null。

Object remove():获取并删除队列头部的元素。

 

 

Eg:练习:List的使用

 

设计Department  和 Employee 对象类(按照开发的样式没有写在一个文件里面)

//一个员工只可以有一个部门,所以按照普通的写法

//一个部门可以有许多员工,所以按照集合的写法;

 

 

//员工

package re538.Department;

 

public class Emp {

    private Dept dept;//一个员工只可以有一个部门,所以按照普通的写法

    private String name;

    public Dept getDept() {

        return dept;

    }

    public void setDept(Dept dept) {

        this.dept = dept;

    }

    public Emp(String name) {

        super();

        this.name = name;

    }

    public String toString(){//覆写toString方法

        return this.name+"";

    }

}

 

 

//部门

package re538.Department;

 

import java.util.List;

public class Dept {

    private String name;

    private List emp;//一个部门可以有许多员工,所以按照集合的写法;部门里的属性,员工!

    public Dept(String name) {

        super();

        this.name = name;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public List getEmp() {

        return emp;

    }

    public void setEmp(List emp) {

        this.emp = emp;

    }

    private Dept parent;//一个部门只有一个直接主管部门,所以普通写法

    private List children;//但是一个部门可以管理很多部门,充当很多部门的直接主管部门,所以使用集合

    public Dept getParent() {

        return parent;

    }

    public void setParent(Dept parent) {

        this.parent = parent;

    }

    public List getChildren() {

        return children;

    }

    public void setChildren(List children) {

        this.children = children;

    }

    public String toString(){

        return this.name.toString();

    }

}

 

//测试类,主方法!

 

package re538.Department;

 

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

 

public class TestDemo {

 

    public static void main(String[] args) {

        Emp e1 = new Emp("刘亦菲");

        Emp e2 = new Emp("章泽天");

        Emp e3 = new Emp("张月娟");

        Emp e4 = new Emp("王二五");

        Emp e5 = new Emp("刘昭");

        List list = new ArrayList();//把员工丢尽集合去

        list.add(e1);

        list.add(e2);

        list.add(e3);

        list.add(e4);

        list.add(e5);

        for (Object object : list) {//把员工给遍历出来,使用的是直接的foreach(四种方法之一)

            System.out.println("----->"+object);

        }

        System.out.println("-------------------");

        Dept d = new Dept("部门");//定义出一个部门来接收员工

        d.setEmp(list);//把员工这个集合丢到部门去。

        Dept d1 = new Dept("itcast");

        Dept cditcast = new Dept("成都传智播客");

        Dept gzitcast = new Dept("广州传智播客");

        Dept d4 = new Dept("CSDN");

        System.out.println(d4);

        List children = new ArrayList();

        children.add(cditcast);

        children.add(gzitcast);

        d1.setChildren(children);//定义直接被主管部门(集合)

        d1.setParent(d4);//定义直接主管部门

        Iterator it = children.iterator();//运用到了迭代遍历,四种之一!

        while(it.hasNext()){

            System.out.println(it.next());

        }

    }

}

java – 为什么LinkedHashMap类实现Map接口?

java – 为什么LinkedHashMap类实现Map接口?

参见英文答案 > Why do many Collection classes in Java extend the abstract class and implement the interface as well?10个
HashMap类实现了Map接口:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>,Cloneable,Serializable

LinkedHashMap类扩展了HashMap,这意味着它应该默认实现Map接口.为什么明确实现Map接口?

public class LinkedHashMap<K,V>
extends HashMap<K,V>

解决方法

你说得对:丢弃Map< K,V>来自链接哈希映射的声明不会改变任何东西.虽然LinkedHashMap< K,V>将实现Map< K,V>仅仅因为它扩展了HashMap< K,链接哈希映射从常规哈希映射派生的事实是实现细节,而不是硬性要求.

实现Map< K,V>另一方面,界面是一项基本要求.如果设计者决定实施LinkedHashMap< K,则该要求不会消失.从头开始,或依赖于其他一些基类,例如链表.

这就是为什么LinkedHashMap的设计者< K,V>提到地图< K,V>明确地说:如果在某个晚些时候基类会因重新设计而改变,那么界面将保持不变.

JAVA 集合类1-List接口与Set接口

JAVA 集合类1-List接口与Set接口

一.集合概述

JAVA语言的java.util包中提供了一些集合类,这些集合类也被被称为容器。

集合与数组的区别:

1.数组长度时固定的,集合的长度时可变的;

2.数组用来存放基本类型数据,集合用来存放对象的引用。

二.集合的分类

1.常用的集合有LIst集合,Set集合,Map集合。其中List与Set实现了Collection接口;

2.Collection接口是根接口,构成Collection的单位称为元素,Colletion接口通常不能直接使用,由List与Set进行实现;

三.List接口

1.List接口继承了Collection接口,包含了Collection中所有的方法,因为List时列表类型,所以元素有顺序,可以重复。List接口还有一些适用于自身的常用方法。

2.List接口的子类常用的分为ArrayList实现类和LinkedList实现类。

ArrayList实现类与LinkedList实现类的区别:

  • ArrayList是以数组为底层的实现机制,特点是查询速度快, 但是增删改效率低。

  • LinkedList是以链表为底层的实现机制,特点是查询速度慢, 增删改的效率高。

3.常用List接口方法

List集合以线性方式存储对象,因此可以通过对象的索引来操作对象。

public class Test{
    
    public static void main(String[] args) {
        List list1 = new ArrayList();  //创建一个List型集合
        list1.add(123);  //向集合中添加对象
        list1.add(1,"abc");  //向集合中的指定索引位置添加对象
        list1.add(new Person());
        System.out.println(list1);  //打印添加后的集合;打印结果:[123, abc, Person [name=null]]
        System.out.println(list1.size());  //获取集合中的元素个数;打印结果:3
        System.out.println(list1.isEmpty());  //判断集合中是否有元素;打印结果:false
        System.out.println(list1.indexOf(123));  //获取该对象第一次出现的索引位置,没有返回-1;打印结果:0
        System.out.println(list1.lastIndexOf("abc"));  //获取该对象最后一次出现的索引位置,没有返回-1;打印结果:1
        list1.set(1, "abcd");  //替换指定索引位置的元素对象;
        System.out.println(list1);  //打印结果:[123, abcd, Person [name=null]]
     System.out.println(list1.retainAll(list1));  //保留两个集合的交集,内容不相同返回true,否则返回false;打印结果:false
    
System.out.println(list1.equals(list1));  //判断两个集合是否相等,相等返回true,否则返回false;打印结果:true; Object o1 = list1.addAll(0,list1);  //向集合中的指定索引位置添加指定的集合对象; System.out.println(list1);  //打印结果:[123, abcd, Person [name=null], 123, abcd, Person [name=null]] System.out.println(list1.get(0));  //获取指定索引位置的对象;打印结果:123 Object o2 = list1.remove(1);  //删除指定索引位置的对象;打印结果:[123, Person [name=null], 123, abcd, Person [name=null]] System.out.println(list1); list1.remove(new Person());  //删除集合中的Person对象,需要重写equals方法;打印结果:[123, 123, abcd, Person [name=null]] System.out.println(list1); list1.remove(new Integer(123));  //删除集合中数字对象,需要对数字进行包装;打印结果:[123, abcd, Person [name=null]] System.out.println(list1); } }

四.Set接口常用方法

1.Set接口同样继承了Collection接口,包含了Collection中的所有方法,没有自己单独的方法,元素没有顺序,不可以重复。

2.Set接口下常用的子类分为HashSet和TreeSet两类,其中HashSet实现类是以哈希码为底层的实现机制,在添加相同成员变量的元素时需要重写哈希码和equals方法,否则程序会认为两个元素不相同。

public static void main(String[] args) {
        
        Set set1 = new HashSet();  //创建一个Set型集合;
        set1.add(Object );  //如果集合中不存在此元素,则添加此元素;
        set1.addAll(Collection);  //将参数集合中所有元素添加到此集合的尾部;
        set1.remove(Object);  //移除指定对象;
        set1.removeAll(Collection);  //保留非交集;
        set1.retainAll(Collection);  //保留交集;
        set1.clear();  //清除集合中的所有元素;
        set1.size();  //获取集合中的元素个数;
        set1.isEmpty();  //判断集合中是否有元素;
        set1.iterator();  //获取该集合元素上进行迭代的迭代器;        
    }

 

关于在Java中同时实现Map和List接口?java map和list的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Java list接口、java List接口中常用类、java – 为什么LinkedHashMap类实现Map接口?、JAVA 集合类1-List接口与Set接口的相关知识,请在本站寻找。

本文标签: