Java——集合/容器

容器--数组
数组特点:

一组数据类型相同的元素集合

创建数组时,必须给长度,且一旦创建长度不能变。

一旦数组元素装满,需要创建一个新数组,将元素复制过去。

不方便:

判断是否装满,如果装满,将数组复制。

如果我们从数组中删除/添加一个元素,需要移动后面的元素。

Java中为了解决数组存储单一的情况,java中提供了许多不同结构的集合类,让我们根据不同的场景进行数据存储的选择。

集合:

单列集合:

一次放入一个值或一个对象。

Collection接口:定义了单列集合共有方法;

List:可以有重复元素(有序)

ArrayList 数组列表(ArrayList<E>泛型,声明类型,指定存储的元素类型。)

集合容器中默认可以添加Object类型

add(E e)默认是向末尾添加元素。

add(0,e)向指定位置添加元素。

但一般还是习惯一个集合对象中只保存同一类型;保存多个类型,后期处理时,涉及类型转换问题。

底层有一个数组,可以动态扩展数组长度,并提供一个一系列方法操作。

查询快 ;中间增加快,删除慢。

import java.util.ArrayList;
import java.util.Arrays;
public class Dome1 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add(1);
        arrayList.add("c");
        arrayList.add("b");
        arrayList.add("b");
        System.out.println(arrayList);
        System.out.println(arrayList.remove("a"));//移除并返回数组中第一个出现的元素,若去除返回true;else返回false。
        System.out.println(arrayList);
        System.out.println(arrayList.indexOf("b"));//返回元素第一次出现的位置。
        System.out.println(arrayList.lastIndexOf("b"));//返回元素逆序第一次出现的位置。
        System.out.println(arrayList);
        arrayList.set(1,"x");//将数组中哪一个位置,覆盖为所要加入的元素
        System.out.println(arrayList.get(1));//获取第intger位的元素。
        System.out.println(arrayList);
        System.out.println(arrayList.remove(1));//移除第int位的元素
 
        arrayList.add(9,"e");//往数组相应位置添加元素,但其大小不能超过数组长度。
        arrayList.size();//输出数组长度
        arryList.contains("a");//判断集合中是否有该元素
        System.out.println(arrayList);
    }
}
/*------------------------------*/
 public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList();
        arrayList.add("abc");
        //arrayList.add(123);报错,因为只能存储String类型的元素。
    }

LinkedList 链表列表

底层是一个链表结构

查询慢,增加,删除快。

import java.util.LinkedList;
public class Dome3 {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList();
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        linkedList.add("d");
        linkedList.addFirst("x");
        linkedList.addLast("z");
        System.out.println(linkedList);
        System.out.println(linkedList.getFirst());
        System.out.println(linkedList.getLast());
        System.out.println(linkedList.get(3));
        System.out.println(linkedList);
        System.out.println(linkedList.pop());
        System.out.println(linkedList.removeFirst());
        System.out.println(linkedList.removeLast());
        System.out.println(linkedList);
        linkedList.clear();
        System.out.println(linkedList);
    }
}

Vector 数组列表,线程安全

List接口的集合:
for():

普通for()循环:允许操作元素,但要注意索引变化与元素位置的移动。

增强for( 类型名:数组名)循环:只适合数组的遍历,不允许进行修改(删除,增加)

迭代器遍历iterator();

Listiterator迭代器:只能对List接口下的集合遍历,

Listiterator(index):可以从指定位置开始向前或向后便利。hasnext/hasPrevious。

import java.util.ArrayList;
import java.util.Iterator;
public class Dome4 {
    public static void main(String[] args) {
        ArrayList <String> arrayList=new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("d");
        for(int i=0;i<arrayList.size();i++){
            String s=arrayList.get(i);
            System.out.println(s);
            if(s.equals("a")){
                arrayList.remove(s);
            }
        }
        System.out.println(arrayList);
        System.out.println("----------------------------------");
        for(String S:arrayList){
            System.out.println(S);
         /*
            if(S.equals("b")){
                arrayList.remove(S);
            }
            有误,强化for循环中无法修改。
          */
        }
        System.out.println(arrayList);
        System.out.println("----------------------------------");
        Iterator<String> iterator=arrayList.iterator();
        while(iterator.hasNext()){
            String x=iterator.next();
            if(x.equals("c")){
                iterator.remove();
            }

        }
        System.out.println(arrayList);
    }
}
import java.util.ArrayList;
import java.util.ListIterator;
public class Dome5 {
    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("d");
        ListIterator<String> listIterator=arrayList.listIterator(arrayList.indexOf("b"));
        while(listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
        System.out.println("--------------------------------------------");
        ListIterator<String> listIterator1=arrayList.listIterator(4);
        while (listIterator1.hasPrevious()){
            System.out.println(listIterator1.previous());
        }
    }
}

set:不能有重复元素,元素时无序的,元素没有索引

都是(无序):不是按添加时存储的顺序放的。

两个实现子类:

HashSet:

添加元素时,如何判断重复:

如果每次使用equals(),比较内容相等,效率低。

在底层会调用String类中重写的hashcode(),返回值是根据内容计算的哈希值。

遍历时会用哈希值比较是否相等。

但是哈希值会存在问题:内容不同,哈希值相同,此种情况下在调用equals();提高效率和安全。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值