从屌丝到架构师的飞越(集合篇)-集合

一.介绍

集合(简称集)是数学中一个基本概念,它是集合论的研究对象,集合论的基本理论直到19世纪才被创立。最简单的说法,即是在最原始的集合论——朴素集合论中的定义,集合就是“确定的一堆东西”。集合里的“东西”,叫作元素。

由一个或多个确定的元素所构成的整体叫做集合。若x是集合A的元素。集合中的 元素有三个特征:

1、确定性(集合中的元素必须是确定的)。

2、互异性(集合中的元素互不相同)。

3、无序性(集合中的元素没有先后之分)。

集合类存放于java.util包中,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。

集合类型主要有3种:set(集)、list(列表)和map(映射)。

二.知识点介绍

1、java中的集合

2、集合分类

3、Collection

三.上课对应视频的说明文档

1、java中的集合

在java实际的项目开发中,一定会出现保存多个对象的操作,根据之前学习的知识来讲,此时一定会使用对数组的概念。但传统的对象数组有一定问题:长度是固定的(因为此缺陷,所以数组一般不会使用)。为了可以动态地实现多个对象的保存,可以利用链表来实现一个动态的对象数组 ,但是对于链表的数据结构编写会存在以下3个问题:

(1)由于需要处理大量的引用关系,如果要开发链表工具类,对初学者而言难度较高;

(2)为了保证链表在实际的开发中可用,在编写链表实现时必须更多地考虑到性能问题

(3)链表为了可以保存做任意对象类型,统一使用了Object类型进行保存。那么所有要保存的对象必须发生向上转型,而在进行对象信息取出时又必须强制性地向下转型操作。如果一个链表中所保存的数据不是某种类型,这样的操作会带来安全隐患。

综合以上问题,可以得出一个结论:如果在开发项目里面由用户自己去实现一个链表,那么这种项目的开发难度对于大部份开发者而言实在是太高了。同时在所有的项目里面都会存在数据结构的应用。在java设计之初就考虑到了此类问题,所以提供了一个与链表类似的工具类-Vector(向量类)。但是随着时间的推移,这个类并不能很好的描述出所需要的数据结构,所以Java2(jdk1.2)之后提供了一个专门上实现数据结构的开发框架-类集框架[集合]。在jdk1.5之后,泛型技术的引入,又解决了类集框架中,所有操作类型都使用Object所带来的安全隐患。

2、集合分类

java集合的所有程序都是保存在java.util这个包中,在整个的类集框架中,其核心的接口为:List,Set,Map,Iterator,Enumeration。

3、Collection

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

3.1、Collection常用方法

(1)int size() 获取元素个数

(2)boolean isEmpty() 是否个数为 0

(3)boolean contains(Object element) 是否包含指定元素

(4)boolean add(E element)添加元素,成功时返回 true

(5)boolean remove(Object element) 删除元素,成功时返回 true

(6)void clear() 删除所有元素

代码示例:

public class CollectionDemo {

public static void main(String[] args) {

// 测试不带All的方法

// 创建集合对象

// Collection c = new Collection(); //错误,因为接口不能实例化

Collection c = new ArrayList();

// boolean add(Object obj):添加一个元素

// System.out.println("add:"+c.add("hello"));

c.add("hello");

c.add("world");

c.add("java");

// void clear():移除所有元素

// c.clear();

// boolean remove(Object o):移除一个元素

// System.out.println("remove:" + c.remove("hello"));

// System.out.println("remove:" + c.remove("javaee"));

// boolean contains(Object o):判断集合中是否包含指定的元素

// System.out.println("contains:"+c.contains("hello"));

// System.out.println("contains:"+c.contains("android"));

// boolean isEmpty():判断集合是否为空

// System.out.println("isEmpty:"+c.isEmpty());

//int size():元素的个数

System.out.println("size:"+c.size());

System.out.println("c:" + c);

}

}

3.2、Collection操作整个集合的方法

(1)boolean containsAll(Collection<?> c) 是否包含指定集合 c 的全部元素

(2)boolean addAll(Collection<? extends E> c) 添加集合 c 中所有的元素到本集合中,如果集合有改变就返回 true

(3)boolean removeAll(Collection<?> c) 删除本集合中和 c 集合中一致的元素,如果集合有改变就返回 true

(4)boolean retainAll(Collection<?> c) 保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true

代码示例:

public class CollectionDemo2 {

public static void main(String[] args) {

// 创建集合1

Collection c1 = new ArrayList();

c1.add("abc1");

c1.add("abc2");

c1.add("abc3");

c1.add("abc4");

// 创建集合2

Collection c2 = new ArrayList();

c2.add("abc1");

c2.add("abc2");

c2.add("abc3");

c2.add("abc4");

c2.add("abc5");

c2.add("abc6");

c2.add("abc7");

// boolean addAll(Collection c):添加一个集合的元素

// System.out.println("addAll:" + c1.addAll(c2));

//boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)

//只要有一个元素被移除了,就返回true。

//System.out.println("removeAll:"+c1.removeAll(c2));

//boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)

//只有包含所有的元素,才叫包含

// System.out.println("containsAll:"+c1.containsAll(c2));

//boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?

//假设有两个集合A,B。

//A对B做交集,最终的结果保存在A中,B不变。

//返回值表示的是A是否发生过改变。

System.out.println("retainAll:"+c1.retainAll(c2));

System.out.println("c1:" + c1);

System.out.println("c2:" + c2);

}

}

3.3、Collection对数组操作的方法

Object[] toArray() 返回一个包含集合中所有元素的数组

<T> T[] toArray(T[] a) 返回一个包含集合中所有元素的数组,运行时根据集合元素的类型指定数组的类型

代码示例:

public class CollectionDemo3 {

public static void main(String[] args) {

// 创建集合对象

Collection c = new ArrayList();

// 添加元素

c.add("hello"); // Object obj = "hello"; 向上转型

c.add("world");

c.add("java");

// 遍历

// Object[] toArray():把集合转成数组,可以实现集合的遍历

Object[] objs = c.toArray();

for (int x = 0; x < objs.length; x++) {

// System.out.println(objs[x]);

// 我知道元素是字符串,我在获取到元素的的同时,还想知道元素的长度。

// System.out.println(objs[x] + "---" + objs[x].length());

// 上面的实现不了,原因是Object中没有length()方法

// 我们要想使用字符串的方法,就必须把元素还原成字符串

// 向下转型

String s = (String) objs[x];

System.out.println(s + "---" + s.length());

}

}

}

3.4、遍历 Collection

遍历 Collection的方式:使用 Iterator 迭代器

Collection<Person> persons = new ArrayList<Person>();

Iterator iterator = persons.iterator();

while (iterator.hasNext) {

System.out.println(iterator.next); 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343