Java基础学习(二)---集合

本文深入解析Java集合框架,包括Collection和Map接口的不同实现类及其特性,如ArrayList、HashSet等,并对比了它们之间的区别,适用于Java开发者理解和选择合适的集合类型。

+#+##集合的基础知识总结–

为啥会有集合?

第一个原因:在我们编程的时候,常常会需要存放多个数据元素,这时候我们没办法用数组来存,因为数组的长度不可变。如果需要存放数量变化的数据,数组就没办法来处理了。
第二个原因:数组没办法存放具有映射关系的数据,比如成绩表,语文–77,数学–99,英语–66,这个可以看成两个数组,但这两个数组的映射关系无法表示。

数组和集合的区别

1.数组的长度不变,集合长度可变。
2.数组可以存放基本类型的值,也可以是对象(实际上存放的是对象的引用变量),集合里只能存放对象。

集合的分类

集合之所以有很多分类,是根据数据结构不同,底层的存储方式不同,所以有多种集合类。
java的集合主要是由两个接口派生的:Collection(单列集合)和Map(双列集合),在这两大接口下,又有许多子接口或实现类。
这里写图片描述

个个集合的简述特点

1Collection(单列集合)
        1.1List(有序,可重复)
            1.1.1ArrayList
                底层数据结构是数组,查询快,增删慢
                线程不安全,效率高
            1.1.2Vector
                底层数据结构是数组,查询快,增删慢
                线程安全,效率低
            1.1.3LinkedList
                底层数据结构是链表,查询慢,增删快
                线程不安全,效率高
        1.2Set(无序,唯一)
            1.2.1HashSet
                底层数据结构是哈希表。
                哈希表依赖两个方法:hashCode()和equals()
                执行顺序:
                    首先判断hashCode()值是否相同
                        是:继续执行equals(),看其返回值
                            是true:说明元素重复,不添加
                            是false:就直接添加到集合
                        否:就直接添加到集合
                最终:
                    自动生成hashCode()和equals()即可

                    LinkedHashSet
                    底层数据结构由链表和哈希表组成。
                    由链表保证元素有序。
                    由哈希表保证元素唯一。
            1.3.1TreeSet
                底层数据结构是红黑树。(是一种自平衡的二叉树)
                如何保证元素唯一性呢?
                    根据比较的返回值是否是0来决定
                如何保证元素的排序呢?
                    两种方式
                        自然排序(元素具备比较性)
                            让元素所属的类实现Comparable接口
                        比较器排序(集合具备比较性)
                            让集合接收一个Comparator的实现类对象
2.Map(双列集合)
    A:Map集合的数据结构仅仅针对键有效,与值无关。
    B:存储的是键值对形式的元素,键唯一,值可重复。

    2.1HashMap
        底层数据结构是哈希表。线程不安全,效率高
            哈希表依赖两个方法:hashCode()和equals()
            执行顺序:
                首先判断hashCode()值是否相同
                    是:继续执行equals(),看其返回值
                        是true:说明元素重复,不添加
                        是false:就直接添加到集合
                    否:就直接添加到集合
            最终:
                自动生成hashCode()和equals()即可
        2.1.1LinkedHashMap
            底层数据结构由链表和哈希表组成。
                由链表保证元素有序。
                由哈希表保证元素唯一。
    2.2Hashtable
        底层数据结构是哈希表。线程安全,效率低
            哈希表依赖两个方法:hashCode()和equals()
            执行顺序:
                首先判断hashCode()值是否相同
                    是:继续执行equals(),看其返回值
                        是true:说明元素重复,不添加
                        是false:就直接添加到集合
                    否:就直接添加到集合
            最终:
                自动生成hashCode()和equals()即可
    2.3TreeMap
        底层数据结构是红黑树。(是一种自平衡的二叉树)
            如何保证元素唯一性呢?
                根据比较的返回值是否是0来决定
            如何保证元素的排序呢?
                两种方式
                    自然排序(元素具备比较性)
                        让元素所属的类实现Com储arable接口
                    比较器排序(集合具备比较性)
                        让集合接收一个Comparator的实现类对象

如何挑选哪种存储方式

是否是键值对象形式:
        是:Map
            键是否需要排序:
                是:TreeMap
                否:HashMap
            不知道,就使用HashMap。

        否:Collection
            元素是否唯一:
                是:Set
                    元素是否需要排序:
                        是:TreeSet
                        否:HashSet
                    不知道,就使用HashSet

                否:List
                    要安全吗:
                        是:Vector
                        否:ArrayList或者LinkedList
                            增删多:LinkedList
                            查询多:ArrayList
                        不知道,就使用ArrayList
            不知道,就使用ArrayList

集合的几种遍历方式

集合类的通用遍历方式, 用迭代器迭代:
1.创建迭代器对象
2.创建元素对象
3.把元素添加到集合中
4.通过集合对象获取迭代器对象
5.通过迭代器对象的hasNext()方法来判断是否有元素
6.通过迭代器对象的next()方法来获取下一个位置

Iterator it = list.iterator();//通过集合对象获取迭代器对象

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

Map遍历方式:

1、通过获取所有的key按照key来遍历

//Set<Integer> set = map.keySet(); //得到所有key的集合
for (Integer in : map.keySet()) {
    String str = map.get(in);//得到每个key多对用value的值
}

2、通过Map.entrySet使用iterator遍历key和value

Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
     Map.Entry<Integer, String> entry = it.next();
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}

3、通过Map.entrySet遍历key和value,推荐,尤其是容量大时

for (Map.Entry<Integer, String> entry : map.entrySet()) {
    //Map.entry<Integer,String> 映射项(键-值对)  有几个方法:用上面的名字entry
    //entry.getKey() ;entry.getValue(); entry.setValue();
    //map.entrySet()  返回此映射中包含的映射关系的 Set视图。
    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}

4、通过Map.values()遍历所有的value,但不能遍历key

for (String v : map.values()) {
    System.out.println("value= " + v);
}

List遍历方式:

第一种:

for(Iterator iterator = list.iterator();iterator.hasNext();){                    
    int i = (Integer) iterator.next();                   
    System.out.println(i);               
}

第二种


Iterator iterator = list.iterator();
while(iterator.hasNext()){
    int i = (Integer) iterator.next();
    System.out.println(i);
}

第三种:

for (Object object : list) { 
    System.out.println(object); 
}

第四种:

for(int i = 0 ;i<list.size();i++) {  
    int j= (Integer) list.get(i);
    System.out.println(j);  
}

Collections 操作集合的工具类(都是静态的方法)

//几种常见的方法

 * public static<T> void sort(List<T> list) 排序,默认是自然排序
 * public static<T> int binarySearch(List<> List,t Key);二分查找
 * public static<T> T max(Collection <> coll): 最大值
 * public static void reverse(List<?> List):反转
 * public static void shuffle(List<> List):随机置换
 * 
 */
public class CollectionsDome {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        List<Integer> list = new ArrayList<Integer>();
        list.add(30);
        list.add(50);
        list.add(30);
        list.add(40);
        list.add(10);
        list.add(20);
        System.out.println("list" + list);
        System.out.println("-------------");
        Collections.sort(list);
        System.out.println("list"+list);
    }
    //结果
    //list[30, 50, 30, 40, 10, 20]
    //-------------
    //list[10, 20, 30, 30, 40, 50]


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值