【Java入门】数组和集合— String[] 、List<String> 及 ArrayList

相信大家一定对数组不陌生,初学的话可能是从 DataType[ ](如最常见的 String[])开始,随后可能更多地用到 List 和 ArrayList,这三者的联系不可谓不少,本文希望能为大家阐述清楚这三者定义及使用。

目录

1 数组—String[]

1.1 数组的创建

1.2 数组常规操作

2 集合

2.1 Collection

2.2 List 及 ArrayList

2.2.1 集合的创建—ArrayList

2.2.2 集合的使用—List & ArrayList

3 数组和集合的区别

总结


1 数组—String[]

Java 语言中提供的数组是用来存储固定大小的同类型元素,官方定义解释地比较清楚了,可以简单概括为两个点:①储存容量有限②储存的元素类型需一致

DataType[] 也就是数组,数组作为一个容器,它可以基本类型+引用类型,这是它和集合的区别,DataType也就是定义数组中储存的元素类型,String[] 便是声明了一个元素类型是String 的数组。

基本数据类型如 int、byte、boolean 等8八种 ,非基本数据类型都是引用数据类型,比如类,接口,数组,涵盖很广,比如最常用的String 就是引用数据类型中的类。

1.1 数组的创建

我们new一个元素类型是String 的数组(Java 中创建一般用new 操作符),因为数组容量有限,需要声明时即确定数组中元素的个数

String[] list1 = new String[2];//2是元素个数

下边是数组创建的另一种形式,也是确定了两个元素,并且都是String 类型,如果将其中一个元素变更为其他类型就会报错。

String[] list2 = {"11","22"};

1.2 数组常规操作

public static void main(String[]args)
{
   //java数组初始化
   String[] strArray={"1","2","3"};
   //输出java数组
   for(int i=0;i

2 集合

Java 提供了集合类,用以保存数量不确定的数据,以及保存具有映射关系的数据,弥补了数组长度不可变的弱点,不过集合中只能储存引用类型。

Java 集合类型分为 Collection 和 Map,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。本文简单介绍一下Collection,我们平时用的最多的就是实现类ArrayList 了。

2.1 Collection

子接口及实现类关系:

【Java入门】数组和集合— String[] 、List<String> 及 ArrayList_第1张图片

 常用方法(抽象方法):

  • public boolean add(E e):把给定的对象添加到当前集合中 。
  • public void clear():清空集合中所有的元素。
  • public boolean remove(E e):把给定的对象在当前集合中删除。
  • public boolean contains(E e):判断当前集合中是否包含给定的对象。
  • public boolean isEmpty():判断当前集合是否为空。
  • public int size():返回集合中元素的个数。
  • public Object[] toArray():把集合中的元素,存储到数组中。

2.2 List 及 ArrayList

可以看到List 是Collection 的子接口,而ArrayList 又是List 的实现类,即ArrayList 实现了List 和Collection 接口所有的抽象方法(上边的方法,可实现在ArrayList)以及继承了对应的普通方法。

2.2.1 集合的创建—ArrayList

同数组一样,创建集合一般也是通过new 来完成的,以下三种形式(定义元素类型是String)均可达到创建集合的目的,不过第二种最为常用。

ArrayList list1 = new ArrayList<>();
List list2 = new ArrayList<>(); //最常用!!
Collection list3 = new ArrayList<>(); //不怎么用

这时可能有人会有疑问接口怎么能拿来声明,因为虽然接口(例如List、Collection)无法创建实例对象,但是可以为接口自己创建一个指向自己的对象引用,而实现类的实例对象就在这充当指向接口的对象引用,这正是面向对象的多态性

List list2 = new ArrayList<>():这相当于创建了一个List 对象,然后他只能用List 接口本身的方法及属性(List 接口的抽象方法实现在ArrayList ,也就是说List 对象能直接用ArrayList 中实现的方法,因为抽象方法本身没有方法体)。

Collection list3 = new ArrayList<>() 也是同理,ArrayList list1 = new ArrayList<>():ArrayList 对象则保留了ArrayList 的所有属性和方法。

此处可能对于初学者来说较难理解,不过不妨碍继续阅读本文,或许看完后边的内容再回头会有新的理解。

Java8新特性: 支持接口存在普通方法(使用default 修饰的接口方法,可以拥有方法体,实现类不需要重写,可以被实现类继承)和静态方法(拥有方法体的,静态方法不需要实例化),因此尽管List 和Collection 接口同时通过ArrayList 实现类创建对象,但List 对象和Collection 对象也会存在部分差别。

详细链接:collection接口和list接口的区别

2.2.2 集合的使用—List & ArrayList

List 接口具备Collection 接口的常用方法,下边为集合的常规操作(元素类型为String)

public static void main1(String[]args) {
    //java集合初始化
    List list2 = new ArrayList<>();

    //集合中加入元素,元素个数不做限制
    list2.add("11");
    list2.add("22");
    list2.add("33");

    //输出java集合,list2.size()表示集合长度,也就是元素的个数
    //list2.get():根据index索引获取元素值
    for (int i = 0; i < list2.size(); i++) {
        System.out.println(list2.get(i));//输出结果 11 22 33
    }

    //修改java集合的第1个元素为"44"
    list2.set(0,"44");


    //输出java数组
    for (String s : list2) {
        System.out.println(s);//输出结果 44 22 33
    }
}

为什么要用List list = new ArrayList(),而不用ArrayList alist = new ArrayList()呢?

  • 问题就在于List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如LinkedList或者Vector等等,这时你只要改变这一行就行了: List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
  • 假设你开始用ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了ArrayList实现类特有的方法和属性。
  • 这样的好处是为了代码的可维护性,可复用性,可扩展性以及灵活性,再者就是这符合了里氏代换原则和开闭原则。

3 数组和集合的区别

下边这张网图能很大程度地表明:

其实数组和集合的作用一样,不过是灵活性有所区别,相对来说,集合要更为实用一些而且也应用更广。下边提供一个小彩蛋—数组和集合分别实现储存不同类型的元素

public void demo(){
    //数组
    Object[] list1 = new Object[2];
    list1[0] = "11";
    list1[1] = 11;

    //集合
    List list2 = new ArrayList<>();
    list2.add("11");
    list2.add(11);
} 
  


总结

大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。

你可能感兴趣的:(Java开发,java,开发语言)