hi,大家好,我是终南有客,一个热爱自由的程序员……
想要获取更多信息,请关注(终南有客)公众号,了解最新消息
数组是编程语言中最常见的一种数据结构,可以存储多了元素,通常可以通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
创建数组大致包括如下步骤:
. 声明一个数组类型的引用变量,简称为数组变量;
. 用new语句构造数组的实例。new语句为数组分配内存,并且为数组中的每个元素赋予默认值;
. 初始化,即为数组的每个元素设置合适的初始值。
可以使用两种方式定义数组
推荐使用第一种,更加突出数组是一种数据类型。
Java中的变量都必须先初始化才可以使用。所谓初始化,就是为数组的元素分配内存空间并为每个元素赋初值。
注意:只要为数组元素分配了内存空间,那么元素就一定有一个初始值。
数组的初始化有如下两种方式:
静态初始化:初始化时用户显示的指定每个数组元素的初始值,由系统决定数组长度。
动态初始化:初始化中用户指定数组长度,由系统为元素分配初始值。
静态初始化的语法如下:
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\];
系统在分配元素的初值时,按一下规则:
创建一个数组后,可通过数组下表访问(从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的循环变量进行赋值。
数组变量是引用类型,它指向内存中数组区域的第一个元素。数组元素和数组变量在内存中是分开存放的。实际的数组对象存储在堆内存中,如果引用该数组的引用变量是一个局部变量,那么它被存放在栈内存中。如下图所示:
如果堆内存中不在有任何的引用变量指向自己,则这个数组将成为垃圾,等待垃圾回收机制回收。因此,为了将一个数组回收,可将数组引用变量赋值为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
常用二维数组
常用的集合
数组长度是固定的,不能自动增长
集合是长度可变的,根据元素的多少来决定长度
注:
集合中保存的都是引用类型,如果是基本数据类型的话会自动转成其包装类.
集合可以分为单列集合(collection)与双列集合(Map)
单列集合(collection):
collection 有两个重要的子接口,也就是List和Set
List 重要的实现类有:ArrayList,LinkedList,Vertor
Set 的重要实现类有:HasSet , LinkedHasSet , TreeSet
Map :
Map 分别是 HasMap 和 TreeMap
List是有序的(存取顺序),可以装重复元素,有索引
下面的三个子集合的区别
是无序的(存取顺序),不能重复,无索引值.
Set集合的子集合 HashSet 按照哈希算法来存取集合中的对象 存取速度比较快
当程序向HashSet中 add()的一个对象的时候, 先用hashCode方法计算出该对象的哈希码 哈希码不一致 添加 哈希码一致
不添加 相同对象不添加 然后用equals判断对象的属性是否一致 比较结果为false就添加 true就不添加 不同对象添加
基本数据类型包装类/String 已经重写了hashCode 和 equals 会自动比较
自定义实现类要重写其hashCode和equals方法,规定自定义类的比较规则来排重.
中对象进行排序
1.排序的(升序) 自然排序 根据ASCII表大小排序
2.排重
3.无序(存取不一致)
4.底层是一个二叉树(左序中序右序)
5.只能存储同一种类型 才能排序 不然就会出现转换异常 自定义实现类 如何比较