一怎么统揽全局看集合。由类的继承实现从上往下,头是collection接口往下,分两个派系,list和set,那list代表了啥特点?list队列很显然有索引,不计较重复,输入输出有序。反面就是set的。但没那么绝对。比如linkedhashset就是有序。
二各自下有哪些?list下有arraylist(里面就一数组,查找块),linkedlist(链表,增删快,提供方法多在于首尾增删),vector(jdk1.1时的唯一一个线程安全,基本不用)。set有hashset(里面就一hashmap),linkedhashset(有序),hashtable(跟vector一样,弃用)。
三集合有个特点,集合里面每个元素都是地址指向,肯定不是基础变量。你想下,如果存了个1,要能代表个啥,元素取出来能改吗?肯定得地址指向到对象才可以做起事来。空有一个常量池没有实际对象都改不了,再说基本常量在栈,栈方法没了就没了,我们要搞堆。平时调存数字是他做了进一步封装。
四想了下,这么几个,就set中hashset哈希集有点意思。咋意思?他搞了个哈希键值对,哈希集就单列值,存键,值不在乎。核心还是在哈希键值对hashmap,这家伙不重复在于哈希和==和equals。哈希是啥?跟每个人身份证一个道理,尽量唯一表示对象。你想怎么设计就怎么设计。工具可以自动生成。改写了哈希,必然改写equals。sun公司强制规定了哈希同个对象每次出来哈希必须一样,同个对象地址引用equals情况下,必须哈希相等。超类object有说明。有需要的情况,你可以改写自己的定义类下的哈希和equals。哈希和equals都不一致就算不重复。不同地址的一个对象肯定不会重复,就算对象里面赋予的值相等。八大基本类型还有string都改写。还有哈希键值对采用了数组链表,都说好,不评论。初始化数组,数组下挂哈希值一样的对象,他们叫桶。扩充因子,不宜过大也不宜过小,过大,数组整个复制,好大,过小老是复制浪费。数组复制,内存再开一个,之前的就不要了,翻倍扩充。
五,迭代模式,接口作为内部类实现,不暴露集合的内部。增强for,继承iteratable,可采用foreach形式。
六所有集合遍历都是迭代模式,哈希键值对,转成set也是一个道理。存entry
七平常考虑择选用哪个集合,考虑数组和链表,要是在内存里面就100字节大小。不一定可以new一个100字节的数组,但是new一个100字节链表应该没问题。数组特性连续,地址查找1000起始地址+int4字节*n,快速,链表查找都遍历指针。复杂度高。要是选了arraylist,数组又存在扩充复制的方式,旧的就给丢弃了。那咋办,尽量在阔以确定长度的情况下,确定,免得又要动态扩充,浪费n个数组。