hi,大家好,我是终南有客,一个热爱自由的程序员……
想要获取更多信息,请关注(终南有客)公众号,了解最新消息
一. Java数组
数组是编程语言中最常见的一种数据结构,可以存储多了元素,通常可以通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
创建数组大致包括如下步骤:
. 声明一个数组类型的引用变量,简称为数组变量;
. 用new语句构造数组的实例。new语句为数组分配内存,并且为数组中的每个元素赋予默认值;
. 初始化,即为数组的每个元素设置合适的初始值。
1.数组也是一种类型
- Java中数组要求所包含的元素必须是同一数据类型。在一个数组中,元素的类型时唯一的。一单数组被初始化后,它在内存中占用的空间就确定了,不管数组中是否存放了元素。
- Java的数组也是一种数据类型,是一种引用类型,例如int是一个基本类型,但int[]就是一个引用类型了。
2.定义数组‘
可以使用两种方式定义数组
- type[] arrayName;
- type arrayName[];
推荐使用第一种,更加突出数组是一种数据类型。
3.数组的初始化
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;
- 如是基本类型中的浮点型,默认值为 0.0;
- 如实基本类型中的字符型,默认值为 ‘\u0000’;
- 如实基本类型中的布尔型,默认值为 false;
- 如是引用类型,默认值为 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是有序的(存取顺序),可以装重复元素,有索引
下面的三个子集合的区别
- |–Vector 底层数据结构是数组 查询快 增删慢 线程安全 效率低 默认长度是10 超过就会100%延长 变成20 浪费空间
- |–ArrayList 底层数据结构是数组 查询快 增删慢 线程不安全 效率高 默认长度是10 超过就会new一个新的数组 50%延长 节省空间
- |–LinkedList 底层数据结构是链表(双向链表)
查询慢 增删快 线程不安全 效率高
2)Set
是无序的(存取顺序),不能重复,无索引值.
Set集合的子集合 HashSet 按照哈希算法来存取集合中的对象 存取速度比较快
当程序向HashSet中 add()的一个对象的时候, 先用hashCode方法计算出该对象的哈希码 哈希码不一致 添加 哈希码一致
不添加 相同对象不添加 然后用equals判断对象的属性是否一致 比较结果为false就添加 true就不添加 不同对象添加
基本数据类型包装类/String 已经重写了hashCode 和 equals 会自动比较
自定义实现类要重写其hashCode和equals方法,规定自定义类的比较规则来排重.
中对象进行排序
特点:
1.排序的(升序) 自然排序 根据ASCII表大小排序
2.排重
3.无序(存取不一致)
4.底层是一个二叉树(左序中序右序)
5.只能存储同一种类型 才能排序 不然就会出现转换异常 自定义实现类 如何比较
想要了解更多信息,或思维导图,请关注(终南有客)公众号