集合与泛型

 

一、集合:就像是一种容器。用于存储、获取、操作对象的容器。

1. 数组的弊端

①数组的长度不可变     ②数组没有提供可以查看有效元素个数的方法

2. 集合的特点

①集合的长度是可变的 ②集合可以存储任意类型的对象 ③集合只能存储对象

3. 集合框架

java.util.Collection : 集合层次的根接口     |--- java.util.List: 有序的,可以重复的。         |--- ArrayList: 采用数组结构存储元素。 查询操作多时选择         |--- LinkedList: 采用链表结构存储元素。 增删操作多时选择         |--- Vector:     |--- java.util.Set: 无序的,不允许重复。         |--- HashSet : 是 Set 接口的典型实现类。             判断元素是否存在的依据是:先比较 hashCode 值,若 hashCode 存在,再通过 equals() 比较内容                                      若 hashCode 值不存在,则直接存储

            注意:重写 hashCode 和 equals 二者需要保持一致!             |--- LinkedHashSet: 相较于 HashSet 多了链表维护元素的顺序。遍历效率高于 HashSet , 增删效率低于 HashSet         |--- TreeSet : 拥有自己排序方式             |-- 自然排序(Comparable):                 ①需要添加 TreeSet 集合中对象的类实现  Comparable 接口                 ②实现 compareTo(Object o) 方法             |-- 定制排序(Comparator)                 ①创建一个类实现 Comparator 接口                 ②实现 compare(Object o1, Object o2) 方法                 ③将该实现类的实例作为参数传递给 TreeSet 的构造器 --

4     集合的遍历

① 增强 for 循环

for(被遍历集合中元素的数据类型  变量名 :  被遍历的集合){

}

ArrayList al = new ArrayList(); al.add("AA"); al.add("BB");

for(Object obj : al){     System.out.println(obj); }

② 使用 Iterator 迭代器

//1)获取当前集合的迭代器 Iterator it = al.iterator();

while(it.hasNext()){     Object obj = it.next();     System.out.println(obj); }

/*错误的做法:通常一个 hasNext() 配合一个 next() 使用 Iterator it = al.iterator();

while(it.hasNext()){     Object obj = it.next();     System.out.println(it.next()); }*/

③ ListIterator : 列表迭代器,是List特有的迭代器(了解)

ListIterator li = al.listIterator();

while(li.hasNext()){     Object obj = li.next();     if(obj.equals("BB")){         li.set("BBBBBBBBBBb");     } }

二、Map系列集合

java.util.Map : 用于存储成对对象的集合。具有 key(键)-value(值)对映射关系的集合。一个 key 对应着一个 value。 key不允许重复的。     |--- HashMap:是 Map接口的典型实现类。         |--- LinkedHashMap: 相较于 HashMap 多了链表维护元素的顺序     |--- Hashtable: 是线程安全的,因此效率低         |--- Properties : 用于操作属性文件     |--- TreeMap : 根据 key 拥有自己的排序方式         |-- 自然排序(Comparable):         |-- 定制排序(Comparator):

    //使用 Properties 操作属性文件     @Test     public void test1() throws FileNotFoundException, IOException{      

        //1. 创建 Properties 对象         Properties props = new Properties();

        //2. 通过 load() 方法加载属性文件         props.load(new FileInputStream("hello.properties"));

        //3. 通过  getProperty() 方法根据key获取对应的value         String userName = props.getProperty("username");         String password = props.getProperty("password");

        System.out.println(userName);         System.out.println(password);     } ---------------------

1. Map的常用方法: 添加、删除操作: Object put(Object key,Object value) Object remove(Object key) void putAll(Map t) void clear()

元素查询的操作: Object get(Object key) boolean containsKey(Object key) boolean containsValue(Object value) int size() boolean isEmpty() boolean equals(Object obj)

2. Map 的遍历:

Map map = new HashMap(); map.put("AA", 123); map.put("BB", 456);

keySet(); //遍历Map的方式一: 获取 Map 中所有的 key   Set set = map.keySet();

values(); //遍历Map的方式二:获取 Map中所有的 value Collection coll = map.values();

//遍历Map的方式三: 获取Map中所有的 Entry (是Map 的一个内部类,一个Entry对应着Map中的一个key和一个value) Set entrySet = map.entrySet();

for(Object obj : entrySet){     Entry entry = (Entry)obj;     Object key = entry.getKey();     Object value = entry.getValue(); }

Iterator it = entrySet.iterator();

while(it.hasNext()){     Entry entry = (Entry)it.next();     Object key = entry.getKey();     Object value = entry.getValue(); }

三、 为什么使用泛型:若集合中不使用泛型,意味着集合中可以添加任意类型的对象。若需要具体到某一个类型时,需要强制类型转换               可能引发 ClassCastException

泛型: 在 Java 中以 "<>" 的形式呈现,<> 中写引用数据类型        用于限制集合中存放元素的类型

1. 在集合中应用泛型

2. 自定义泛型类、接口、方法

class DAO<T>{ // T : Type   E:Element   K:Key   V:Value

    private List<T> list = new ArrayList<T>();

    public void add(T t){         list.add(t);       }

    public T get(int id){         return list.get(id);     }

    //自定义泛型方法     public <E> E[] srot(E[] e){

 

转载于:https://www.cnblogs.com/qq839154187/p/11005594.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值