一、List 接口
常用方法如下:
add(Object obj) | 向List的尾部添加一个元素obj |
add(int i, Object obj) | 向List中索引i 的位置添加元素obj |
set(int i, Object obj) | 使用元素obj替换索引i 位置的元素,并返回被替换的元素。 |
remove(int i) | 删除索引i 指定位置的元素,并返回被删元素 |
get(int i) | 返回索引i 指定位置的元素。 |
indexOf(Object obj) | 返回元素obj在List中第一次出现的索引位置,如果List中不包含元素obj,则返回-1。 |
lastIndexOf(Object obj) | 返回元素obj在List中最后一次出现的索引位置,如果List中不包含元素obj,则返回-1。 |
subList(int start, int end) | 返回List从start到end-1区间的元素。 |
iterator() | 将List装入迭代器。 |
ArrayList使用连续的内存单元存储数据元素,当添加或删除数据元素时(除了数组链表的最后位置外),ArrayList需要移动其被添加(或删除)元素后面的全部元素。
在遍历所有元素方面,ArrayList具有很好的效率,由于其数据元素的连续性,所有只需要将当前元素的指针下移就可以达到效果。
适合范围
1.ArrayList适合存储被查询出的结果集,并且不对结果集修改,而仅仅是用于客户显示。
2.如果我们只是在ArrayList的末尾进行追加操作时,可以使用ArrayList。
三、List的实现类LinkedList(双链表)
LinkedList是使用指针关联的双向链表,其获取下一个元素的方式是通过指向下一个元素地址的对象(通常叫做指针)获取的,由于他的链式存储结构,LinkedList在任意
位置的数据元素插入和删除的效率都不错,因为这个过程不需要移动LinkedList中的其他元素,所以当你的需求是对某个线性结构进行频繁的插入和删除操作时,首选
的List应该是LinkedList。
适合范围
1.LinkedList对于ArrayList来说,其遍历速度较慢,因为他获取下一个元素的时间为寻址时间。
2.LinkedList适合存储数据元素变动较大的线性集合,可以更快速的对指定位置的元素进行增加、删除、修改和查询功能。
四、ArrayList和LinkedList区别
1.底层结构:
ArrayList:数组(内存结构连续)
LinkedList:底层结构:双链表(内存结构可能连续、可能不连续)
2.性能方面:ArrayList:查找时性能高。
LinkedList:较节省内存,增加|删除元素性能高
五、List的实现类VectorVector是一个Object类型的可变长的数组,其元素类型可以是任意的数据类型(Object的子类),我们使用Vector
通常是存储元素类型不同,但描述对象又统一的集合。Vector不要求每个元素的大小都一致,所以Vector在分配内
存空间的时候是根据每个元素的大小动态分配的,但是这样也为Vector中的元素的移动带来了问题,因为元素的移
动会导致内存区域的重新划分,所以,如果你需求的集合对象是一个需要元素移位的结构,请慎重使用Vector。
六、ArrayList和Vector区别
1.Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2.当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
七、Stack栈:先进后出(LIFO表)
Stack<Integer> st=new Stack<>();
System.out.println(st.empty());
st.push(1);
st.push(2);
st.push(3);
st.push(4);
st.push(5);
System.out.println(st.peek());
System.out.println(st.search(2));
System.out.println(st.empty());
for(int i=1;i<=5;i++){
System.out.println(st.pop());
}
System.out.println(st.empty());
八、Set接口
特点:元素不重复、无序(没有索引)
使用场景:元素的去重
Set里存储自定义类的对象,如何保证元素不重复?
答:①当我们使用Set存储自定义类的对象时,需要在自定义类中重写equals和hashCode方法,主要原因是
集合内不允许有重复的数据元素,在集合校验元素的有效性时(数据元素不可重复),需要调用equals
和hashCode验证。
②HashSet在判断数据元素是否重复时,需要同时满足hashCode值相同和equals方法返回true
九、Set的实现类之一HashSet类
Set<Integer> set=new HashSet<>();
set.add(1);
set.add(12);
set.add(2);
set.add(3);
set.add(4);
if(set.contains(12)){
set.remove(12);
set.add(120);
}
//遍历:
/*Iterator<Integer> its=set.iterator();//返回迭代器
while(its.hasNext()){
System.out.println(its.next());
}*/
for(Integer i:set){
System.out.println(i);
}
十、SortedSet的实现类TreeSet
实现了排序的Set接口,采用自然排序升序或者自定义排序规则的方式进行排序;但需要注意的是,仍然不提供
索引机制TreeSet中的元素如果是自定义类的对象时,那该类需要实现Comparable接口,实现其CompareTo()方
法,以提供判断大小的依据
SortedSet<String> sSet=new TreeSet<>();
sSet.add("45");
sSet.add("4");
sSet.add("1425");
sSet.add("450");
sSet.add("451");
sSet.add("495");
for(String i:sSet){
System.out.println(i);
}
在TreeSet中装自定义类型的对象时:
自定义类型一定要实现Comparable接口,并且重写compareTo方法、
SortedSet<Student> sSet=new TreeSet<>();
Student s1=new Student("003", "张三");
Student s2=new Student("002", "李思");
sSet.add(s1);
sSet.add(s2);
for(Student stu:sSet){
System.out.println(stu);
}
十一、Map接口
java中使用Map接口描述映射结构,映射Map是一个独立的接口,描述的是键key-值value的对应关系,Map
不允许键重复,并且每个键只能对应一个值。
十二、Map的实现类 HashMap
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(1, "001");
map.put(2, "002");
map.put(3, "003");
map.put(4, "004");
map.put(5, "005");
//Map的遍历方法
/*for(int i=1;i<=5;i++){
System.out.println(map.get(i));
}*/
//方法一:
//Set<Integer> keySet=map.keySet();//返回当前map的键的Set集合
/*for(Integer key:map.keySet()){
System.out.println(key +"---"+map.get(key));
}*/
//方法二:
Set<Entry<Integer,String>> entrySet=map.entrySet();
for(Entry<Integer,String> en:entrySet){
System.out.println(en.getKey()+"--"+en.getValue());
}
特点:
①HashMap中不允许有重复的键的元素,如果有,后者覆盖前者。
②HashMap中允许有一个元素的键为null。HashMap和Hashtable的区别?
1、HashMap中允许有一个元素的键为null,Hashtable中不允许。
2、二者直接父类不同:HashMap继承AbstractMap,Hashtable继承自Dictionary。
3、是否线程安全:Hashtable是线程安全地,HashMap是非线程安全地。
在JDK1.5加入ConcurrentHashMap,可以保证线程安全。
Fail-fast机制(快速失败机制):HashMap中,如果在一个线程读取数据的同时,有另一个线程修改了数据,会抛出异常。
Hashtable没有这个机制。
十三、SortedMap接口、TreeMap实现类
1.TreeMap按照key的自然顺序进行排序
2.如果key是自定义类的对象,那么需要在自定义类中实现Comparable接口,实现ComparTo()方法