集合
单列集合
-----------| collection 单列集合的根接口
---------------|List 如果是实现了list接口集合类具备的特点:有序,可重复
--------------------|ArrayList 底层是使用Object数组实现的。特点:查询速度快,增删慢
--------------------|LinkedList 底层是使用链表数据结构实现的,特点:查询慢,增删快
--------------------|Vector(了解) 底层使用Object数组实现,实现与ArrayList是一样,线程安全,操作效率低
---------------|Set 如果实现了Set接口集合类具备的特点:无序,不可重复
--------------------|hashset 底层使用的是哈希表实现放入
--------------------|TreeSet 底层使用二叉树实现的
双列集合:
----------------|Map(只需要把Map接口的方法全部练习一次即可)
----------------------|hashmap 底层使用哈希表实现的
----------------------|treemap 底层使用二叉树实现的
----------------------|hashtable (了解)
hashcode:
hashcode默认情况下表示的是内存地址,String类已经重写了Object的hashcode方法
1 package com.tcp.chat; 2 3 4 5 public class test { 6 public static void main(String[] args) { 7 String str1="hello"; 8 String str2=new String ("hello"); 9 System.out.println("str1==str2?"+(str1==str2)); 10 System.out.println("str1.hashCode():"+str1.hashCode()); 11 System.out.println("str2.hashCode():"+str2.hashCode()); 12 13 } 14 }
结果:
1 str1==str2?false 2 str1.hashCode():99162322 3 str2.hashCode():99162322
注意:
如果两个字符串的内容一致,则返回的hashcode也是一样的
hashset的实现原理:
往hashset添加元素的时候,hashset会先调用hashcode方法得到元素的hash值
然后通过元素的hash值通过移位等运算,就可以算出该元素在hash表中的存储位置
情况1:如果算出元素存储的位置目前没有任何元素,那么该元素可以直接存储到该位置上。
情况2:如果算出该元素的存储位置目前已经存在有其他元素了,那么会调用该元素的equals方法,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加;如果equals返回的是true,那么该元素运行添加
TreeSet:如果元素具备自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储
要注意的事项:
1.往treeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素的自然自然顺序的特性存储
2.往treeSet添加元素的时候,入股元素本身不具备自然顺序的特性,那么该元素素数的类必须要实现comparable接口,把元素的比较规则定义在compareTo(T o)方法中
3.如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加(treeSet与hashcode 、equals方法没有任何关系)
4.在二叉树中,如果三个节点没有构成一个二叉树的话,那么就会自动调整节点(调整的作用:减少比较的次数)左小右大
5.往treeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现comparable接口,必须要在创建treeSet的时候,传入一个比较器
6.往treeSet添加数据的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了comparable接口,在创建treeSet对象的时候也传入了人比较器,那么是以比较器的比较规则优先使用
7.treeSet是可以对字符串进行排序,因为字符串已经实现了Comparable接口
字符串的比较规则:
1.可以找到对应不同的字符,比较的就是对应位置上的字符
2.找不到对应不同的字符,比较的就是字符串的长度
如何自定义比较器:自定义一个类实现comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可
自定义比较器的格式:
class 类名 implements comparator{
}
推荐使用:比较器(Comparator)
treeSet的存储原理:底层是使用红黑树(二叉树)数据结构实现
存储规则:左小右大
单例集合的体系:
------------|Collection 单例集合的根接口
------------------|List 如果是实现了List接口的集合类,具备的特点:有序,重复
-----------------------|ArrayList 底层是使用了Object数组实现的,特点:查询速度快,增删慢
-----------------------|LinkedList 底层是使用了链表数据结构实现的,特点:查询速度快,增删慢
-----------------------|Vector vector的实现与ArrayList是一致的,但是是线程安全的,操作效率低
-------------------|Set 如果实现了set接口的集合类,具备的特点:无序,不可重复
-----------------------|hashset 底层是使用了一个哈希表来支持的,特点:存取速度快
hashset添加元素的原理:
往hashset添加元素的时候,首先hashset会调用元素的hashcode方法得到元素的哈希码值,然后经过一系列计算就可以算出该元素在哈希表中的存储位置
情况1:如果算出该元素的位置没有任何元素存储,那么该元素可以直接存储
情况2:如果算出该元素的位置目前已经存有其他的元素,那么还会调用元素的equals方法与该元素进行比较。
如果equals方法返回的是false,那么该元素允许存储,如果equas返回的是true,那么该元素被视为重复元素,不允许存储。
-----------------------|treeSet 底层是使用了红黑树(二叉树)数据结构,特点:会对元素进行排序
treeSet注意事项:
1.往treeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么会根据元素自然顺序的特性进行排序。
2.往treeSet添加元素的时候,如果元素本身不具备自然顺序的特性
,那么元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo方法上
3.往treeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现Compatable接口,那么必须在创建TreeSet对象的时候传入比较器
4.如果比较的方法(CompareTo或者Compare)返回的是0,则视为重复元素,不允许添加
比较器的定义格式:自定义一个类实现Conparator接口即可
class 类名 implements Comparator{
}
泛型:泛型是jdk1.5出现的新特性
泛型的好处:
1.将运行时出现的问题提前到了编译时
2.避免了强制类型转换
自定义泛型:自定义泛型就是一个数据类型的占位符或者理解为一个数据类型的变量
泛型方法:
修饰符 返回值类型 函数名(自定义的泛型 变量名。。)
泛型方法要注意的事项:
1.泛型方法中的自定义泛型的具体数据类型是在调用函数的时候传入实参时确定的。
2.自定义泛型所用的标识符只要符合标识符的命名规则即可。但是我们一般都习惯使用一个大写字母表示
泛型类:
泛型类的定义格式
class 类名<声明自定义的泛型>{
}
泛型类的注意事项:
1.泛型类上的自定义泛型是在使用该类创建对象的时候指定具体的数据类型
2.如果一个类已经自定义了泛型,使用该类创建对象的时候如果没有指定泛型的具体数据类型,那么默认为Object类型
3.静态的函数不能使用类上自定义的泛型,如果静态函数需要使用,必须要在函数上自定义泛型
泛型接口:
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
泛型接口要注意的事项:
1.泛型接口上的自定义泛型是在实现该接口的时候指定具体数据类型的的
2.如果实现接口的时候没有指定接口上的自定义泛型的具体数据类型,那么默认为Object数据类型
3.如果需要在创建接口实现类对象的时候才指定接口上自定义泛型,那么需要一下格式
class 类名 implements 接口<>
泛型的上下限:
? super Integer 允许是Integer数据类型或者是Integer父类类型 泛型的下限
? extends Number 允许是Number数据类型或者是Number子类的数据类型 泛型的上限
双列集合:
------------|Map 如果是实现了Map接口的集合类,具备的特点:存储的数据都是以键值对的形式存在的,键不可重复,值可以重复
-------------------|hashMap 底层基于哈希表实现
hashmap的存储原理:
往hashmap添加元素的时候,首先会调用键的hashcode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置。
情况1:如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中
情况2:如果算出的位置已经存在其他元素,那么还会调用该元素的equals方法与该位置上的元素进行比较,如果equals方法返回的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为是重复元素,不允许存储
put():如果出现了相同的键,那么后添加的值会取代前面的值
-------------------|treeMap
存储原理:根据键的自然顺序排序,或根据创建映射时提供的Comparator进行排序,
-------------------|hashtable
hashmap put(k,v):返回值:返回k以前所对应的值,若为首次加入,则返回null
map.put(null,null); 判断map集合是否为空?不是空集合
迭代方法:
entrySet():迭代器,特别重要 返回值为set集合 取出的数据为一条一条键值对应 用于遍历treemap效率高
keySet():返回值为set集合 取出的数据位key的集合
values():返回值为set集合,用来遍历value
1 //方法一 2 Set<String> set = map.keySet(); 3 for (String s:set) { 4 System.out.println(s+","+map.get(s)); 5 } 6 //方法二 7 Set<Map.Entry<String, String>> entryseSet=map.entrySet(); 8 for (Map.Entry<String, String> entry:entryseSet) { 9 System.out.println(entry.getKey()+","+entry.getValue()); 10 }