Java初学者笔记六-数组和集合

hi,大家好,我是终南有客,一个热爱自由的程序员……
想要获取更多信息,请关注(终南有客)公众号,了解最新消息

一. Java数组

  数组是编程语言中最常见的一种数据结构,可以存储多了元素,通常可以通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
创建数组大致包括如下步骤:

. 声明一个数组类型的引用变量,简称为数组变量;
. 用new语句构造数组的实例。new语句为数组分配内存,并且为数组中的每个元素赋予默认值;
. 初始化,即为数组的每个元素设置合适的初始值。

1.数组也是一种类型

  1. Java中数组要求所包含的元素必须是同一数据类型。在一个数组中,元素的类型时唯一的。一单数组被初始化后,它在内存中占用的空间就确定了,不管数组中是否存放了元素。
  2. Java的数组也是一种数据类型,是一种引用类型,例如int是一个基本类型,但int[]就是一个引用类型了。

2.定义数组‘

可以使用两种方式定义数组

  1. type[] arrayName;
  2. type arrayName[];

推荐使用第一种,更加突出数组是一种数据类型。

3.数组的初始化

Java中的变量都必须先初始化才可以使用。所谓初始化,就是为数组的元素分配内存空间并为每个元素赋初值。

注意:只要为数组元素分配了内存空间,那么元素就一定有一个初始值。  

数组的初始化有如下两种方式:

  1. 静态初始化:初始化时用户显示的指定每个数组元素的初始值,由系统决定数组长度。

  2. 动态初始化:初始化中用户指定数组长度,由系统为元素分配初始值。

    静态初始化的语法如下:

arrayName = new type\[\]{element1, element2, element3...}

type是数组中元素的类型,等号后面的type类型只能是前面和前面type的类型相同或是其子类。
示例:

1.  //定义一个int数组类型的变量,变量名为intArr.
2.  int\[\]intArr;
3.  //使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组长度。
4.  intArr=newint\[\]{5,6,8,20};
5.  //定义一个Object数组类型的变量,变量名为objArr.
6.  Object\[\]objArr;
7.  //使用静态初始化,初始化数组时数组元素的类型是
8.  //定义数组时数组元素类型的子类
9.  objArr=newString\[\]{"Java","张三"};
10.  Object\[\]objArr2;
11.  //使用静态初始化
12.  objArr2=newObject\[\]{"Java","张三"};

除此之外,静态初始化还有如图下的语法格式:

arrayName = {element1, element2, element3...}

在这种语法格式中,直接使用花括号定义第一数组:例如

1.  //数组的定义和初始化同时完成,使用简化的静态初始化写法
2.  int\[\]a={5,6,7,9};

动态初始化:
动态初始化只指定数组的长度,由系统默认为数组元素赋初值,格式如下:
arrayName = new type[length];
示例:

1.  //数组的定义和初始化同时完成,使用动态初始化语法
2.  int\[\]prices=newint\[5\];
3.  //数组的定义和初始化同时完成,初始化数组时元素的类型是定义数组时元素类型的子类
4.  Object\[\]books=newString\[4\];

系统在分配元素的初值时,按一下规则:

  1. 如元素为基本类型中的整型,默认值为 0;
  2. 如是基本类型中的浮点型,默认值为 0.0;
  3. 如实基本类型中的字符型,默认值为 ‘\u0000’;
  4. 如实基本类型中的布尔型,默认值为 false;
  5. 如是引用类型,默认值为 null;

4.使用数组

  创建一个数组后,可通过数组下表访问(从0开始),可使用for循环来遍历数组元素,也可使用更简洁的foreach进行遍历。
示例:

1.  publicclassForEachErrorTest{
2.  publicstaticvoidmain(String\[\]args){
3.  String\[\]books={"高等数学",
4.  "大学英语",
5.  "大学物理"};
6.  //使用foreach循环来遍历数组元素,其中book将会自动迭代每个数组元素
7.  for(Stringbook:books)
8.  {
9.  book="高等数学";
10.  System.out.println(book);
11.  }
12.  System.out.println(books\[0\]);
13.  }
14.  }
注意:使用foreach遍历数组时,不能改变数组元素的值,所以不要对foreach的循环变量进行赋值。  

5.深入数组

  数组变量是引用类型,它指向内存中数组区域的第一个元素。数组元素和数组变量在内存中是分开存放的。实际的数组对象存储在堆内存中,如果引用该数组的引用变量是一个局部变量,那么它被存放在栈内存中。如下图所示:

  如果堆内存中不在有任何的引用变量指向自己,则这个数组将成为垃圾,等待垃圾回收机制回收。因此,为了将一个数组回收,可将数组引用变量赋值为null。,切断其与数组之间的联系。
只要类型相互兼容,就可以让一个数组指向另一个实际的数组,如下所示:

1.  publicclassArrayInRam{
2.  publicstaticvoidmain(String\[\]args){
3.  //定义并初始化数组,使用静态初始化
4.  int\[\]a={5,7,20};
5.  //定义并初始化数组,使用动态初始化
6.  int\[\]b=newint\[4\];
7.  //输出b数组的长度
8.  System.out.println("b数组的长度为:"+b.length);
9.  //循环输出a数组的元素
10.  for(inti=0,len=a.length;i<len;i++){
11.  System.out.println(a\[i\]);
12.  }
13.  //循环输出b数组的元素
14.  for(inti=0,len=b.length;i<len;i++){
15.  System.out.println(b\[i\]);
16.  }
17.  //因为a是int\[\]类型,b也是int\[\]类型,所以可以将a的值赋给b。
18.  //也就是让b引用指向a引用指向的数组
19.  b=a;
20.  //再次输出b数组的长度
21.  System.out.println("b数组的长度为:"+b.length);
22.  }
23.  }

6.多维数据

常用二维数组

二.集合

常用的集合

  • ArrayList
  • LinkedList
  • HashSet
  • LinkedHashSet
  • TreeSet
  • HashMap
  • LinkedHashMap
  • TreeMap

1.数组和集合的区别

区别1:
  • 数组可以存储基本数据类型/引用数据类型
  • 基本数据类型存的是值 引用数据类型存的是地址
  • 数组在创建的时候 就会定义存储的数据类型 也就是只能存储一种数据类型
  • 集合只能存储引用数据类型(对象)
  • 集合中也可以存储基本数据类型(装箱)最终存储的还是 Object
  • 如果没有泛型限定 默认存储的都是 Object类型的数据 也就是任意类型
区别2
  • 数组长度是固定的,不能自动增长

  • 集合是长度可变的,根据元素的多少来决定长度

    注:
    集合中保存的都是引用类型,如果是基本数据类型的话会自动转成其包装类.

2.集合的区别

集合可以分为单列集合(collection)与双列集合(Map)

单列集合(collection):
collection 有两个重要的子接口,也就是List和Set

  • List的特点是: (存取有序,有索引,元素可以重复);
  • Set的特点是: (存取无序,没有索引,元素不可以重复);

List 重要的实现类有:ArrayList,LinkedList,Vertor

  • ArrayList :底层是数组实现的,查询修改快,增删慢,线程不安全。
  • LinkedList : 底层是链表实现的,查询修改慢,增删快,线程不安全。
  • Vertor : 底层是数组实现的,线程安全。

Set 的重要实现类有:HasSet , LinkedHasSet , TreeSet

  • HasSet:底层是哈希算法实现的 , 效率比较高。
  • LinkedHashSet : 底层也是哈希算法实现的 也是可以保证元素的唯一,原理和HasSet一样
  • TreeSet :底层原理是 二叉树实现的 。

Map :
Map 分别是 HasMap 和 TreeMap

  • HashMap 底层是哈希算法 ,针对的是 键
  • LinkedHashMap 底层是链表结构 针对键
  • TreeMap 底层是二叉树算法 针对键
1)List

List是有序的(存取顺序),可以装重复元素,有索引
下面的三个子集合的区别

  1. |–Vector 底层数据结构是数组 查询快 增删慢 线程安全 效率低 默认长度是10 超过就会100%延长 变成20 浪费空间
  2. |–ArrayList 底层数据结构是数组 查询快 增删慢 线程不安全 效率高 默认长度是10 超过就会new一个新的数组 50%延长 节省空间
  3. |–LinkedList 底层数据结构是链表(双向链表)
    查询慢 增删快 线程不安全 效率高
2)Set

是无序的(存取顺序),不能重复,无索引值.
Set集合的子集合 HashSet 按照哈希算法来存取集合中的对象 存取速度比较快

  当程序向HashSet中 add()的一个对象的时候, 先用hashCode方法计算出该对象的哈希码 哈希码不一致 添加 哈希码一致
不添加 相同对象不添加 然后用equals判断对象的属性是否一致 比较结果为false就添加 true就不添加 不同对象添加

  基本数据类型包装类/String 已经重写了hashCode 和 equals 会自动比较
自定义实现类要重写其hashCode和equals方法,规定自定义类的比较规则来排重.
中对象进行排序

特点:

1.排序的(升序) 自然排序 根据ASCII表大小排序
2.排重
3.无序(存取不一致)
4.底层是一个二叉树(左序中序右序)
5.只能存储同一种类型 才能排序 不然就会出现转换异常 自定义实现类 如何比较

想要了解更多信息,或思维导图,请关注(终南有客)公众号
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值