课程学习--JavaSE--后端(第4期):容器

容器

Java中常用的容器为数组和集合框架。

数组

一种用于存储同类数据的、固定容量的容器。

声明
//区别于C和C++,更纯粹
dataType[] arrayRefVar;
创建
// 确定长度
dataType[] arrayRefVar = new dataType[arraySize];
// 确定初始值
dataType[] arrayRefVar = {value0, value1, ..., valuek};
长度
int[] arr = new int[10];
// 快递为数组
// 长度若不够
// 能   退 货
// leng t  h
int length = arr.length;
操作
// 打印所有数组元素
for (int item: arr) {
    System.out.println(item);
}
Arrays类
int[] arr = {1,3,2,5,4,6,9,7,8};
// 排序
Arrays.sort(arr);
// 遍历(不属于Arrays类)
for (int item : arr) {
	System.out.println(item);
}
数组拷贝
public static native void arraycopy(
    Object src, // 原数组
    int  srcPos, // 拷贝原数组的起始位置     
    Object dest, // 目标数组
    int destPos, // 粘贴目的数组的起始位置               
    int length // 长度
);
注意
  1. Java 基本数据类型传递参数时是值传递 ;引用类型传递参数时是引用传递 。下面代码是一个引用过程中的常见陷阱。

    class TestIt
    {
        public static void main ( String[] args )
        {
            int[] myArray = {1, 2, 3, 4, 5};
            ChangeIt.doIt( myArray );
            for(int j=0; j<myArray.length; j++) {
                System.out.print( myArray[j] + " " );
            }
        }
    }
    class ChangeIt
    {
        static void doIt( int[] z ) 
        {
            // 引用置空不会影响源对象数据
            z = null ;
        }
    }
    

    数组虽然是引用传递 ,但是将引用 z = null 只是将引用z不指向任何对象 ,并不会对原先指向的对象数据进行修改 。

集合框架

集合框架是一个用来代表和操纵集合的统一架构。其框架图如下图所示:

dd

由框架图可以看出,集合框架的三个顶层接口分别是Collection、Map和Iterator(迭代器)。接下来从这三方面入手讲解集合框架。

Collection接口

Collection 接口有 3 种子类型,List 、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、HashMap等等。通过面向接口实现多态,让相同的方法可以在相似的接口上执行不同的实现。

ArrayLsit

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口。

// 1.增
boolean add(E e)
// 2.删(但是原对象没有变成垃圾)
E remove(int index)
boolean remove(Object o)
// 3.改 
E set(int index, E e)
// 4.查
E get(int index)
int size()
// 5.排序
void sort(Comparator<? super E> c)
// 6.遍历
// list.forEach(e -> System.out.println("for each: "+e));
void forEach(Consumer<? super E> action)
LinkedList

LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。

以下情况使用 ArrayList :

  • 频繁访问列表中的某一个元素。
  • 只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList :

  • 你需要通过循环迭代来访问列表中的某些元素。
  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
// 1.增
boolean add(E e)
// 2.删(但是原对象没有变成垃圾)
E remove(int index)
boolean remove(Object o)
// 3.改
E set(int index, E element)
// 4.查
E get(int index)
int size()
HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

HashSet 是无序的,即不会记录插入的顺序。

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。

Map接口
HashMap

HashMap 用于存放键值对。HashMap 是无序的,即不会记录插入的顺序。

// 1.增
// class HashMap<K,V> 泛型
V put(K key, V value)
// 2.删
V remove(Object key)
void clear()
// 3.改
boolean replace(K key, V oldValue, V newValue)
// 4.查
V get(Object key)
int size()

迭代器(Iterator)

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代(遍历) ArrayList 和 HashSet 等集合。

  1. 遍历

    public void testIterator(){
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
    
        Iterator iter = list.iterator();
        
        while (iter.hasNext()){
            String str = (String) iter.next();
            System.out.println(str);
        }
    }
    
  2. 删除

    // 引入 ArrayList 和 Iterator 类
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class RunoobTest {
        public static void main(String[] args) {
            ArrayList<Integer> numbers = new ArrayList<Integer>();
            numbers.add(12);
            numbers.add(8);
            numbers.add(2);
            numbers.add(23);
            Iterator<Integer> it = numbers.iterator();
            while(it.hasNext()) {
                Integer i = it.next();
                if(i < 10) {  
                    // 删除小于 10 的元素
                    it.remove();  
                }
            }
            System.out.println(numbers);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charliejohn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值