1.集合概述

(1)集合:

为了在程序中可以保存数目不确定的对象,JDK中在java.util包中提供了一系列可以存储任意类型的对象且长度可变的特殊类,在JAVA中这些类即集合类。

(2)集合分类:

集合按其存储结构可以分为两大类,即单列集合Collection和双列集合Map!

2.Collection接口

Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的方法,即:

注:此处列出的方法仅为部分,初学者可以查阅API文档学习更多。

3.List接口

(1)List接口简介

List接口继承自Collection接口(单列),实现了List接口的对象即List集合。
List集合的特点:元素以线性方式进行存储且通过索引来访问指定元素 元素可重复 元素有序即元素的存入与取出的顺序一致。
List的方法:List除了继承自Collection接口的方法,还根据元素索引增加了一些特有的方法 即:

(2)ArrayList集合

ArrayList是List接口的一个实现类,可看作一个长度可变的数组,因其内部封装了一个长度可变的数组对象,当元素超过数组长度时,ArrayList会在内存中分配一个更大的可变数组来存储元素。
ArrayList方法大部分继承自Collection和List。

当通过索引对集合进行操作时,特别注意集合与数组一样,索引的取值范围是从0开始的,最后一个索引是size-1

ArrayList优点:查找元素很方便
ArrayList缺点:对元素进行增删改操作效率比较低

采用索引的方式来访问元素,使得ArrayList集合查找元素很方便
ArrayList集合的底层是使用数组来存储元素的,因此在对集合进行修改操作时,集合会创建一个新的数组。具体如图:

(3)LinkedList集合

为克服ArrayList集合对集合元素进行修改效率低的局限性,List接口中存在另一个实现类LinkedList。
该集合以双向环链表方式存储元素,当增加一个新元素时,只需要修改元素之间的这种引用关系即可,因此LinkedList集合对集合元素进行增删改操作效率高。
如图:

对于元素的增删操作,LinkedList集合定义了一些特有的方法

(4)Iterater接口

Iterator接口是Java集合中主要用于遍历(迭代访问)Collection中的元素的接口,Iterator对象被称为迭代器。
工作原理:集合调用iterator()方法获得迭代器对象,随后使用hasNext()方法判断集合中是否存在下一个元素,若存在则调用next()方法获取元素,否则停止遍历元素。
在Iterator遍历内部对数组元素进行更改:
①集合对象.remove(变量名); break;
②Iterator游标名.remove();

(5)foreach循环

foreach循环(增强for循环):语法非常简洁,每次循环时,foreach中都通过变量将当前循环的元素记住,从而将集合中的元素分别打印出来。因此foreach循环不需要获取容器的长度,也不需要根据索引访问容器中的元素。
语法:for(容器中元素类型 临时变量:容器变量){ 执行语句 }
foreach循环不能对其中元素进行修改,for循环通过索引方式可以。

4.Set接口

(1)Set接口简介

与List接口一样,Set接口也继承Collection接口的方法,
与List接口不同,Set接口中元素无序且不重复。
Set接口主要实现类:HashSet和TreeSet。
HashSet根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。

(2)HashSet集合

工作原理:

实际开发中为保证HashSet正常工作,都需要重写Object类中的hashCode()和equals()方法
示例如下:

package homework_set;
import java.util.*;
class Person{//自定义Person类
private String name;
private String card; public Person(String name,String card){//构造方法调用私有属性
this.name=name;
this.card=card;
} //重写hashCode方法
public int hashCode(){
return name.hashCode();//以用户名作为判断重复依据
}
//重写equals方法
public boolean equals(Object obj){
if(this==obj){//判断是否同一个对象
return true;//如果是同一个对象,直接返回true
}
if(obj==null){//判断这个对象是否为空
return false;//如果对象是空的,直接返回false
}
if(getClass()!=obj.getClass()){//判断这个对象是否是Person类型
return false;//如果不是,直接返回false
}
Person other=(Person)obj;//将对象强转为Person类型
if(name==null){//判断集合中用户名是否为空
if(other.name!=null){//判断对象中的用户名是否为空
return false;//集合中用户名为空且对象中用户名不为空,则返回false
}
}else if(!name.equals(other.name)){//判断用户名是否相同
return false;//如果不同,返回false
}
return true;
}
//重写toString方法
public String toString(){
return name+":"+card;
}
}
public class set{
public static void main(String[] args) {//创建集合和对象
HashSet a=new HashSet();
try{
Person person1=new Person("李先生","220186");
Person person2=new Person("马先生","220181");
Person person3=new Person("李先生","220187");
Person person4=new Person("王小姐","220193");
//向集合添加元素
a.add(person1);
a.add(person2);
a.add(person3);
a.add(person4);
for(Object b:a){//遍历输出集合元素
System.out.println(b);
}
}catch(Exception e){
e.printStackTrace();
}
}
}

5.Map接口

(1)Map接口简介

Map接口是一种双列集合,具有映射关系,即:每一个元素都包含一个键对象Key和值对象Value,访问元素时只需指定Key就能找到对应的Value.
以下为map接口中常用方法:

(2)HashMap集合

HashMap集合是Map接口的一个实现类,用于存储键值映射关系,且保证不出现重复的键。

遍历map集合的三种方法:
方法一:

通过KeySet()方法获取Map中所有键的Set集合然后遍历所有键,再调用get()方法获取对应值

package course;
import java.util.*;
public class map2 {
public static void main(String[] args) {
Map map=new HashMap();//创建HashMap
//添加对象,键值对,键Integer类型,值String类型
map.put(4,"four");
map.put(9,"nine");
map.put(8,"eight");
map.put(9, "nine1");//键相同,值覆盖
//显示集合
System.out.println(map);
//方法一:
Set keySet=map.keySet();//去重 无序
Iterator it = keySet.iterator();//获取迭代器对象
while(it.hasNext()){
Object key=it.next();
Object value= map.get(key);
System.out.println(key+":"+value);
}
}
}

方法二:

先获取集合中所有的映射关系,然后从映射关系中取出键和值

package course;
import java.util.*;
public class map3 {
public static void main(String[] args) {
//方法二:
Map map=new HashMap();
//添加对象,键值对,键Integer类型,值String类型
map.put(4,"four");
map.put(9,"nine");
map.put(8,"eight");
Set entrySet=map.entrySet(); //调用Map对象的entrySet()方法获得存储在Map中所有映射的Set集合
Iterator it=entrySet.iterator(); //获取迭代器对象
while(it.hasNext()){ //迭代Set集合,获得每个映射对象
Map.Entry entry=(Map.Entry)(it.next()); //Set集合中存放的Map.Entry对象,代表Map中的一个键值对
Object Key=entry.getKey(); //调用getKey()方法获取Entry中的键
Object Value=entry.getValue(); //调用getValue()方法获取Entry中的值
System.out.println(Key+":"+Value);
}
} }

方法三:

通过Map中values()方法,直接获取Map中存储所有值的Collection集合

package course;
import java.util.*;
public class map4 {
public static void main(String[] args) {
Map map=new HashMap();
map.put(4,"four");
map.put(9,"nine");
map.put(8,"eight");
Collection values=map.values();
Iterator it=values.iterator();
for(Object value:values){
System.out.println(value);
}
}
}

LinkedHashMap:
LinkedHashMap是HashMap的子类,与LinkedList一样,内部以双向链表来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致。
示例:

package course;
import java.util.*;
public class map5 {
public static void main(String[] args) {
HashMap map=new LinkedHashMap();
map.put(4,"four");
map.put(9,"nine");
map.put(8,"eight");
Set keySet=map.keySet();//去重 无序
Iterator it = keySet.iterator();//获取迭代器对象
while(it.hasNext()){
Object key=it.next();
Object value= map.get(key);
System.out.println(key+":"+value);
}
}
}

(3)Properties集合

Map接口中还有一个实现类Hashtable,它与HashMap十分相似,区别在于Hashtable是线程安全的,但Hashtable存取元素时速度很慢,目前基本上被HashMap类取代,但Hashtable之类Properties,在实际应用中非常重要。

示例:

package course;
import java.util.*;
public class Properties1 {
public static void main(String[] args) {
Properties p = new Properties(); //创建Properties集合
p.setProperty("Backgroup-color","green"); //存储键值对(如:put())
p.setProperty("Font-size","14px");
p.setProperty("Language","English");
//获取集合中所有的键
Enumeration names=p.propertyNames(); //Enumeration(相当于iterator迭代器)
//遍历键的集合,获取每一个键
while(names.hasMoreElements()){ //hasMoreElements()相当于hasNext()
String Key=(String)names.nextElement(); //获取键 nextElement()相当于next()
String value=p.getProperty(Key); //获取值
System.out.println(Key+"="+value);
}
}
}

6.泛型—JDK5.0新特性

当将任意类型的对象存入集合后,集合便会”忘记“对象的类型,因此取出元素时如果进行强制类型转换就会出错。为解决此问题java引入泛型概念,即:限定集合元素类型。在定义集合类时,使用”<参数类型>“的方式指定该类方法操作的数据类型。

LinkedList<参数类型> List = new LinkedList<参数类型>();

注意在使用泛型后,每次遍历集合元素时,可以指定该元素类型为”参数类型"

java集合类(新手也能掌握)的更多相关文章

  1. Java集合类--温习笔记

    最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...

  2. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

  3. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  4. 摘抄转载前辈们的Java集合类总结

    本文摘自 Blue Sky:http://www.cnblogs.com/hubcarl JAVA 集合类介绍和使用 类关系示意图Iterable(接口) │ └--Collection (接口) ├ ...

  5. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  6. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...

  7. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

  8. Java 集合类详解(含类图)

    0.参考文献 此图中蓝色为抽象类.深红色表示接口(Arrays除外).绿色表示具体容器类 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedLi ...

  9. Java集合类: Set、List、Map、Queue使用

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  10. 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理

    本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...

随机推荐

  1. 【新阁教育】穷学上位机系列——搭建STEP7仿真环境

    经常有学员问我,学习上位机要不要买PLC硬件? 我一般的回答是:富则自行购买,穷则搭建仿真. PLC硬件,对于学习上位机来说,是锦上添花的事,经济条件允许,有则更好,条件不允许,我们也可以通过搭建仿真 ...

  2. 我用 Python 找出了删除我微信的所有人并将他们自动化删除了

    1. 概述 不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟)之后,缓缓拿出了手机,打开微信,找 ...

  3. maven 搭建私服

    博客参考 https://www.cnblogs.com/luotaoyeah/p/3791966.html 整理纯为技术学习 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程 ...

  4. 直播软件开发如何使用FFMPEG推流并保存在本地

    最近开发了基于C#的直播软件开发推流器一直不大理想,终于在不懈努力之后研究了一点成果,这边做个笔记:本文着重在于讲解下如何使用ffmpeg进行简单的推流,看似简单几行代码没有官方的文档很吃力.并获取流 ...

  5. php数据映射到echarts中国地图

    echarts和php结合 根据php后台数据,映射到地图上所有的省份,地图市下钻的形式,每次下钻到新地图不合并(合并缩放的话会导致下钻地图位置找不到了),添加了自定义工具栏里面的返回到顶级下钻地图 ...

  6. 腾讯云--对象存储cos绑定自定义域名

    1.登录腾讯云控制台,找到对象存储一栏 2.选择一个你想绑定域名的存储桶 3.进入你选择的存储桶,点击域名管理 4.选择自定义源站域名.在域名处填写你要设置的自定义域名,在源站类型处选择静态网站源站, ...

  7. 人体动作捕捉格式之BVH

    BVH简介 BVH是BioVision公司推出的一种人体动作捕捉文件格式.这种文件以节点为核心元素,记录连续数帧内人体骨架的运动. BVH=? 研究一个东西的时候我比较喜欢先研究它的名字.BVH可以认 ...

  8. [MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题

    这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问 ...

  9. 一看就懂的MySQL的FreeList机制

    Hi,大家好!我是白日梦! 今天我要跟你分享的MySQL话题是:"了解InnoDB的FreeList吗?谈谈看!" 本文是MySQL专题的第 7 篇,共110篇. 一.回顾 前面几 ...

  10. 关于ThreadLocal的那些事

    这篇文章(看完了再看下面的)很好地解释了ThreadLocal是什么,怎么用,是否能解决线程安全问题,非常nice.但个人认为讲解存在遗漏,进行如下示例补充: InheritableThreadLoc ...