java中的集合总结
知识点:
集合框架和List、set、Map相关集合特点的描述
Collection接口常用方法,List中相对Collection新增的方法,Collection的遍历(一般for循环,增强for循环,Iterator迭代器循环),TreeSet的自然排序和定制排序
Map接口常用的方法,Map的遍历(key集遍历,value集遍历,key-value键值对entry集遍历)
Collections工具类中的常用方法(集合处理线程安全的方法)
一:集合框架
相对与数组来说,集合存储数据避免了长度初始化后,不可改变的弊端
注:实线箭头代表继承,虚线箭头代表实现接口,虚线框代表抽象类
集合大致分为:
List接口:存储有序的,可以重复的数据
Set接口:存储无序的,不可重复的数据(其中不可重复性是指向Set添加相同的元素时,后面的元素不能添加进去,当向Set中添加类的对象时,所在类需要重写equals()和hashCode()方法,并且hashCode方法要与equals()方法一致,这样保证了存储的类的对象元素不可重复性,因为当我们向Set中,添加元素时会先算出元素的hashCode值,每一个hashCode代表元素存储的位置,如果内存中hashCode的位置没有值的话,存入元素,有值的话,则调用equals()方法比较两个元素是否相等,如果相等则不存,不相等则存)
HashSet:主要实现类
LinkedHashSet:是HashSet的子类,遍历集合元素时,是按照添加进去的顺序遍历的,适用于频繁遍历,较少的添加
TreeSet:添加进去的元素必须是同一类
添加进集合的元素按照一定规则排序,String,Integer等按照默认的顺序排序
如果元素是自定义的类的对象,需要自定义按照类的属性进行排序 ,两种排序 自然排序和定制排序
a.自然排序:要求添加进TreeSet中的元素所在的类implements Comparable接口
重写compareTo(Object o)方法,在该方法内部指明元素是按照类的那个属性进行排序的
向TreeSet中添加元素即可,如果不实现Comparable接口,会报运行时异常
b.定制排序:创建一个实现Comparator接口的实现类的对象,在实现类中重写compare(Object o1,Object o2 )方法
在compare方法中指明元素是按照类的哪个属性进行排序的
将实现Comparator接口的实现类的对象作为参数传递给TreeSet的构造器中
向TreeSet中添加元素即可,若不实现此接口,会报运行时异常
重写compareTo()或者compare()方法需要与equals和hashCode()方法保持一致
Map:存储“键—值”对的数据,key是不可重复的,使用Set存放,value可以重复的,使用Collection存放,一个key-value对构成一个entry(Map.Entry),entry是使用Set存放的
HashMap:主要的实现类
LinkedHashMap:是HashMap的子类,使用链表维护添加进Map中的顺序,可以按照添加进Map的顺序实现遍历
TreeMap:需要按照key所在类的指定属性进行排序,要求key是同一类的对象,对key使用自然排序和定制排序
Hashtable:古老的实现类,线程安全的,不建议使用
子类:Properties:常用来处理属性文件,key和value都是String类型的
二:Collection、List、Set
(1)Collection中常用的方法
add():想集合里添加元素
addAll():向集合添加集合
isEmpty():判断集合是否为空
clear():清空集合
contains(Object obj)是否包含某个元素,是返回true,否返回false (如果存入集合元素是自定义类的对象,自定义类要重写equals()方法)
containsAll(Collection<?> c) 集合中包含集合
retainAll(Collection coll):取两个集合的共有元素(交集),并返回给当前集合col
remove(Object obj):删除元素中的元素,删除成功,返回true,失败返回 false
removeAll():删除集合中一部分元素,返回删除了部分元素后的集合col
equals(Object o):判断两个集合是否相等
hashCode():返回元素的hashCode值
toArray():集合转化为数组 (Object[] objarr=col.toArray())
iterator():返回一个Iterator接口实现类的对象,进而实现集合遍历 (Iterator iterator=col.iterator();)
(2)List相对Collection,新增加的方法
1、void add(int index,Object ele):在指定的索引位置index添加元素ele
2、boolean addAll(int index,Collection eles)
3、Object remove(int index):删除指定索引位置的元素
4、Object set(int index,Object ele):设置指定索引位置的元素为ele
5、Object get(int index):获取指定索引的元素
6、int indexOf(Object obj):返回obj在集合中首次出现的位置,没有的话,返回-1
7、int lastIndexOf(Object obj):返回obj在集合中最后一次出现的位置,没有的话,返回-1
8、List subList(int fromIndex,index toIndex):返回从fromIndex到toIndex结束,左闭右开的集合
List常用方法:增(add(Object obj))删(remove)改(set(int index,Object obj))查(get(int index)
插(add(int index,Object obj))长度(size())
(3)TreeSet中添加自定义类的对象的,两种排序方法(a.自然排序 和b.定制排序)
a.自然排序
public class TreeSetTest {
/*
* TreeSet
* 1:向TreeSet中添加的元素必须是同一类
* 2.可以按照添加进集合中的元素指定顺序遍历,像String,包装类等默认的按照从小到大排序遍历
* 3.当向TreeSet中添加自定义类的对象,有两种排序方法(1)自然排序(2)定制排序
* 4.自然排序:自定义类实现java.lang.Comparable接口,并重写其compareTo(Object obj),方法内部,
* 指明按照自定义类的哪一个属性排序
* 5.向TreeSet中,添加元素时,先按照compareTo()进行比较,一旦返回 0,两个对象的属性相同
* 程序会认为两个对象相同,进而后一个对象不能添加到集合中
* 6.compareTo()、hashcode()、equals()三者保持一致
* */
//1、comparable 自然排序
@Test
public void treeSetTest1(){
TreeSet set=new TreeSet();
set.add(new Person("zhangsan",21));
set.add(new Person("wangwu",22));
set.add(new Person("lishi",22));
Iterator iterator=set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
自定义类Person、implements Comparable接口,重写compareTo(Object o)方法,根据类的属性,定义排序规则
public class Person implements Comparable {
private String name;
private Integer age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age &&
name.equals(person.name);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//先根据age排序,当对象age属性相等时,再根据name属性排序
@Override
public int compareTo(Object o) {
if(o instanceof Person){
Person p=(Person)o;
int i=age.compareTo(p.age);
if (i==0){
return name.compareTo(p.name);
}
return i;
}
return ;
}
}
运行结果:
b.定制排序
创建一个实现Comparator接口的实现类的对象,在实现类中重写compare(Object o1,Object o2 )方法
在compare方法中指明元素是按照类的哪个属性进行排序的
将实现Comparator接口的实现类的对象作为参数传递给TreeSet的构造器中
//2、comparator 定制排序
@Test
public void treeSetTest2(){
//1.创建一个实现了Comparator接口的类的对象
Comparator comparator=new Comparator() {
//2.向TreeSet中添加Man对象,在compare()方法中,指明Man按照那个属性排序的
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Man && o2 instanceof Man) {
Man m1 = (Man) o1;
Man m2 = (Man) o2;
int i = m1.getId().compareTo(m2.getId());
if (i == 0) {
return m1.getName().compareTo(m2.getName());
}
return i;
}
return ;
}
}; //3.将comparator对象作为形参传递给TreeSet的构造器中
TreeSet set=new TreeSet(comparator);
//4.向TreeSet中添加Comparator接口,compare方法中涉及到的类的对象
set.add(new Man(1001,"zhangsan"));
set.add(new Man(1004,"wangwu"));
set.add(new Man(1004,"lisi")); Iterator iterator=set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("---------------------"); for (Object o:set){
System.out.println(o);
}
} Man类重写equals方法和hashCode()方法
public class Man {
private Integer id;
private String name;
private Integer age;
public Man() {
}
public Man(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Man{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Man)) return false;
Man man = (Man) o;
return name.equals(man.name) &&
age.equals(man.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
运行结果:
(4)Collection的遍历(List,Set):迭代器和增强for循环Collection下集合类都适用,一般for循环适用于List,List中有get(i)方法
public class forcirculation {
@Test
public void forcirculationTest(){
Collection col=new ArrayList();
col.add("AA");
col.add("BB");
col.add("CC");
col.add("DD");
//1.一般for循环,适用于List,因为List中增加get(i)方法,而Set是都是Collection的方法没有增加get()方法,无法获取遍历时,无法获得i位置的元素
/*for (int i=0;i<col.size();i++){
System.out.println(col.);
}*/
//2.迭代器遍历集合(数组不能使用迭代器)
Iterator iterator=col.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("===========");
//3.增强for循环(数组可以)
for(Object i:col){
System.out.println(i);
}
System.out.println("===========");
//数组
Object[] objArr=new String[]{"AA","BB","CC"};
for (Object i:objArr){
System.out.println(i);
}
}
}
运行结果:
三:Map key-value键值对
(1)Map中的主要方法
Object put(Object key,Object value)
Object get(Object key)
Object remove(Object key)
void putAll(Map t)
void clear()
boolean containsKey(Object key)
boolean contaninsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)
(2)Map的遍历
public class circulateHashMap {
//遍历HashMap
/*
* Set keySet()
* Collection values()
* Set entrySet()
* */
@Test
public void CirculateHashMapTest(){
HashMap map=new HashMap();
map.put("AA",12);
map.put("BB",null);
map.put(new Person("张三",21),11);
//1.遍历key集
Set set=map.keySet();
Iterator iterator=set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("------------------------------");
//2.遍历value集
Collection cols=map.values();
for (Object o:cols){
System.out.println(o);
}
System.out.println("------------------------------");
//遍历key-value键值对
//方法一 通过Map.entry
Set entrySet=map.entrySet();
for(Object o:entrySet){
//System.out.println(o);
Map.Entry entry=(Map.Entry)o;
System.out.println(entry.getKey()+"===>"+entry.getValue());
}
System.out.println("------------------------------");
//方法二 通过key值获取
Set set2=map.keySet();
for (Object o:set2){
System.out.println(o+"===>"+map.get(o));
}
}
}
运行结果:

四:Collections工具类
(1)Collections工具类中涉及到方法(Collections是操作Collection和Map的工具类)
reverse(List):反转List中元素的顺序(Collections.reverse(list))
shuffle(List):对List集合元素进行随机排序
sort(List):根据元素的自然顺序对指定List集合进行升序,从小到大排序
sort(List,Comparator):根据指定的Comparator 产生的顺序对List集合进行排序
swap(List,int i,int j):将指定list集合中,i和j位置的元素进行交换
Object max(Collection):根据自然顺序,返回集合中最大元素
Object max(Collection,Comparator):根据Comparator指定的顺序,返回集合中最大的元素
Object min(Collection)
Object min(Collection,Comparator)
int frequency(Collection,Object):返回集合中指定元素出现的次数
void copy(List dest,List src):将src中的元素复制到dec中
boolean replaceAll(List list,Object oldVal,Object newVal):使用newVal替换oldVal的值 其中:copy(List dest,List src)方法desc集合需要初始化长度,不然会报错
List list=new ArrayList();
list.add(123);
list.add(342);
list.add(87);
//List list1=new ArrayList(); 集合长度为0,报数组越界错误
List list1= Arrays.asList(new Object[list.size()]);
System.out.println(list);
System.out.println(list1);
Collections.copy(list1,list);
System.out.println(list1);
运行结果
如果List list1=new ArrayList(),报错![]()
(2)Collections工具类中保证集合安全方法
List list=new ArrayList();
list.add(123);
list.add(342);
list.add(87);
//保证List集合线程安全
List list2= Collections.synchronizedList(list);
补充:上面关于集合中存放的元素,在实际开发中需要加上泛型的,下一篇博客中有介绍
java中的集合总结的更多相关文章
- Java 中的集合接口——List、Set、Map
Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...
- 实现java 中 list集合中有几十万条数据,每100条为一组取出
解决"java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!"的问题. 具体解决方案如下: /** * 实现java 中 list集合中有几十万条 ...
- java中对集合对象list的几种循环访问
java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...
- 菜鸟日记之 java中的集合框架
java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...
- C#与java中的集合区别
集合一般的操作 插入: add 删除: remove 查找: contains,remove java中的集合 注意哪些是接口,哪些是实现类 使用集合的时候 1. ...
- java中list集合的内容,如何使用像数据库中group by形式那样排序
java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name mone ...
- Java中的集合类型的继承关系图
Java中的集合类型的继承关系图
- (转)java中对集合对象list的几种循环访问总结
Java集合的Stack.Queue.Map的遍历 在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...
- java中的集合操作类(未完待续)
申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...
- Java中的集合概述
Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...
随机推荐
- 自助机dmv?鸡肋
今天终于扛着懒癌去了一趟所谓的dmv自动机(dmv now kiosk),发现此机器只处理有关vehicle的三种事项,比如vehicle的new registration之类的,如果是其它事情还是得 ...
- 找到数组中频次大于1/k的数
Majority Number III 给定一个数组(长度为L),找到所有出现频次大于1/k的数字. 我们主要使用摩尔投票法(Voting Algorithm)结合Map的数据结构解决此问题.其时间复 ...
- webpack4实例
webpack现在已经成为前端很多的打包器.网上关于webpack的相关文章也是很多,本文主要是根据自己的学习步骤来记录的,进行简单的webpack实例的讲解. 注意:一定要确定安装的node.js的 ...
- mui ajax传参示例
//加入购物车var data=[];var row1 = {good_id:'1',number:'2',goods_spec_ids:[1,2]};data.push(row1);console. ...
- uva 1400 "Ray, Pass me the dishes!" (区间合并 最大子段和+输出左右边界)
题目链接:https://vjudge.net/problem/UVA-1400 题意:给一串序列,求最大子段,如果有多个,输出字典序最小的那个的左右端点 思路: 之前写过类似的,这个麻烦点需要输出左 ...
- java23种设计模式之七: 观察者模式
一.应用背景 观察者模式又称为发布/订阅(Publish/Subscribe)模式,我们可以理解为:只有关注信公众号关注后才能收到信息 二.优.缺点 优点: 1.可以动态的改变对象的行为 缺点 ...
- [转帖]IIS7配置Gzip压缩
IIS7配置Gzip压缩 https://www.cnblogs.com/coce/p/6804373.html II7中自带了gzip功能,理论上应该比ii6配置起来应该简单一点,但是容易出的问 ...
- 1.2异常处理和服务配置、aop、日志、自定义事件处理
一.异常处理 2.1.数据验证 现在假设说要进行表单信息提交,肯定需要有一个表单,而后这个表单要将数据提交到 VO 类中,所以现在的基本实现如下: 1. 建立一个 Member.java 的 VO 类 ...
- Python基础 第三章 使用字符串(3)字符串方法&本章小结
字符串的方法非常之多,重点学习一些最有用的,完整的字符串方法参见<Python基础教程(第三版)>附录B. 模块string,虽然风头已小,但其包含了一些字符串方法中没有的常量和函数,故将 ...
- Devexpress xaf BO中字段为RuleRequiredField必输字段时,文本标签默认添加*标记
BO中字段为RuleRequiredField必输字段时,文本标签默认添加*标记.需要在模型编辑器中设置,如图. 官网地址:https://docs.devexpress.com/eXpressApp ...


