Java集合框架整理(一)

Java集合框架结构图完整版

      在完整版的结构图中Collection集合和Map下有许多未实现的抽象类(AbstractCollection、AbstractMap等等)。下面整理一个简化版的,去除了一些不常用的子类和中间的一些抽象类。

Java集合框架结构图简化版

说集合之前先来讲讲对象数组:

对象数组:

数组可以储存基本类型和引用类型,储存引用类型的数组叫对象数组(案例:用数组储存10个Animal类对象)

集合(Collection):

a)集合的由来:

Java语言是面对对象语言,需要操作众多的对象,所以我们需要一种容器(如:数组和StringBuilder)来储存这些的对象,而数组长度是不可变的,在实际操作中,适应不了多变的需求,所有Java就提供了集合供我们使用。

b)集合与数组的区别:

1.长度区别:数组长度固定;集合长度可变。

2.内容区别:数组可以是基本类型,也可以是引用类型;集合只可以是引用类型。

3.元素:数组只可以是一种元素;集合可以是多种元素。

c)集合的架构:如上图结构;

d)集合的主要功能:

1.增加功能;

2.删除功能;

3.判断功能;

4.获取功能;

5.长度功能;(注意:长度是size,不是length)

6.集合转数组

e)集合的遍历:

1.迭代器Iterator;

2.增强for;

下面先从Collection开刀:

概述:

Collection是单列集合的顶层接口,子接口有List和Set两个继承体系。

使用:

A)创建集合对象      

Collection c = new ArrayList();

B)创建元素对象      

Student[] s = new Student();

C)把元素对象添加到集合中

c.add(s[0]);

D)遍历:

1.创建迭代器   Iterator it = c.iterator();

2.向下转型       Student s = (Student)c.next

功能(源码方便自己回忆 = 。=):


public class CollectionDemo {

public static void main(String[] args) {

//创建对象

Collection c = new ArrayList();

//添加功能

c.add("wo");

c.add("ai");

c.add("ni");

System.out.println(c);

//删减功能

//c.clear();

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

System.out.println(c);

//判断功能

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

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

//长度

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

}

}


遍历:

(A).Iterator是Collection集合专有的迭代器

Iterator it = c.iterator();//创建迭代器对象

while (it.hasNext()) {//判断是否有下一个元素

Student s1 = (Student) it.next();//向下转型

System.out.println(s1.getName() + "---" + s1.getAge());

}

(B).用增强for遍历Collection

for(String s : c) {//格式:类型  变量名 :遍历对象

System.out.println(s);

}




Collection子接口之List:

概述:

List是Collection集合的子接口,所以使用与Collection一样,特点是有序,可重复。

List的子类特点:

A)ArrayList

底层结构是数组,查询快,增删慢

线程不安全,效率高

B)Vector(上面结构框架中标住遗留,由于性能比ArrayList低,所以逐渐被代替了

底线结构是数组,查询快,增删慢

线程安全,效率低

C)LinkedList

底层结构是链表,查询慢,增删快

线程不安全,效率高

特有功能:

因为List是Collection的子接口,所以上面的Collection中所有功能都有,且用法一样。

A)指定添加:add(int index,elem e) 在指定位置加入元素

B)指定获取: get(int index) 获取指定位置元素

C)指定删除:Object remove(int index) 删除指定位置元素,返回被删元素

E)指定修改:Object set(int index) 修改指定位置元素,返回被修改元素

可见List相比Collection最大特点就是可以指定操作,这正是List的有序特性

老规矩源码方便回忆 = 。=


public class Teyou {

public static void main(String[] args) {

// 创建对象

List list = new ArrayList();

String[] s = new String[3];

s[0] = "aaa";

s[1] = "bbb";

s[2] = "ccc";

// 添加功能

// add(int index,elem e) 在指定位置加入元素

list.add(s[0]);

list.add(s[1]);

list.add(s[2]);

list.add(1, s[2]);

System.out.println(list);

System.out.println("---------------------------");

// 获取功能

// get(int index) 获取指定位置元素

System.out.println(list.get(1));

System.out.println("---------------------------");

// 删除功能

// Object remove(int index) 删除指定位置元素,返回被删元素

System.out.println(list.remove(3));

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

System.out.println("---------------------------");

// 修改功能

// Object set(int index) 修改指定位置元素,返回被修改元素

System.out.println(list.set(1, "wo ai ni"));

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

}

}

遍历:ListIterator是List的一个特有的迭代器。

该迭代器继承了iterator迭代器,所以有next()和hasNext()方法,还有它特有的previous()逆向遍历,但必须要正向后才能逆向。



List子接口之ArrayList:

概述:

ArrayList在上面的结构框架中我用了红色字体,它是非常常用的集合,所以要重点掌握。ArrayLIst是List的一个子类,实现类。

ArrayList:

关于ArrayList,其实上面都已经讲了,把Collection和List的所有操作合并就是ArrayLsit的功能了。

List子接口之LinkedList:

概述:

LinkedList的底层是链表结构,所以它可以在表头和表尾处添加元素。操作与链表的操作差不多。

LinkedList特有功能:

A)添加功能

public void addFirst(Object obj)//在表头添加元素

public void addLast(Object obj)//在表尾添加元素

B)获取功能

public Object getFirst()//获取表头元素

public Object getLast()//获取表尾元素

C)删除功能

public Object removeFirst()//删除表头元素

public Object removeLast()//删除表尾元素



Collection子接口之Set:

概论:

Set和List一样属于Collection集合的子接口,Set的特点是无序的(储存顺序与获取顺序不一定一致),唯一的。Set的实现子类有HashMap、TreeSet、LinkedHashSet,在下面逐个展示。

Set的子类特点:

A)HashMap

底层数据结构是哈希表。

保证元素唯一性的依赖两个方法:

hashCode()equals()开发中自动生成这两个方法即可

B)TreeSet

特点是有序和唯一,底层数据结构是红黑树(一种自平衡二叉树,具体我也不太懂,不过挺重要的=。=)

保证元素排序依赖:

自然排序

比较器排序(优先)

保证元素唯一性依赖:

根据比较的返回值是否是0来决定

C)LinkedHashSet

哈希表一个子类,类似于HashMap(后面再说),但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

Set功能:

既然Set是Collection的一个子接口,所以上面的Collection所有功能都有。Set的特点是元素是唯一的,它的唯一性是依赖元素对象重写的equals()方法实现的。

这里先不详讲,下面通过它的子类来了解它。

Set子接口之HashSet:

特有功能范例:


Sets = new HashSet();//创建HashSet对象

s.add(new Student("java",30));

s.add(new Student("c#",10));

s.add(new Student("php",20));

s.add(new Student("php",20));//相同元素不能被加入集合中

for(Student s1 : s) {

System.out.println(s1.getName() + "---" + s1.getAge());}


Set子接口之TreeSet:

下面展示一个范例,按照姓名的长度将Set中集合进行排序,其中比较器Comparator用匿名内部类写:


public static void main(String[] args) {

//方法一自定义比较器类排序

// 创建集合对象

// TreeSetts = new TreeSet();

// public TreeSet(Comparator comparator)

// TreeSetts = new TreeSet(new MyComparator());//MyComparator类自己第一

//方法二匿名内部类

TreeSetts = new TreeSet(new Comparator() {

@Override下面是匿名内部类内容

public int compare(Student s1, Student s2) {

// 姓名长度

int num = s1.getName().length() - s2.getName().length();

// 姓名内容

int num2 = num == 0 ? s1.getName().compareTo(s2.getName())

: num;

// 年龄

int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;

return num3;

}

});

// 创建元素

Student s6 = new Student("wuqilong", 10);

Student s2 = new Student("zhangguorong", 29);

Student s3 = new Student("wanglihong", 23);

Student s1 = new Student("linqingxia", 27);

Student s4 = new Student("linqingxia", 27);

Student s5 = new Student("liushishi", 22);

Student s8 = new Student("linqingxia", 29);

Student s7 = new Student("fengqingy", 22);

// 添加元素

ts.add(s1);

ts.add(s8);

ts.add(s3);

ts.add(s2);

ts.add(s5);

ts.add(s4);

ts.add(s7);

ts.add(s6);

// 遍历

for (Student s : ts) {

System.out.println(s.getName() + "---" + s.getAge());

}

}


Collection集合体系就先这样了,Map集合的后面再奋斗了【捂脸】

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 第十天 权限修饰符 public protected default private 同一类 true true ...
    炙冰阅读 524评论 0 1
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,483评论 0 3
  • “大冲,你走慢一点。” “我没事儿,不打紧。”周大冲一面抹了抹额角上的汗渍,一面回过头,对小毛驴上的梦之嘿嘿憨笑。...
    张若扬阅读 398评论 0 2