本文将为您提供关于在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 list接口
- java List接口中常用类
- java – 为什么LinkedHashMap类实现Map接口?
- JAVA 集合类1-List接口与Set接口
在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
可以同时通过Map
和List
接口访问。有点像Map
作为entrySet()中的集合或使用Map.values()的Collection
访问数据。
简而言之,您需要在数据上有2个视图,一个视图实现List
,另一个视图实现Map
。
如果有一个视图占主导地位(例如Map),则可以为地图实现提供一种方法ListgetAsList()
,该方法将数据显示为List,并以Map的数据为后盾。
编辑
Paulo
Guedes给出的答案应该为您服务。已经有符合您要求的Map实现。关于使用多个不兼容的接口(一个简单的适配器还不够)呈现相同的数据的问题,我的回答更为笼统。
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接口中常用类
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接口?
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,则该要求不会消失.从头开始,或依赖于其他一些基类,例如链表.
这就是为什么LinkedHashMap的设计者< K,V>提到地图< K,V>明确地说:如果在某个晚些时候基类会因重新设计而改变,那么界面将保持不变.
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接口的相关知识,请在本站寻找。
本文标签: