【无标题】

Java基础语法 - 集合

观看尚硅谷Java基础语法后的一些感想

一. 集合(Collection)

Java中的集合是一个名词,数据的一种容器,用于容纳数据

根据数据的不同,Java的集合分为2大体系:
1. 单一数据体系 :Collection接口定义了相关的规则
2. 成对出现的数据体系 : Map接口定义了相关的规则
所谓的成对的数据,就是2哥数据有关系,可以根据定义一个数据关联到第二个数据
也称为键值对数据 , (123123,zhangsan) => (key, value)

总结:对不确定的有关系的数据进行相同逻辑处理的场合,使用集合是一个不错的选择

二. Collection接口

常用子接口

  • List : 按照插入顺路保存数据,数据可以重复
    具体的实现类:ArrayList,LinkedList
  • Set : 集,无序保存,数据不能重复
    具体的实现类 HashSet
  • Queue : 队列
    具体的实现类: ArrayBlockingQueue

2.1 Collection - List

List接口的一些常用方法包括:

  • add(E e): 将元素添加到列表的末尾。
  • add(int index, E element): 在指定的索引位置插入元素。
  • get(int index): 返回指定索引位置的元素。
  • remove(int index): 移除指定索引位置的元素。
  • set(int index, E element): 用指定元素替换列表中指定索引位置的元素。
  • size(): 返回列表中的元素数量。
  • isEmpty(): 如果列表不包含元素,则返回true。
  • indexOf(Object o): 返回指定元素在列表中首次出现的索引,如果列表不包含该元素,则返回-1。
  • lastIndexOf(Object o): 返回指定元素在列表中最后出现的索引,如果列表不包含该元素,则返回-1。
  • subList(int fromIndex, int toIndex): 返回列表中指定范围的子列表视图(不创建新列表)。

下面对这些方法做一些简单的实现

代码呈现

import java.util.ArrayList;  
import java.util.List;  
  
public class ListExample {  
    public static void main(String[] args) {  
        List<String> list = new ArrayList<>();  
          
        // 添加元素  
        list.add("a");  
        list.add("b");  
        list.add("c");  
          
        // 访问元素  
        System.out.println(list.get(0));  
          
        // 插入元素  
        list.add(2, "e");  
          
        // 移除元素  
        list.remove(2);  
          
        // 遍历列表  
        for (String fruit : list) {  
            System.out.println(fruit);  
        }  
    }  
}

运行结果

a
a
e
c

2.1.1 Collection - List - ArrayList

List接口也有一些常见的实现类,
比如ArrayList 创建对象代码如下:
ArrayList lists = newArrayList();
对象的参数可以是无参new ArrayList(),那么底层数组就是空数组,也可以是传int类型的参数new ArrayList(3),用于设定底层数组的长度。

方法实现

package chapter07;

import java.util.ArrayList;

public class Java04_Collection_List_ArrayList {
    public static void main(String[] args) {

        // TODO 集合 - Collection - List
        // ArrayList的常用方法
        ArrayList lists = new ArrayList();
        lists.add("zhangsan");
        lists.add("lisi");
        lists.add("wangwu");
        lists.add("zhangsan");

        //add方法可以传递2个参数,第一个参数表示数据增加的位置(索引),第二个参数表示数据
        lists.add(2,"zhaoliu");

        ArrayList otherList = new ArrayList();
        otherList.add("1");
        otherList.add("2");
        otherList.add("3");

        lists.addAll(otherList);

        // size方法表示集合内部数据的数量
        System.out.println(lists.size());
        // 判断集合中的数据是否为空
        System.out.println(lists.isEmpty());
        // 清空集合中的数据
//        lists.clear();
        // 删除指定集合中的数据
        lists.removeAll(otherList);

        // 用于判断集合中是否存在某条数九,返回的是布尔类型的值
        System.out.println(lists.contains("zhangsan"));
        // 用于获取数据在索引中第一个的位置,如果数据不存在,那么返回-1
//        System.out.println(lists.indexOf("wangwu123"));
        System.out.println(lists.indexOf("zhangsan"));
        System.out.println(lists.lastIndexOf("zhangsan"));

        // 把集合变成数组
        Object[] objects = lists.toArray();
        // 复制新集合
        Object clone = lists.clone();
        ArrayList list1 = (ArrayList) clone;

        System.out.println(lists);
        System.out.println(list1);
    }
}

运行结果

8
false
true
0
4
[zhangsan, lisi, zhaoliu, wangwu, zhangsan]
[zhangsan, lisi, zhaoliu, wangwu, zhangsan]

2.1.2. Collection - List - LinkedList

看了尚硅谷的课,感觉LinkedList的逻辑其实和c中的链表差不多。

常用方法
package chapter07;

import java.util.LinkedList;

public class Java05_Collection_List_LinkedList_1 {
    public static void main(String[] args) {

        // TODO 集合 - Collection - List
        // LinkedList : Linked(连接) + List
        // 构建集合对象
        LinkedList list = new LinkedList();

        // 追加数据
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");

        // 向指定位置增加数据
        list.add(1,"zhaoliu");
        list.addFirst("1");
        list.addLast("2");

        LinkedList list1 = new LinkedList();
        list1.add("zhangsan1");
        list1.add("lisi1");
        list1.add("wangwu1");

        list.addAll(list1);

        System.out.println(list.remove("1"));

//        System.out.println(list.remove()); // 删除第一个
//        list.removeFirst();
//        list.removeLast();
//        list.remove(1);

        System.out.println(list.size());
        System.out.println(list.isEmpty());
//        list.clear();
//        list.contains("1");
//        list.element(); // 获取第一个数据
//        list.indexOf("");
//        list.lastIndexOf("");
        list.push("aaa"); // 添加数据
        System.out.println(list.pop()); // 弹出数据
        System.out.println(list);
    }
}

运行结果
true
8
false
aaa
[zhangsan, zhaoliu, lisi, wangwu, 2, zhangsan1, lisi1, wangwu1]

2.2. Collection - Set

HashSet 底层数据结构为 :数据 + 链表
Set集合实现通常提供了添加、删除、查找和遍历元素等操作,但不允许有重复的元素,且输出的顺序可能不同。

案例

import java.util.HashSet;  
  
HashSet<Integer> mySet = new HashSet<>();  
mySet.add(1);  
mySet.add(2);  
mySet.add(3);  
mySet.add(3);  // 这行不会添加任何新元素,因为集合不允许重复  
System.out.println(mySet);  // 输出可能类似于: [1, 2, 3] (但顺序可能不同)

2.3 Collection - Map

在Java中,Map是一个接口,它描述了将键(key)映射到值(value)的对象。Map不允许出现重复的键;每个键最多只能映射到一个值。Map接口在java.util包中定义,并且Java标准库提供了几种实现,包括HashMap、LinkedHashMap、TreeMap和Hashtable等。

常用的增删查改方法

	HashMap map = new HashMap();

        // 添加数据:put
        // 修改数据,put方法也可以修改数据,返回值就是被修改的数据
        map.put("zhangsan","1");
        map.put("lisi","2");
        map.put("wangwu","3");
        map.put("zhangsan","4");

        // TODO 查询数据
        System.out.println(map.get("zhangsan"));// 4

        // TODO 删除数据
        System.out.println(map.remove("zhangsan"));

        System.out.println(map);

运行结果

4
4
{lisi=2, wangwu=3}

这里可以看到,我们添加了两个张三,为什么查询的时候,输出的是4,不是1?
答:因为在Map的实现中,它的key是唯一的,所以当出现两个相同的
key值是,第二个会把第一个覆盖掉,就相当于做了一次修改的操作,修改了它们的value值,map.get()方法也会返回最新给定的与键相关联的值。

HashMap 和 Hashtable 的区别

1. 实现方式不一样 : 继承的父类不一样
HashMap继承的父类是AbstractMap Hashtable继承的父类是Dictionary
2. 底层结构的容量不同: HashMap(16), Hashtable(11)
3. HashMap的k,v都可以为null, Hashtable的k,v不能是null
4. HashMap的数据定位采用的是Hash算法, 但是Hashtable采用的就是hashcode
5. HashMap的性能较高, 但是Hashtable较低

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值