容器主要有两类:collection和map
Collection是单列集合的根接口,有增、删、改、查、判断、迭代的方法:
Add(元素)和a.addall(b)(把b添加到a)没有索引。
clear会清空集合中的元素
remove(object)删除第一个object,返回boolean
a.removeall(b)删除a中和b的交集
a.retainall(b)只在a中保留a和b的交集
size()返回元素个数
isempty返回是否为空
contains(元素)返回是否有指定元素,会调用元素.equals方法循环判断,因此默认比较地址,因此要根据情况重写元素的equals方法
a.containsall(b)如果集合a中包含b中所有元素,则true(也是调用的b里面的equals方法)
system.out.print打印集合会在[]中调用每个元素的tostring方法
toarray方法会返回集合中所有元素的数组,返回值类型为object[],可以用来遍历集合
重点:iterator方法,返回在此collection元素上进行迭代的迭代器。元素的返回顺序没有保证(除非此collection是保证顺序的类实例),声明返回iterator接口,实际返回的是iterator实现类,使用了多态特性保证代码的灵活性。在使用迭代器迭代元素的时候(从创建迭代器到最后一条迭代器语句之间),不允许使用集合对象的方法改变集合中元素个数,否则报错,只能使用迭代器的方法进行增加删除等操作。
迭代器内部有一个游标成员,相当于指针,使用hasnext就查看游标和元素长度是否相等,使用next就把游标加1.?
Iterator接口的方法:
Hasnext返回boolean
Next返回游标正指向元素(需要强转成原来的类型),没有元素可以被取出了就会出现异常
Remove移除迭代器最后一次返回的元素,如果之前没有next返回则抛出异常
Collection col=new Collection();
Iterator it =col.Iterator();
While(it.hasnext()){
It.Next();
It.remove();
}清空col的元素
Collection有三个子接口:list序列、queue队列、set集。List和queue的内容是有序并且可以重复的。Set是无序不可重复的。
List特有方法(都和索引有关系):
add(offset,member)在同一个位置增加成员,会把之前的成员挤下去,并不会覆盖,offset不能小于0不能超过当前集合长度。返回值是boolean
addall(offset,member)同上
get(offset)根据索引值获取元素,只有list有get,set和map都没有只能用迭代器
indexof(元素)返回第一次出现元素的位置,没有为-1
lastindexof(元素)返回最后一次出现元素的位置,没有为-1
set(offset,member)
sublist(fromoffset,tooffset)返回两个offset中间元素构成的新list
listiterator(offset可选)返回list接口特有的迭代器listiterator,是iterator的子接口
listiterator接口特有方法:
add(元素)增加到当前游标指向的地方,然后游标也会加一,总长度也会加一
hasprevious和hasnext一样
nextindex返回next返回对象的索引值
previous游标先往回走一个,再取,和next的先取再移动游标不一样,没有元素可以被取出会报异常
previousindex返回previous返回对象的索引值
set(元素)用元素替代迭代器最后一次返回的元素
List常用的实现类:arraylist数组序列,linkedlist,vector(了解)。
如果目前数据查询多,增删少的时候,使用Arraylist存储比较好。
Arraylist基本只使用collection和list的方法,特有方法不多也不常用:Clone,ensurecapacity(习惯用构造方法指定容量,所以这个方法用途少),trimtosize(容量调整为元素真正的容量)
Arraylist()无参构造方法默认容量为10的空列表,容量不够则增加现在长度的一半,Arraylist底层维护了一个object类型的数组,所以每个元素地址是连续的,查询快。
Arraylist(collection)构造一个包含集合中元素的列表,按照collection迭代器返回顺序排列
Arraylist(int)构造具有特定容量的空列表
Queue有一个很实用的实现类:linkedlist链表。Linkedlist也属于list的实现类
Linkedlist底层使用了链表的数据接口,查询慢,增删快
Linkedlist特有方法:
Addfirst
Addlast(和add效果一样)
Descendingiterator返回逆序的迭代器对象,返回iterator
Element获取但不移除列表的头
Getfirst
Getlast
Removefirst删除头并且返回删除的头
Removelast删除尾并且返回删除的尾
堆栈方法:Push(元素)将元素插入链表的开头,和addfirst效果一样
Pop移除并返回列表的第一个元素,和removefirst效果一样
队列方法:Offer(元素)将元素加入链表末尾,和add和addlast一样
Poll移除并返回列表第一个元素,和pop和removefirst一样
Vector内部也是维护了object数组和arraylist一样,但是vector是线程安全的,操作效率低。
Vector初始所有方法名字里都有element,很少有程序还用vector
Set接口方法没有特有方法,只要注意不能重复元素和无序两个特点:
add返回boolean,只能添加不重复元素,看情况重写hashcode和equals,原因如下:
hashset哈希集(存储快),实际是由哈希表(hashmap)来支持的,当向hashset添加元素时,会调用元素的hashcode方法得到元素哈希值,然后经过移位运算,得到该元素在hashmap中的存放位置,如果该位置没有其他元素,那么可以直接存储。如果该位置有其他元素已经占用,那么还会调用该元素的equals方法和这个位置的元素比较一次,如果为true则认为是重复元素,不能添加。Hashmap有一个特点:桶式结构,同一个位置可以放多个元素。
Treeset:添加的元素具有自然顺序的特性,那么按照元素的自然顺序进行存储,如果没有自然顺序,那么该元素所属的类必须实现comparable接口(compareto方法this-参数),或者在创建treeset时传入一个比较器(comparator)否则报错。
自定义比较器的格式:
Class name implements comparator{
重写compare方法(参数1-参数2)
}也就是自定义一个类实现comparator接口实现compare方法(推荐使用,复用性强)。然后创建treeset的时候传入比较器(treeset有一个接收比较器的构造方法)。无论哪种方法比较结果为负就往后放。两种比较方法都在优先使用比较器。
底层通过红黑树数据接口实现,左小右大。如果比较过程compareto或比较器返回0则认为相同元素不予添加,所以treeset和hashcode、equals毫无关系。
二叉树数据结构中如果三个节点没有形成树杈,而是一条线的链状,则为了减少比较次数会自动调整,把中间的节点作为根节点形成树杈。
对象存入容器都会变成object类型,取出要类型转换,除非用泛型
泛型不可以对数组使用,使用数组可以声明为泛型但是不可以new
Class[] a=new class[]{int.class}是不行的
Class[] a=new class []{int.class}是可以的,但是其实往数组里放什么都行,因此会有隐藏的危险,所以用数组就不要用泛型了,切记。或者换用集合类用泛型
集合中可以放所有类型object,基本类型会自动装箱拆箱。泛型规定了某个集合只可以存放特定类型的对象,会在编译过程进行类型检查,可以直接按指定类型获取集合元素(不用转换object类型了)只在编译过程作用,泛型不能用基本类型,不存在多态关系。
泛型好处:将错误发生时间从运行提升到了编译,而且省略的强转的麻烦
Arraylist list=new arraylist();泛型左右两边必须一样,可以省略不能不同。
自定义泛型:就是一个数据类型的占位符或者是一个数据类型的变量(typedef?)
方法上自定义泛型(声明一定要在返回值类型的前面):
各种修饰符<声明自定义泛型>返回值类型方法名(使用自定义泛型):
Public T Gettype(T arg){}T到底是什么是在调用到这个方法传入实参时确定的,因此返回值的类型就是传入参数的类型。常用T和E,代表type和element
泛型类:在类上自定义泛型
Class name<声明泛型>{}这样在类中使用泛型不需要声明,具体是什么类是在创建对象时确定的(所以类中的静态方法不能直接使用自定义泛型,需要在方法上自己声明),一旦确定就不能接收其他类型,如果创建对象时不指定类型默认object类型。(集合接口和实现类就是用的这个功能实现的)
泛型接口和泛型类命名格式一样,具体是什么类型可以在实现接口的时候确定,或者等待创建实现类对象时确定,就是:
Interface intername{}
Class classname implements intername<指定泛型>不指定就是object
Interface intername{}
Class classname implements intername(不在类上声明也可以在类中每个方法声明)
泛型的上下限:
泛型中通配符?,通配符不会单独使用,可以和super配合使用在声明中。
Public void print(collection Super string> col)意思只接受string或者其父类的集合对象(下限为string) collection extends string>:string或其子类元素的集合(上限)
Map:双列集合的根接口(双列集合都没有迭代器),元素成对出现(映射关系)一个key只能映射一个value, key不能重复,value可以重复。主要有三个实现类:hashmap,treemap,hashtable
在map类中会以为一个映射存储数据(键值对)。这个映射就是entry类的实例。Entry类是map的内部类。
使用最高的是arraylist、hashmap和hashset
Map接口方法:
Clear删除所有键值对
Remove(key)根据key删除一条键值对,返回该键对应的value,没有该key返回null。
Containskey(key)判断map是否有该key
Containsvalue(value)判断map是否有该value
Isempty()判断是否有空map.put(null,null)之后map不为空,null也可以作为key和value
Entryset返回set>将map中的映射关系存入set,这个关系的数据类型就是map.entry,map.entry是一个接口,有getkey,getvalue等方法
Set> aa = hashmap.entryset();
Iterator it=aa.iterator();
While(it.hasnext())
{
Map.entry bb=it.next();
bb.getvalue;
bb.getkey;
}
entry是map接口的内部接口,所以hashmap实现map,在hashmap内部有一个静态内部类Entry实现map.entry
Values返回所有value的collection,没有办法拿到key
Keyset返回所有key的set(再通过set的迭代器取出每个key,再用map的get方法取出value)
Get(key)根据key获得value
Size返回键值对的条数
Put(key,value)如果没有和key关联的value(添加成功)则返回null,之前有value则返回该value(相当于旧值被挤出来)
Putall(map Extends K,? extends V>)将另一个map(key和value都是子集)的加入
Hashmap:也是基于哈希表的map接口的实现,添加元素的时候首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但 key 不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部——具体说明继续看 addEntry() 方法的说明。
Treemap:基于红黑树,根据key的自然顺序进行排序,或者key实现comparable或者treemap使用带comparator的构造方法。Compare为零说明key一样,key不会改变,value改变。
Hashtable了解,已经被淘汰了。线程安全不能用null作为key和value
集合工具类:collections常用方法(和arrays工具类一样都是静态方法):
1、 对list进行二分查找(先排序再查找,返回的是索引值):
Int binarysearch(list,key)
Int binarysearch(list,key,comparator)
2、 对list进行排序:
Sort(list)//list具有自然顺序属性
Sort(list,comparator)//list不具备自然顺序,需要传入比较器
3、 对集合取最大最小值
T Max(collection)
T Max(collection,comparator)
T Min(collection)
T Min(collection,comparator)
4、 对list反转
Reverse(list)
5、 将不同步的集合变成同步集合(不太常用,很少有多个线程操作同一个集合)
Set synchronizedset(set)
Map synchronizedmap(map)
List synchronizedlist(list)
Arrays工具类常用方法:
1、 二分查找需要数组有序
Binarysearch(int[])
Binarysearch(double[])
2、 数组排序
Sort(int[])
Sort(char[])
3、 数组变成字符串
Tostring(int[])
4、 复制数组
Copyof(原数组,新数组长度)返回新数组对象,多出来的位置为0或者null
Copyofrange(原数组,起始索引,结束索引)复制部分数组返回
5、 比较两个数组的相同位置内容是否相同
Equals(数组1,数组2)会调用数组中元素的equals
6、 数组变集合
List aslist(T[])和collection的toarray相反
阅读(2225) | 评论(0) | 转发(0) |