Java之集合类详解

·5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率

二、Java集合主要由两个接口派生:Collection和Map,是集合框架的根接口。

1. collection的子接口:Set:接口 —实现类: HashSet、LinkedHashSet

  1. set的子接口SortedSet接口—实现类:TreeSet

3. List:接口—实现类: LinkedList,Vector,ArrayList

4. List:有序列表,允许存放重复的元素;

实现类:

ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)

LinkedList:双向链表实现,增删快,查询慢 (线程不安全)

Vector:数组实现,重量级  (线程安全、使用少)

5. Set:无序集合,不允许存放重复的元素;允许使用null元素

HashSet 的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问; 如果有两个Key重   复,那么会覆盖之前的;

实现类

HashSet:equals返回true,hashCode返回相同的整数;哈希表;存储的数据是无序的。

LinkedHashSet:此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。

哈希表详解:

http://www.bianceng.cn/Programming/sjjg/200705/1126.htm

http://blog.csdn.net/feixiaoxing/article/details/6885657

http://blog.csdn.net/jdh99/article/details/8490704

6. 子接口SortedSet,对Set排序实现类 :TreeSet:使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序;二叉树实现的;

二叉树详解:

http://blog.csdn.net/luckyxiaoqiang/article/details/7518888/

http://blog.csdn.net/pony_maggie/article/details/38390513

7. Map的实现类:HashMap、TreeMap、LinkedHashMap、Hashtable等

HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;允许null的键或值;

Hashtable:线程安全的,不允许null的键或值;

Properties::key和value都是String类型,用来读配置文件;

TreeMap:对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;

LinkedHashMap: 此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。存储的数

据是有序的。

接口

简述

实现

操作特性

成员要求

Set

成员不能重复

HashSet

外部无序地遍历成员

成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

TreeSet

外部有序地遍历成员;附加实现了SortedSet, 支持子集等要求顺序的操作

成员要求实现caparable接口,或者使用 Comparator构造TreeSet。成员一般为同一类型。

LinkedHashSet

外部按成员的插入顺序遍历成员

成员与HashSet成员类似

List

提供基于索引的对成员的随机访问

ArrayList

提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好

成员可为任意Object子类的对象

LinkedList

对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差

成员可为任意Object子类的对象

Map

保存键值对成员,基于键找值操作,compareTo或compare方法对键排序

HashMap

能满足用户对Map的通用需求

键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

TreeMap

支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现了SortedMap接口,支持子Map等要求顺序的操作

键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。

LinkedHashMap

保留键的插入顺序,用equals 方法检查键和值的相等性

成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

IdentityHashMap

使用== 来检查键和值的相等性。

成员使用的是严格相等

WeakHashMap

其行为依赖于垃圾回收线程,没有绝对理由则少用

三、Collection常见方法

add(E e); addAll(Collection c);clear();contains(Obj o);返回是否包含指定的元素(true false)

containsAll(Collection c)是否包含c中所有元素 isEmpty(); iterator();remove();size();toArray();返回collection中所有元素的数组

四、集合的遍历

1、增强for循环 for(Obj o:c){syso(o)}

2、使用iterator , Iterator it=c.iterator;

while(it.hasNext()){Object o = it.next()}

3、普通循环:for(Iterator it=c.iterator();it.hasNext()😉{it.next() }

五、代码实例

1、 ArrayList

import java.util.ArrayList;

/**

  • 关于ArrayList的基本操作

  • 其它操作感兴趣的读者可以自己结合源码实现一下

    • @author erqing

*/

public class ListTest {

public static void main(String[] args) {

/* 新建一个ArrayList */

ArrayList list = new ArrayList();

System.out.println(“初始化大小:” + list.size());

/* 添加元素 */

list.add(“zzz”);

list.add(“egg”);

list.add(“hell”);

list.add(“child”);

System.out.println(“当前容量:” + list.size());

/* 将ArrayList的大小和实际所含元素的大小设置一致 */

list.trimToSize();

/* 遍历 */

for (String string : list) {

System.out.println(string);

}

/* 在指定位置插入元素 */

list.add(2, “zhu”);

for (String string : list) {

System.out.println(string);

}

System.out.println(“--------------”);

/* 清空list */

list.clear();

/* 遍历 */

for (String string : list) {

System.out.println(string);

}

System.out.println(“--------------”);

}

}

2、LinkedList

import java.util.LinkedList;

public class LinkedListTest {

public static void main(String[] args) {

/* 新建一个list */

LinkedList list = new LinkedList();

System.out.println(list.size());

/* 向list中添加元素 */

list.add(222);

list.add(111);

list.add(0);

list.add(3333);

list.add(8888);

System.out.println(list.size());

/* 遍历list */

for (Integer integer : list) {

System.out.println(integer);

}

/* 获取第一个元素 ,即header的next域*/

System.out.println(“第一个元素是:” + list.getFirst());

/获取最后一个元素,即header的previous域/

System.out.println(“最后一个元素是:”+list.getLast());

}

}

3、hashset

public static void main(String[] args) {

Set set = new HashSet();

set.add(“a”);

set.add(“b”);

System.out.println(set);

Student stu= new Student(18, “小名”, 60);

set.add(stu);//调用第一个对象的hashcode方法 调 equals

set.add(new Student(19, “小明”, 60));

set.add(new Student(19, “小明”, 60));

set.add(new Student(20, “小明”, 61));

System.out.println(set);

}

4、treeset

import java.util.ArrayList;

import java.util.HashSet;

import java.util.TreeSet;

/**

  • 使用treeset存放一组学生成绩

  • 1、可以自动排序(系统类 自然排序)

  • 2、不可重复(去重)

  • 3、只能存放一种数据类型

  • —存放到 treeset中的元素必须要具有比较能力

  • 调用compareTo() 如果得到的结果为0 , 两个元素相等

  •  1 ---》排到后面
    
  •  -1 --->排到前面
    
  • hashset:–>hashtable(哈希表)

  • treeset:–>二叉树,红黑树算法

  • 每存入一个元素就会调用一次compareTo方法

  • @author Administrator

*/

import java.util.Comparator;

/**

  • 外部比较器,当系统类提供的比较规则满足不了需求时使用

  • 1、自己创建一个比较器 实现 Comprator接口 ,添加一个泛型(需要比较的数据类型)

  • 2、重写comprae方法,用来比较,参数是两个需要比较的对象

  • @author Administrator

*/

public class MyStrCompartor implements Comparator{

@Override

public int compare(String o1, String o2) {

//按照字符串长度排序

return o1.length() - o2.length();

}

}

public class TestTreeSet02 {

public static void main(String[] args) {

//使用外部比较器,

//1 拿到比较器的对象

MyStrCompartor mcom = new MyStrCompartor();

//2在创建集合时,调用有参的构造方法,把比较器传进去

//3、在treeset中添加元素时,会优先调用自定义比较器的方法

//treeset专用

TreeSet ts = new TreeSet(mcom);

// ts.add(20);//自动装箱

// ts.add(1);

// ts.add(100);

// ts.add(7);

// ts.add(8);

// ts.add(100);

System.out.println(ts);

//需求:不希望按照系统的排序来排列

//自己创建一个比较规则

ts.add(“xiaomi32313”);

ts.add(“zhangliguo5”);

ts.add(“asima1”);

ts.add(“baibaibai4”);

ts.add(“sansan2”);

// ts.add(new Student(“yushen”, 19, 19));

// ts.add(new Student(“xiaoming”, 19, 19));

// ts.add(new Student(“axiaoming1”, 19, 18));

System.out.println(ts);

}

}

5、hashmap

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-XIkjA4BL-1715722531269)]

[外链图片转存中…(img-wCtwIF8a-1715722531270)]

[外链图片转存中…(img-idXtIo2e-1715722531270)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值