从你的全世界路过-孤独的放逐

集合

一、集合类概述

java.util包中提供了一些集合类,这些集合类又被称为容器。数组也是一种容器,但集合类与数组的不同之处在于数组的长度是固定的,而集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collections接口。各接口还提供了不同的实现类。

这些类的继承关系如下:

Java.lang.Object

|——Collection

|——List:元素是有序的,元素可以重复,因为该集合体系有索引。

|——ArrayList:底层的数据结构使用的是数组数据结构,查询快增删慢,线程不同步。

|——LinkedList:底层的数据数据结构是链表数据结构,查询慢增删快。

|——Vector:底层是数组数据结构。线程同步。被ArrayList替代了。

|——Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复

|——HashSet:底层数据结构是哈希表。HashSet通过元素的两个方法,hashCode和equals来保证元素的 唯一性。如果元素的hasnCode相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。注意:对于判断元素是否存在以及删除等操作,依赖的方法是元素的hashCode和equals方法。ArrayList依赖的方法只有equals。

|——TreeSet:以对Set集合中的元素进行排序。排序时,当主要条件相同,一定要比较次要条件。底层 数据结构是二叉树,保证元素唯一性的依据是compareTo方法return 0。

|——Map

|——HashMap

|——TreeMap

二、Collection接口

Collection接口是层次结构中的根接口。构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List集合与Set集合是通用的。常用方法如下:

add(E e):将指定的对象添加到集合中;

remove(Object o):将指定的对象从该集合中删除;

isEmpty():返回boolean值,用于判断当前集合是否为空;

iterator():返回在此Collectionn的元素上进行迭代的迭代器,用于遍历集合中的对象;

注意:1.add方法的参数类型是Object,以便于接受任意类型对象。

2.集合中存储的都是对象的引用(地址)。

三、迭代器

获取集合中的元素用迭代器

ArrayList al=new ArrayList();

al.add("java01");

al.add("java02");

Iterator it=al.iterator();

Iterator 是一个接口,接口型引用指向自己的子类对象,而这个子类对象是由集合中的iterator()方法获取的。it.hasNext()方法用来判断集合中是否仍有元素。it.next()方法可以获取集合中的下一个元素。迭代器其实就是集合的取出元素的方式。

由于每一种容器的数据结构不同,所以将取出方式iterator()方法定义在集合的内部。又因为都有判断和取出两个动作,所以将这些共性内容抽取为Iterator接口。

迭代器中不能使用集合的方法进行操作,只能用迭代器自身的方法进行操作。但Iterator只能进行判断取出删除的操作。如果想进行其他操作,如添加修改,就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。

四、List集合

List集合特有的迭代器:ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。

1.List接口

List接口继承了Collection接口,因此包含Collection中的所有方法,此外List接口还定义了以下两个非常重要的方法:

get(int index):或得指定索引位置的元素。

set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象。

2.List接口的实现类

List接口的常用实现类有ArrayList与LinkedList:

ArrayList类实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢。

ArrayList判断对象是否相同,用的是equals方法,用对象的equals方法和另一个对象比较。自己定义的类继承基类的equals方法,而基类的方法比较的是地址值!因此应该重写equals方法!

List集合判断元素是否相同依据的是元素的Equals方法!

字符串中有自己的equals方法!

LinkedList类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入删除对象时,使用LinkedList类实现的List集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率低。

LinkedList的特有方法:

addFirst();

addLast();

添加元素。

getFirst();

getLast();

获取元素,但不删除元素。

removeFirst();

removeLast();

获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException。

在JDK1.6出现了替代方法。

offerFirst();

offerLast();

peekFirst();

peekLast();

获取元素,但不删除元素。如果集合中没有元素,返回null;

pollFirst();

pollLast();

获取元素,并删除元素。如果集合中没有元素,返回null;

五、Set集合

Set集合的功能和Collection的功能是一致的。

Set集合中的对象不按特定的方式排序,只是简单的把对象加入集合中,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口中的所有方法。

Set接口常用的两个实现类有HashSet类与TreeSet类。

HashSet通过元素的两个方法,hashCode和equals来保证元素的唯一性。如果元素的hasnCode相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。

TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口。因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。

Comparable接口强制让实现它的类具备比较性方法为compareTo(T O)。

TreeSet:可以对Set集合中的元素进行排序。排序时,当主要条件相同,一定要比较次要条件。底层数据结构是二叉树,保证元素唯一性的依据是compareTo方法return 0。

往TreeSet里存储的元素必须具有比较性!

TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫做默认顺序。

TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式。定义一个类,实现Comparator接口,覆盖compare方法。

定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序方式都存在时,以比较器为主。

六、泛型

泛型:  JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制。

好处:

1.将运行时期出现的问题转ClassCastException,移到了编译时期,方便于程序员解决问题,让运行时期问题减少,安全。

2.避免了强制转换的麻烦。

泛型格式:通过<>来定义要操作的引用数据类型。

在使用Java提供的对象时,什么时候写泛型:通常在集合框架中很常见,只要见到<>就要定义泛型。

其实<>就是用来接受类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>即可。

泛型类:

当类中要操作的引用数据类型不确定的时候,早期定义Object来完成宽展,现在定义泛型来完成扩展。

泛型方法:

泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象要明确要操作的具体的类型后,所有要操作的类型就一定固定了。为了让不同的方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。

静态方法泛型:

特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。

泛型定义方法时,要放在返回类型前面。

泛型限定:用于泛型扩展。

?:通配符,也可以理解为占位符。

<? extends E>:可以接受E类型或者E类型的子类型。上限

<? super E>:可以接受E类型或者E类型的父类型。下限

七、Map

Map集合:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。

1.添加

put(K key V value)

添加元素:如果添加元素时有相同的键,那么后添加的值会覆盖并返回原有键对应值。

putAll(Map<?extends K,?extends V>m)

2.删除

clear()

remove(Object key)

3.判断

containsKey(Object key)

containsKey(Object value)

isEmpty()

4.获取

get(Object key)

可以通过get方法的返回值来判断一个键是否存在。通过返回null判断。

size()

values()

获取map集合中所有的值

entrySet()

keySet()

Map

|——Hashtable:底层是哈希表数据结构,不可以存入null键和null值。该集合                是线程同步的。JDK1.0,效率低。

|——HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合是不              同步的。JDK1.2,效率高

|——TressMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的               键进行排序。

和Set很像,其实Set底层就是使用了Map集合。

Map 集合的两种取出方式:

1.Set<k> keySet:将map中所有的键存入到Set集合,因为Set集合具备迭代器,所以可以通过迭代方式取出所有的键,然后用get方法获取每一个键对应的值。

Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。

2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中。而这个关系的数据类型就是Map.Entry。

Map.Entry 其实Entry也是一个接口,它是Map接口中的一个(静态)内部接口。

当数据之间存在着映射关系时,就要先想到map集合。

Map扩展知识:

map集合被使用是因为具备映射关系。

八、其他

1.Collections集合框架的工具类

Collections.sort(list);

Collections.sort(list,new 比较器);

Collections.max(list);

Collections.max(list,new 比较器);

int index=Collections.binarySearch(list,"aaa",new 比较器);

没有查找到返回(-插入点-1)

Collections.fill(list,"pp");

将list集合中的所有元素全部替换成指定元素"pp";

Collections.replaceAll(list,"aaa","pp");

将list集合中所有的"aaa"替换成"pp";

Collections.reverse(list);

翻转list集合中的元素;

Collections.reverseOrder();

返回的是一个比较器;

Collections.reverseOrder(new 比较器);

将已有的比较器逆转;

Collections.SynList(list);

返回指定列表的同步列表

让非同步的集合变成同步集合

Collections.swap(list,1,2);

将集合中角标为1和2的两个元素交换位置

Collections.shuffle(list);

将集合中所有元素重新随机排放

2.Arrays:用于操作数组的工具类。里面都是静态方法。

List<String> list=Arrays.asList(arr):将数组变成list集合

把数组变成list集合的好处:可以使用集合的思想和方法来操作数组中的元素。

注意:将数组变成集合,不可以使用集合中的增删方法,因为数组的长度是固定的。如果增删,会抛出异常。

如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素;如果数组中的元素都是基本数据类型,那么会将该数组,作为集合中的元素存在。

集合转成数组:Collection接口中的toArray方法。

ArrayList<String> al=new ArrayList<String>();

al.add("abc1");

al.add("abc2");

al.add("abc3");

String[] arr=al.toArray(new String[al.size()]);

指定类型的数组到底要定义多长:当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数字长度大于了集合的size,就不会新创建数组,而是使用传递进来的数组。所以创建一个刚刚好的数组最优。

将集合变数组是为了限定对元素的操作。

3.高级for循环(foreach语句)

格式:

for(数据类型 变量名:被遍历的集合(Collection)或者数组)

{

}

对集合进行遍历:只能获取元素,但不能对集合进行操作。

迭代器除了遍历,还可以进行remove集合中元素的动作。

如果是使用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。

传统for循环和高级for循环的区别:

高级for循环有一个局限性,必须有被遍历的目标。

建议在遍历数组的时候还是使用传统for循环,因为传统for循环可以定义角标。

4.可变参数:int...arr

其实就是上一种数组参数的简写形式。不用每次都手动的建立数组对象,只要将要操作的元素作为参数传递即可。隐式的将这些参数封装成了数组。

方法的可变参数在使用时,可变参数一定要定义在参数列表最后面。

5.静态导入

import static java.lang.System.*;导入了System类中所有静态成员。

import static java.util.*;导入的是Arrays这个类中的所有静态成员。

导入后面不跟静态时,导入的都是类。

导入后面跟静态的时候,导入的是某一个类中所有的静态成员。

StaticImport 静态导入:

当类名重名时,需要指定具体的包名。

当方法重名时,需要指定具备所属的对象或者类

转载http://blog.csdn.net/z191726501/article/details/47981355

夫君子之行,静以养身,俭以养德,非淡泊无以明志,非宁静无以致远。

时间: 2024-08-06 00:00:55

从你的全世界路过-孤独的放逐的相关文章

《从你的全世界路过》票房爆表 光线怎么反而要裁员?

一个爆款的成功,让一个影视公司出现一年不开张.开张吃一年的状况,其实是很不健康的状态 文/张书乐 近日,光线传媒披露三季报,前三季公司实现营业收入11.87亿元,同比增长41.79%:实现净利润5.80亿元,同比增长216.55%. 然而,光线传媒在业绩大涨之时,却陷入"裁员风波",并宣称破局VR市场.此前有消息称,光线传媒将在全公司范围裁员20%左右,校招生.实习生都包括在内.光线传媒总裁王长田近日在接受媒体采访时也坦承了光线对于先看网在VR战略上的重要转向. 同时,光线最新的公告,

《从你的全世界路过》的句子语录

1.我希望有个如你一般的人. 如这山间清晨一般明亮清爽的人, 如奔赴古城道路上阳光一般的人, 温暖而不炙热,覆盖我所有肌肤. 由起点到夜晚,由山野到书房, 一切问题的答案都很简单. 我希望有个如你一般的人,贯彻未来,数遍生命的公路牌.--张嘉佳<从你的全世界路过>   2.我们在同一个时区,却有一辈子的时差.--张嘉佳<从你的全世界路过>3.我觉得这个世界美好无比.晴时满树花开,雨天一湖涟漪,阳光席卷城市,微风穿越指间,入夜每个电台播放的情歌,沿途每条山路铺开的影子,全部是你不经意

从你的全世界路过

也许真的就像朝圣,当到达心目中生地之后,所能做的只有原路返回. 在合适的时间.合适的地点却没有正确的行动,时间的流逝已经消退了原本可以有的激情. 当你见过了那华丽和流光溢彩,有怎能瞧得上这陷入泥土的尘埃. ...... 不再驻足,不再观望. 在此时,在此地,在此生,总要有些追求. 从你的全世界路过,那一抹青绿已留在心底,足以,我将继续前行,一路狂奔!

[读书笔记]从你的全世界路过

小玉点点头,低声说:我不是备胎.我想了想,我是个摆渡人.他在岸这边落水了,我要把他送到河那岸去.河那岸有别人在等他,不是我,我是摆渡人. 小玉看窗外的夜色,说:"我说的拼命,不是拼命工作,不是拼命吃饭,不是拼命解释的拼命,那只是个形容词.我说的拼命,是真的今天就算死了,我也愿意." 你看,我喜欢马力,可哪怕他离婚了,我也没法跟他在一起.我喜欢他,愿意为他做很多事情,如果我们真的在一起,我一定会要求他也这样对我.但是不可能啊,他又不喜欢我.所以,我只想做个摆渡人,这样我很开心."

从你的全世界路过-论演员的自我修养

线程 1.概念  : 线程是一个程序内部的顺序控制流 2.线程与进程的区别 (1)每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销 (2) 线程可以看做轻量级的进程,同一线程共享代码和数据空间.每个线程有独立的运行栈和程序计数器PC,线程切换的开销小 (3) 多进程 在操作系统中同时运行多个任务(程序) (4) 多线程:在同一应用和程序中有多个顺序流同时进行 3 注意点 (1)java 的线程是通过java.lang.Threadl类来实现的 (2)VM启动时会有一个由

从你的全世界路过- 告白气球

我希望有个人如你一般的人,如山间清爽的风,如古城温暖的光,从清晨   ,   到傍晚,  从山野   ,  到书房 ,一切都没有关系  只要最后是你就好 接口 1.定义:接口(interface)是抽象方法和常量值定义的集合 从本质上讲,接口是一种特殊的抽象类,这种抽象类中包含常量和方法的定义 而没有变量和方法的实现 2举例说明 public interface Runner{ public Static final int id =1; //public static final 可以不写 默

从你的全世界路过-make a mistake

异常 1.Java异常概念 java异常是Java提供的用语处理程序错误的一种机制 所谓错误就是指在程序运行的过程中发生的一些异常事件(如 除0溢出,数组下标越界,索要读取的文件不存在). 2.Java异常的分类 Exception                                                      异常层次结构的根类 ArithmeticException                                      算数错误情形,如以零作除数

从你的全世界路过-Freedom

---恢复内容开始--- 自由不是想干什么就干什么,而是不想干什么,就有能力不干什么. 继承 一 继承 1.定义: Java之中使用extends关键字来实现类的继承机制 2.语法规则 :<modifier> class <name>[extends<superclass>] 3.优点: 通过继承,子类自动拥有了基类<superclass> 的所有成员(成员变量和方法) 4.注意点:java只支持单继承,不允许多继承    privite 修饰符 下的变量和

从你的全世界路过-从此又诞生了一个小码菜鸟

               关于while循环和do-while循环 一,循环       1,定义:以环形.回路或轨道运行;沿曲折的路线运行;特指运行一周而回到原处 举例说明:比如 打印50份试卷,在400m跑道上进行1W m赛跑等 解析:循环条件---不足50分试卷就继续打印 循环操作---打印试卷,打印总份增加1. 循环结束---打印足了50份试卷 结论:由此看出循环不是无休止进行的,满足一定条件的时候循环才会继续,成为"循环条件",循环条件不满足的时候,循环退出:期间进行的反