Colliction子集(list ,set, Arraylist, Vector.....)

1.泛型
<数据类型> --- 引用数据类型
泛型:将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可以 作为参数传递.
A. 泛型的好处:
1)将运行时期异常提前到了编译时期
2)优化了设计,解决了×××警告线问题
3)避免了强制类型转换

泛型的引出可以提供程序的安全性!

B.在早期的时候,使用Object类型代表任意类型,向上转型没有问题,
使用向下转型的时候,可能会出现问题(需要的类型有问题),这个时候就需要引入泛型操作

    看API,接口,类,方法上有<E> ,都是泛型

C把泛型定义在类上,提高程序安全性
//解决了向下类型转换出现的问题:ClassCastException

public class ObjectTool<T> {

private T obj ;

public T getObj() {
    return obj ;
}

public void setObj(T obj) {
    this.obj = obj ;
}

}

package org.westos_03;

public class ObjectToolDemo {

public static void main(String[] args) {

    //创建ObjectTool对象
    ObjectTool<String> ot = new ObjectTool<String>() ;

    //赋值
    ot.setObj(new String("高圆圆"));
    String s = ot.getObj() ;
    System.out.println("姓名是:"+s);

// ot.setObj(new Integer(27)); 直接隐藏的问题解决了
System.out.println("---------------");

    ObjectTool<Integer> ot2 = new ObjectTool<Integer>() ;
    ot2.setObj(new Integer(27));

// ot2.setObj(new String("高圆圆"));
Integer i = ot2.getObj() ;
System.out.println("年龄是:"+i);
}
}

D把泛型可以定义在方法上
package org.westos_04;

//public class ObjectTool<T> {
//
// //提供一些成员方法
// /public void show(String s) {
// System.out.println(s);
// }
//
// public void show(Integer i) {
// System.out.println(i);
// }
//
// public void show(boolean b) {
// System.out.println(b);
// }
/
//
// public void show(T t) {
// System.out.println(t);
// }
public class ObjectTool{

//泛型是可以在方法上定义的
public <T> void show(T t) {
    System.out.println(t);
}

}

package org.westos_04;

public class ObjectToolDemo {

public static void main(String[] args) {

    //创建ObjectTool类的对象
    /*ObjectTool ot = new ObjectTool() ;
    ot.show("hello");
    ot.show(100);
    ot.show(true);*/

    //在类上定义了泛型,方法的参数T类型去接收

// ObjectTool<String> ot = new ObjectTool<String>() ;
// ot.show("hello");
// ObjectTool<Integer> ot2= new ObjectTool<Integer>() ;
// ot2.show(100);
// System.out.println("---------");

    //可以将泛型定义在类上,可不可以在类上不定义泛型,将泛型应用在方法上?
    //是可以在方法上定义的!
    ObjectTool ot = new ObjectTool() ;
    ot.show("hello");
    ot.show(true);
    ot.show(100);
}

}

E//将泛型定义在接口上
public interface Inter<T> {

//接口中变量是常量: public static final  int num ;

public abstract void show() ; //抽象方法

}

//泛型的应用:在接口中,类中,方法上应用,在集合中应用最多!

//接口中泛型,子实现类的第一种情况,就是已经知道是什么类型了
//public class InterImpl implements Inter<String> {
//
// @Override
// public void show() {
// System.out.println("hello");
// }
//
//}

//第二种情况,就是不知道具体的类型是什么
public class InterImpl<T> implements Inter<T>{

@Override
public void show() {
    System.out.println("hello");
}

}

//测试类
public class InterDemo {

public static void main(String[] args) {

    //第一种情况的测试
    //创建接口的子实现类对象
    Inter<String> i = new InterImpl() ;
    i.show();

    System.out.println("---------------------");

    //第二种情况
    Inter<Integer> i2 = new InterImpl<Integer>();
        i2.show() ;

    Inter<String> i3 = new InterImpl<String>() ;
    i3.show();

}

}

F 泛型高级(通配符)
<?> :代表任意类型Object类型,或者任意的Java类 ;
<? extends E>:向下限定,E的子类或者E这个类型;
<? super E>:向上限定,E及其他的父类;

2.ArrayList是List接口中常用的一个子实现类

ArrayList集合存储自定义对象并遍历,有几种方式?
  • Iterator iterator() ;
  • listIterator listiterator();(可以不写)
  • 普通for循环:size()/get(int index)
  • 增强for循环
    1. Vector集合
      底层是一种可增长对象数组,查询快,增删慢
      线程安全,同步,执行效率高

      特有功能:
      public void addElement(Object obj)------->add(Object obj)
      public Enumeration elements():返回此向量的枚举--->相当于:public Iterator iterator()
      boolean hasMoreElements() --->boolean hasNext() ;
      Object nextElement() --->Object next() ;

    2. LinkedList集合的特点:
      底层是一种链表实现,查询慢,增删快
      线程不安全的,不同步,执行效率高

    特有功能:
    添加功能
    addFirst(Object e):将指定的元素插入到列表的开头
    addLast(object e):将指定的元素添加到列表末尾
    获取功能:
    getFirst():获取列表第一个元素
    getLast():获取列表第二个元素

    删除功能
    public Object removeFirst()移除并返回此列表的第一个元素。
    public Object removeLast()

  1. 可变参数:当一个方法的参数个数不确定的时候,要使用可变参数

    格式:
    修饰符 返回值类型 方法名(数据类型...变量名){...}

    注意:
    1)变量名:看成一个数组
    2)使用的时候数据类型...

    注意:根据具体的需求去完成,一般情况,知道有这个特性就可以了

    1. 针对数组操作的工具类:Arrays,提供了一个方法:
      public static <T> List<T> asList(T... a) :将数组转换成固定大小的集合;

      注意:如果使用此方法,那么集合的长度不可变(长度不变的情况下内容可以变;

    7.Jdk5以后的新特性:
    增强for,静态导入,可变参数,泛型,自动拆装箱...
    增强for循环的格式
    for(数据大类型 变量名 : 数组或者集合对象名){
    输出变量即可!
    }

        增强for的出现时替代迭代器的,所以在遍历集合或者遍历数组就可以使用增强for去完成
    
        增强for循环的弊端:如果集合的对象是null,如果再次对集合操作,就会出现异常
            对集合进行判断,非空判断解决
    1. 静态导入:Jdk5一个新特性
      特点:
      1)前提是该方法必须是静态的
      2)导入到的一个方法的级别

      静态导入的格式:
      import static 包名.类名.方法名;

      import static java.util.ArrayList.add; 方法必须是静态方法

    2. Map集合 ,键值的映射关系的一种集合(接口)
      将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
      Map<K,V> ,在Map集合中,只针对键有效,跟值无关 Map接口的子实现类:HashMap和TreeMap

    Map接口的功能:
    V put(K key,V value) :添加功能:将指定的值和键关联起来
    如果当前的这个键是一次存储,则返回值null
    如果不是第一次存储,返回值是第一次对应的值,当前的值就把之前的键对应的值替换掉!

    获取功能
    Set<Map.Entry<K,V>> entrySet()  :和Map集合的遍历有关系(键值对对象)
    Set<K> keySet():获取映射关系中所有的键的集合
    int size()返回此映射中的键-值映射关系数
    删除功能
    void clear():删除所有映射关系

    Vremove(Object key)如果存在一个键的映射关系,则将其从此映射中移除

    判断功能:
    boolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true
    boolean containsValue(Object value):映射关系中是否包含指定的值
    boolean isEmpty():判断映射关系是否为空

10.发现Set集合存储元素的时候,可以保证元素的唯一性,原因什么?

看源码:

@author Administrator

HashSet集合的add方法底层依赖于双列集合HashMap,它依赖于两个方法,HashCode()方法和equals()方法
先比较字符串的HashCode()码值一样,再比较equals()方法
如果hasCode码值一样,还要比较内容是否相同,由于存储String,重写了equals()方法

String本身重写了equals方法,所以不需要再重写了!

让你用Set集合存储自定义对象遍历!!!!
set集合存储自定义对象并遍历
自定义的类,HashSet集合的add()方法本身依赖于hashCode()和equals()方法
在Student类中并没重写这两个方法,解决,重写这两个方法

11.Set集合和List集合的区别?
Set集合:不允许元素重复,唯一的(元素可以为null) ,不能保证迭代的顺序恒久不变(底层哈希表和hascode)
无序(存储和取出不一致)
List:允许元素重复,并且存储特点:有序性(存储和取出一致)

12.如果在开发中,元素唯一性,并且还要保证元素有序(存储和取出一致),使用LinkedHashSet集合

如果开发中要使用集合排序的问题,使用TreeSet集合(红黑树结构),下午分解...
自然排序
选择器排序

LinkedHashSet集合:
底层是一种链接列表和哈希表组成
可以保证元素的唯一性,是由哈希表决定的(hashCode()和equals())
可以保证元素的迭代顺序一致(有序),存储和取出一致,是由链表决定

13.自然排序和选择器排序
TreeSet支持两种排序方式:自然排序和自定义选择器排序,默认情况下是自然排序。
在JDK中,有一部分类实现了Comparable接口,如Integer,Double和String等,Comparable接口有一个compareTo(Object o)方法,它返回整数类型,对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果小于0,表示x<y,TreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排序,这种方式称为自然排序。
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,即自定义选择器,并在集合初始化时,就有了比较方式
当两种排序都存在时,以比较器为主,定义一个类,实现Comparator接口,覆盖compare方法。

14.面试题:
Map集合和Collection的区别?

    Map集合:是一种键和值的映射关系(双列集合)     当作为:夫妻对
    Collection集合:单列集合,只能存储一种类型的元素,当作为:光棍
间接关系:HashSet依赖于Map接口的子实现类HashMap的
       TreeSet依赖于Map接口的子实现类TreeMap的

原文地址:http://blog.51cto.com/13678296/2114755

时间: 2024-10-31 17:13:32

Colliction子集(list ,set, Arraylist, Vector.....)的相关文章

ArrayList,Vector,LinkedList的存储性能和特征

ArrayListh和Vector都是采用数组的方式来存储数据,其中ArrayList是线程不安全的,Vector是线程安全,所以ArrayList的性能要比Vector的性能好一些,而LinkedList采用的双向链表来实现数据的存储,而且是线程不安全的,而且LinkedList提供了一些方法,使得LinkedList可以被当做栈和队列来使用.因为ArrayList和Vector采用的数组的方式来实现存储数据,所以查询数据比较快捷,但是进行数据增删操作比较慢些,但是LinkedList采用的事

ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

看上面的框架图,先抓住它的主干,即Collection和Map. 1 Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性. Collection包含了List和Set两大分支. (01) List是一个有序的队列,每一个元素都有它的索引.第一个元素的索引值是0. List的实现类有LinkedList, ArrayList, Vector, Stack. (02) Set是一个不允许有重复元素的集合. Set的实现类有HastSet和TreeSet.HashSet

string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections

string给定的长度 不可变,当多个字符串联合的时候先转化为stringbuffer然后联合,速度慢,stringbuffer可以改变字符串的长度,当多个字符串连接的时候采用stringbuffer效率比较高. 集合的作用 对数据进行传送,对数据进行增删改查,还可以用来存放不同的对象. import java.util.Vector;import java.util.List;import java.util.Iterator;import java.util.Enumeration; /**

ARRAYLIST VECTOR LINKEDLIST 区别与用法

最近用到了,所以依然是转载 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! 线性表,链表,哈希表是常用的数

java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长度固定 既可以存储基本数据类型,也能存储引用数据类型 一个数组中的元素类型必一致 集合 长度可变 只能存储引用数据类型 一个集合中的元素类型可以是任意的引用类型 一.集合概述 Collection<E> 父接口 List<E> 子接口 ArrayList<E>类 Vecto

【考点】说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快.

ArrayList,Vector线程安全性测试

结论:如果集合不是线程安全的话,在多线程情况下插入数据会出现数据丢失的问题. Java代码   import java.util.ArrayList; import java.util.List; //实现Runnable接口的线程 public class HelloThread implements Runnable { String name; List<String> v; HelloThread(String name, List<String> v) { this.na

ArrayList , Vector 源码理解

ArrayList 的一些认识: 非线程安全的动态数组(Array升级版),支持动态扩容 实现 List 接口.底层使用数组保存所有元素,其操作基本上是对数组的操作,允许null值 实现了 RandmoAccess 接口,提供了随机访问功能 线程安全可见Vector,实时同步 适用于访问频繁场景,频繁插入或删除场景请选用linkedList ■ 类定义 public class ArrayList<E> extends AbstractList<E> implements List

LinkList,ArrayList,Vector

1,LinkList (1)类声明:public class LinkedList<E> extends AbstractSequentialList<E>  implements List<E>, Deque<E>, Cloneable, Serializable (2)结构:链表 (3)插入和删除的速度比arraylist快,查询比arraylist慢一些 (4)线性非安全(没有同步),可以通过Collections.synchronizedList(n