数组
Java中的数组是将数字和对象结合起来,需要明确保存对象的类型,在查询时不需要做类型转换,可以保存基本的数据类型,但是一旦数组的大小确定之后就不能被修改。没有排序,数组的下标和装入的对象一一对应。
Collection
collection是存放单一元素的集合的根接口,表示一组对象,JDK中对该接口没有提供任何的实现,都是通过其子接口List,Set等接口来实现,在泛型处理中,容器不能持有基本数据类型如int,float等,但是可以持有其原生对象Integer,Float,Character等。
List接口
常用的实现类有ArrayList,LinkedList,Stack,Vector等,和数组的性质一样,有序,但是可以自动扩容,允许重复的元素出现,但是不允许空的元素出现,在使用过程中,如果要进行大量的随机访问就是用ArrayList,如果要经常做从集合中插入或删除元素,就是用LinkedList。在迭代元素时可以使用Iterator和foreach循环来实现,按照插入的顺序迭代出来,但是使用Iterator的时候不保证顺序。ArrayList和LinkedList不是线程安全的,在使用时要注意,如果需要同步则需要使用List list = Collections.synchronizedList(new ArrayList(...))来进行包装。LinkedList可以提供对Queue和Stack的支持,队列和栈。PriorityQUeue是Queue的实现类,在插入数据的时候会进行排序,优先级低的排在前面,如代码:
Queue<Integer> queue = new PriorityQueue<Integer>();
queue.add("cqupt");
queue.add("cfupty");
则在输出的时候后add进去的数据会先输入出来。
Map接口
map是将对象和对象相关联,HashMap可以用来快速访问,而TreeMap则要保证key始终处于排序状态,LinkedHashMap要保持元素的插入顺序,也提供一种快速访问。对map进行迭代可以选择使用
for(Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getValue());
}
或者使用Iterator来迭代。key值不能重复。
如果在put的时候key重复,则原来的key和value都会被替代,而且map的key和value都可以嵌套其他的集合。如果在map的key中放了某个类的对象进去,在取的时候需要重写equals和hashCode方法来保证取出的正确性。
HashMap不是线程安全的,key和value都允许null值,这两点是HashMap和HashTable的区别。
TreeMap是要保证顺序,为了防止非同步的访问,则需要进行一次包装
Map m = Collections.synchronizedMap(new HashMap(...))
一些概念:
1、容量(capacity),散列表中的桶的数量
2、初始化容量,在散列表创建时设置的桶的数量,HashMap和HashSet都允许设置容量。
3、负载因子(load factor),等于容器的size/容量,如果负载因子为0,则表示的是空的散列表,1表示满了的散列表。
4、如果两个对象相同,则他们的hashCode一定相同,如果两个对象对象的hashCode相同,但这两个对象不一定相同。
Set接口
不接受重复元素,Hashset提供最快的查询速度,TreeSet保持元素处于排序状态,LinkedHashSet以插入顺序保存元素。
HashCode
计算hashCode:
1、将int变量result赋值给某个非零值常量
2、为对象内的每个有意义的域f(在equals方法中要比较的域) ,来计算一个int类型的值c
boolean c = (f?0:1)
byte,char,short,int c=(int)f
long c=(int)(f^(f>>>32))
float