JAVA之容器类简介
一、容器简介
容器是一个将多个元素组合到一个单元的对象,是代表一组对象的对象,容器中的对象成为它的元素。容器适用于处理各种类型的对象的聚集,例如存储、获取、操作聚合数据,以及聚合数据的通信。容器只保存Object型的引用,这是所有类的基类,因此容器可以保存任何类型的对象。
二、容器接口的分类
根据容器所包含的对象的不同可以将容器接口分为Collection和Map两大类,实现Collection接口的容器实现是一个包含孤立元素的对象集合,而实现Map接口的容器实现是一个包含成对元素的对象集合。
1)、Collection接口代表一组对象,这些对象称为它的元素。Collection是容器继承树中的顶层接口,作为接口它定义了15个方法,但没有提供具体的实现。
Collection接口如下:
结果是:
结果是:
(3)LinkedHashSet
import java.util.*;
public class ListDemo {
public static List fill(List fill_a){
fill_a.add("a");
fill_a.add("b");
fill_a.add("c");
return fill_a;
}
private static boolean b;
private static Object o;
private static int i;
private static Iterator it;
private static ListIterator lit;
public static void basicTest(List a){
a.add(0,"x");
a.add("8");
System.out.println("初始List A为:"+a);
a.addAll(fill(new ArrayList()));//追加新的List
System.out.println("追加新的List后,List A为:"+a);
b=a.contains("c");
if(b){
System.out.println("元素c包含在List A中");
}
else{
System.out.println("元素c没有包含在List A中");
}
//判断子List<a,b,c>是否在ListA中
b=a.containsAll(fill(new ArrayList()));
if(b){
System.out.println("List<a,b,c>包含在ListA中");
}
else{
System.out.println("List<a,b,c>没有包含在ListA中");
}
o= a.get(1);//得到位置1处的元素
System.out.println("位置1元素为:"+o);
i=a.indexOf("c");//指定元素c第一次出现的位置
System.out.println("元素c第一次出现的位置为:"+i);
b= a.isEmpty();
if(b){
System.out.println("List A是空的");
}
else{
System.out.println("List A不是空的");
}
a.remove(1);
System.out.println("位置1元素被删除后,List A为:"+a);
a.remove("c");//删除第一个“c”元素
a.set(1, "y");//将位置1的元素替换为y
System.out.println("位置1的元素被替换为y,List A为:"+a);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
basicTest(new LinkedList());
}
}
追加新的List后,List A为:[x, 8, a, b, c]
元素c包含在List A中
List<a,b,c>包含在ListA中
位置1元素为:8
元素c第一次出现的位置为:4
List A不是空的
位置1元素被删除后,List A为:[x, a, b, c]
位置1的元素被替换为y,List A为:[x, y, b]
import java.util.LinkedList;
public class ListDemo {
private LinkedList list = new LinkedList();
public void push(Object v){
list.addFirst(v);
}
public Object top(){ //压栈
return list.getFirst();
}
public Object pop(){ //弹栈
return list.removeFirst();
}
public static void main(String[] args) {
ListDemo stack = new ListDemo();
for (int i=0;i<10;i++){
stack.push(new Integer(i));
//打印当前的栈顶
System.out.print(stack.top()+" ");
}
System.out.println();
System.out.print(stack.top()+" ");
//弹栈,并打印当前弹出的元素
System.out.print(stack.pop()+" ");
System.out.print(stack.pop()+" ");
System.out.print(stack.pop()+" ");
System.out.print(stack.pop()+" ");
}
}
9 9 8 7 6
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class ListDemo {
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put(new Integer(1),"A");
hm.put(new Integer(2), "B");
hm.put(new Integer(3), "C");
hm.put(new Integer(4), "D");
hm.put(new Integer(5), "E");
Set s=hm.keySet();
Iterator i=s.iterator();
while(i.hasNext()){
Object k=i.next();
Object v=hm.get(k);
System.out.println(" "+k+"="+v);
}
}
}
2=B
3=C
4=D
5=E
(2)TreeMap
TreeMap继承于AbstractMap,同时实现了SortedMap接口,这与前面提到的TreeSet相似,而且在处理由TreeMap的keySet()方法得到的集合与TreeSet相同。TreeMap的访问
方法与HashMap相同,而且不管元素加入的顺序如何,最后输出的结果总是按照键(Key)从小到大排列的,因此要求Key实现Comparable接口,并且更重要的是相互之间
是可比的。
TreeMap示例:
package LianXi;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class ListDemo {
public static void main(String[] args) {
TreeMap tm1= new TreeMap();
TreeMap tm2=new TreeMap();
//tm1和tm2元素的输入顺序不同
tm1.put(new Integer(1), "A");
tm1.put(new Integer(2), "B");
tm1.put(new Integer(3), "C");
tm1.put(new Integer(4), "D");
tm1.put(new Integer(5), "E");
tm2.put(new Integer(5), "E");
tm2.put(new Integer(3), "C");
tm2.put(new Integer(4), "D");
tm2.put(new Integer(1), "A");
tm2.put(new Integer(2), "B");
//通过集合+迭代器的方法来遍历TreeMap对象tm1
Set s1=tm1.keySet();
Iterator i1= s1.iterator();
while(i1.hasNext()){
Object k= i1.next();
Object v= tm1.get(k);
System.out.print(" "+k+"="+v);
}
System.out.println();
//通过集合+迭代器的方法来遍历TreeMap对象tm2
Set s2=tm2.keySet();
Iterator i2= s2.iterator();
while(i2.hasNext()){
Object k= i2.next();
Object v= tm2.get(k);
System.out.print(" "+k+"="+v);
}
}
}
//运行结果
1=A 2=B 3=C 4=D 5=E
1=A 2=B 3=C 4=D 5=E
(3)LinkedHashMap
LinkedHashMap提供了LinkedHashSet不具备的两个功能:第一,当创建LinkedHashMap时可以按照键访问进行排序,即与被很少查看的值关联的键被安排到Map的末尾;
第二,LinkedHashMap提供removeEldestEntry方法(),可以覆盖这个方法,以便在新的映射对加入到Map时自动强制地删除旧映射对的策略。
LinkedHashMap演示实例:
package LianXi;
import java.util.LinkedHashMap;
import java.util.Map;
public class MyLinkedHashMap extends LinkedHashMap {
private final int Capacity;
//ListDemo构造函数
public MyLinkedHashMap(int maxCapacity){
super(maxCapacity,0.75f,true);
//LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
//构造一个带指定初始容量、加载因子和排序模式的空 LinkedHashMap 实例。
Capacity=maxCapacity;
}
//重载removeEldestEntry()方法,使ListDemo的实例最多容纳Capacity个元素
protected boolean removeEldestEntry(Map.Entry eldest){
return this.size()>Capacity;
}
}
package LianXi;
public class ListDemo{
public static void main(String ags[]){
MyLinkedHashMap mym=new MyLinkedHashMap(5);
//初始化MyLinkedHashMap
mym.put(new Integer(1), "A");
mym.put(new Integer(2), "B");
mym.put(new Integer(3), "C");
mym.put(new Integer(4), "D");
mym.put(new Integer(5), "E");
System.out.println("初始化Map序列:"+mym);
//通过get操作将前3个元素依次放到Map头部,最后被放在头部的是第3个元素
for(int i=1;i<4;i++){
mym.get(new Integer(i));
}
System.out.println("移动队尾3个元素后的Map序列:"+mym);
//添加第6个元素,但是mym的最大值为5
//所以删除最不“常用”的元素,即尾部的元素“D”
mym.put(6, "F");
System.out.println("添加新元素替换队尾元素后的序列"+mym);
}
}
(4)EnumMap
EnumMap在内部实现为Array,它是用于枚举键的高性能Map实现。这个实现结合了Map接口的丰富功能和安全性以及数组的高速访问。如果我们希望把枚举映射到值,就应该
使用EnumMap,而不是数组。
(5)WeakHashMap
WeakHashMap是值存储对其键的弱引用的Map接口实现。
(6)IdentityHashMap
IdentityHashMap是散列表基于标识的Map实现。
8)hashCode()方法
(1)散列码
散列码就是一种通过不可逆的散列(Hash)算法对一个键(数据)进行计算获得一个“唯一”的值,并将这个值放入散列表中。这个值可以对这个键(数据)进行标识。在
查找键(数据)的时候,可以通过散列表中的此值来快速定位键(数据),从而有效减少开销
散列算法就是一种用于实现散列的方法,它接受一个查找键(数据),计算出该键(数据)的散列码,然后再将此散列码压缩到散列表的范围内。总之,使用散列的目的在于:
想要使用一个对象查找另一个对象。
(2)Java中的hashCode()方法
对于HashMap,Java将键-值中的“键”作为输入数据进行散列,并形成散列表。Java中的对象都继承于基类Object,Object类有一个方法hashCode(),它默认是使用对象的地址作为散列算法的输入,返回一个整数散列码,所以Java中每个类都有此方法。
hashCode()方法是根据对象的内存地址来返回一个散列码,这样内容不同的对象实例就会返回不同的散列码,一般我们在构建自己的类时需要重写此方法。重载hashCode()
方法的同时需要重载Object类中另一个方法equals()。HashMap使用equals()判断当前的“键”是否与表中存在的“键”相同。重载hashCode()方法需要遵循以下原则:
《1》如果某个类覆盖了hashCode(),那么它也应该覆盖equals(),反之亦然。
《2》如果equals()返回相同的值,那么hashCode()也应该返回相同的值
《3》在同一个程序的两次执行中,对象的散列码可以不同
(3)重载hashCode()方法的常用散列算法
对于字符串散列码的计算一般采用如下方法:将每个字符的Unicode值乘以一个该字符在字符串的位置的因子,散列码就是所有这些乘积的和。Java中的String的hashCode()
就是用常数31作为因子。
对于基本类型的散列码的计算,一般都是转化为int型。在Java中对于long型的数据,一般是用移位操作将64位的值转换为32位的int值。对于double和float类型,一般用其
封装类的Double.doubleToLongBits(key)或者Float.floatToLongBits(key),然后通过移位和异或来完成
重载hashCode()方法演示:
package LianXi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ListDemo{
private static List created = new ArrayList();//创建一个ArrayList对象created
private String s;
private int id=0;
ListDemo(String str){
s=str;
created.add(s);
Iterator it = created.iterator();
while(it.hasNext()){
if(it.next().equals(s))
id++;
}
}
public String toString(){ //定义toString方法
return "String: "+s+"id: "+id+"hashCode():"+hashCode();
}
public int hashCode(){//重载hashCode()方法
int result=17;
result=37*result+s.hashCode();
result=37*result+id;
return result;
}
public boolean equals(Object o){//重载equals()方法
return (o instanceof ListDemo)&&s.equals(((ListDemo)o).s)&&id==((ListDemo)o).id;
//instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
}
public static void main(String ags[]){
Map map =new HashMap();
ListDemo[] ld=new ListDemo[10];
for(int i=0;i<ld.length;i++){
//实例化10个CountedString对象,且其String值是一样的,而id值不一样
ld[i]=new ListDemo("hi");
//利用ListDemo作为hashMap的键
//在填充hashMap容器的时候,自动调用hashCode(),计算散列码
map.put(ld[i], new Integer(i));
}
//输出map,输出结果不是按输入顺序进行输出的
System.out.println(map);
for(int i=0;i<ld.length;i++){
System.out.print("Looking up"+ld[i]+"value==");
System.out.println(map.get(ld[i]));
}
}
}
9)迭代器
迭代器(Iterator)是一个对象,它的工作是遍历并选择序列中的对象,它提供一种方法访问一个容器(Container)对象中各个元素,而又不需要暴露该对象的内部细节。
此外,迭代器通常被称为“轻量级”对象,因为创建它的代价小。因此经常见到对迭代器有限制,例如:某些迭代器只能单向移动
(1)迭代器的使用
使用方法Iterator(),容器返回一个Iterator的next()方法时,它返回序列的第一个元素。
用next()获取序列中的下一个元素,并将游标(Cursor)向后移动
使用hasNext()检查序列中是否还有元素
使用remove()将上次返回的元素从迭代器中移除
ListIterator从Iterator继承了next()、hasnext()和remove()3个方法,hasPrevious()和previous()模拟了hasnext()和next(),只是方向不同。hashnext()和next()指向游标之后
的元素,而hasPrevious()和Prevous()指向游标之前的元素
(2)迭代器的主要用法:
首先用hasNext()作为循环条件,再用next()方法得到每个元素,最后再进行相关的操作。
10)HashMap和HashTable的区别
(1)HashTable的方法是同步的,HashMap不能同步
(2)HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)
(3)HashTable有一个contains()方法,功能和containsValue()功能一样
(4)HashTable使用Enumeration,HashMap使用Iterator
(5)hash数组的初始化大小及其增长方式不同
(6)哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap会重新计算hash值
JAVA之容器类简介相关推荐
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- java 设计模式_快速上手Java设计模式之简介
阅读本文约需要5分钟 大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务! 1.长期为你提供最优质的学习资源! 2.给你解决技术问题! 3.每天在朋友圈里分享 ...
- java.util.concurrent简介
文章目录 主要的组件 Executor ExecutorService ScheduledExecutorService Future CountDownLatch CyclicBarrier Sem ...
- Java GC系列(1):Java垃圾回收简介
转载自 Java GC系列(1):Java垃圾回收简介 这篇教程是系列第一部分.首先会解释基本的术语,比如JDK.JVM.JRE和HotSpotVM.接着会介绍JVM结构和Java 堆内存结构.理解 ...
- java 模块化osgi_OSGi简介–模块化Java
java 模块化osgi OSGi联盟是这种搁浅的管理机构,它始于1999年.其最初目标是为网络设备创建开放搁浅. 基于此思想,此规范也针对Java引入. Eclipse在Java中是第一个. 他们于 ...
- java的容器类有哪些实现方式_Java基础--容器类
面试官:Java的容器类你有什么了解吗? -:额,没有用过.... 面试官:你肯定用过,但你没有注意过.... -:应该是吧.... 你知道什么是容器类吗?Java容器可以说是增强程序员编程能力的基本 ...
- 【Java程序设计】Java基础类库简介
Java基础类库简介 文章目录 Java基础类库简介 一.Java基础类库介绍 二.语言包(java.lang) (1)数据类型包裹类 1.生成数据类型包裹类对象的方法 2.得到基本数据类型数据的方法 ...
- Java虚拟机JVM简介与理解(三)
Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...
- Java JSON格式简介说明
转自: Java JSON格式简介说明 下文笔者讲述java中JSON格式的相关简介说明,如下所示: JSON简介说明 JSON(JavaScript Object Notation) 是一种轻量级的 ...
最新文章
- BufferedReader和PrintWriter读写中文的问题
- OpenCV 霍夫线检测
- SAPI(PHP常见的四种运行模式)
- Error during job, obtaining debugging information... FAILED: Execution Error, return code 2 from org
- python concat_python中merge、concat用法
- java 静态导入_Java中静态导入的使用
- 网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开
- 2.vue的diff算法(2020.12.07)
- 觅风易语言智能辅助开发视频教程(高清带源码)
- eclipse配置Tomcat9
- 美团外卖uml流程图_以美团外卖为例,浅析业务流程图和页面流程图
- win8电脑怎么把计算机快捷方式,Win8怎么隐藏桌面快捷方式小箭头_Win8去掉快捷方式箭头-192路由网...
- 2.4 混合策略和混合策略纳什均衡
- freenas 蜗牛星际_蜗牛星际 B款 配置、安装OpenMediaVault
- SDN:mininet交换机流表操作
- 【f1c200s/f1c100s】使用genimage工具制作img系统镜像
- 计算机上播放时没声音什么故障,新买的电脑插上耳机没有声音怎么办?具体故障原因及解决方法看这里...
- Aggregation-Based Graph Convolutional Hashing forUnsupervised Cross-Modal Retrieval
- 理解MySQL主从复制之realy_log_recovery
- Web重构之道 大漠