首页 > 编程语言 >JAVA集中学习第二周学习记录(四)

JAVA集中学习第二周学习记录(四)

时间:2024-07-26 20:28:52浏览次数:12  
标签:JAVA list System println 第二周 集中学习 数组 集合 out

系列文章目录

第一章 JAVA集中学习第一周学习记录(一)
第二章 JAVA集中学习第一周项目实践
第三章 JAVA集中学习第一周学习记录(二)
第四章 JAVA集中学习第一周课后习题
第五章 JAVA集中学习第二周学习记录(一)
第六章 JAVA集中学习第二周项目实践
第七章 JAVA集中学习第二周学习记录(二)
第八章 JAVA集中学习第二周课后习题
第九章 JAVA集中学习第二周学习记录(三)
第十章 JAVA集中学习第二周学习记录(四)


文章目录


前言

集合,我们今天要了解的是集合,集合是数组的上位替代。甚至java设计者为了解决集合没法使用基本数据类型的问题,把基本数据类型包装成引用类型来给集合使用。很牛吧,本文将介绍集合牛在哪里,为什么我们要用集合。在下攸攸太上,我们ൠ♄§星人基本什么都能做到,突然冲上CSDN榜一也是小菜一碟。


一、 集合的介绍

在介绍集合之前,我们首先要对上一篇文章的自动拆装包技术进行复习:

1. 自动拆包装操作

装箱:
基础数据类型转包装类
int a = 9;
Integer i = new Integer(a);

拆箱:
包装类转基础数据类型(程序自动.intValue())
Integer i = new Integer(7);
int b = i;

2. 集合与数组的对比

集合:是一种容器,是一种变量类型,跟数组很像
数组的优点:
数组只能存储一种数据类型,集合能存储多种数据类型,但是我们调用的时候要怎么在循环内同时对多种数据类型进行操作呢?所以还是专精一种的好。(后面会讲到泛型)
数组的缺点
1、数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。
2、使用数组操作数据的时候,删除、增加效率比较低
3、没办法获得数组中存储的真实元素个数
4、数组没办法满足,不可重复,无序的数据
这些缺点集合都可以满足

3. 集合的分类

根据存储数据的方式分类
1、Collection一个一个存储元素,是无序不唯一的接口:存入和取出的顺序可能不一样,可以不唯一
Collection有两个子接口
1.1、list不唯一,有序(接口)
——ArrayList
——LinkedList
——Vector(老版,1.6以弃用,面试有可能考)
1.2、set无序,唯一(接口)
——HashSet
——TreeSet

2、map一对一对存储元素(key:value)(key无序唯一;value无需不唯一)(接口)
1.1、HashMap
1.2、TreeMap

3.1 Collection接口

Collection c = new ArrayList();
使用声明父类 = new 子类的形式,只能使用从父类继承、重写的方法。

增加: add,addAll(Collection参数)
c1.add(“hi”);
Collection c1 = new ArrayList();
c1.addAll©;

删除: remove只删除一个,删除前面的,removeAll(ci集合),clear
c.remove(23);
c.removeAll(c1);从要删的集合中移除ci中能匹配上的所有元素(重复匹配的也删)
c.clear();//清空数组内的

修改: 没有修改方法

判断: isEmpty,contains
Collection c2 = null;
Collection c3 = new ArrayList();
//System.out.println(c2.isEmpty());//报错,空指针异常
System.out.println(c3.isEmpty());

查找: size,iterator(只有Collection的实现类有迭代器)
Iterator iterator = c.iterator();
while (iterator.hasNext()){//判断光标下是否还有下一个元素,判断弹夹iterater里还有没有子弹,返回true为有子弹
System.out.println(iterator.next());
}

转换: toArray
c.toArray();//把它转成数组,返回一个Object类型的数组
System.out.println(Arrays.toString(c.toArray()));
这些方法子接口/实现类都会继承(小幅度进行重写),所以下文不会重复讲解

3.2 List子接口

存储有序不唯一的元素(有下标)

新增:
List list = new LinkedList();
list.add(“aa”);
list.add(0, “bb”);
list.add(3, “cc”);//不能数组越界会出错
List list1 = new LinkedList();
list1.addAll(0, list);
list1.add(true);//如果没有设置下标,就末位添加
!!!
list.addAll(1, list1);
出现结果:[bb, bb, aa, cc, true, 55]
list.add(1, list1);
出现结果:[bb, [bb, aa, cc, true], 55]

查找:
System.out.println(list.get(0));//获取第一个元素
List list2 = list.subList(1, 4);//前包后不包,获取下标区间的

修改:
list.set(1, “55”);
排序,后续再讲:
list.sort();

3.3 ArrayList实现类

没有自己特有的方法,只有重写的list,Collection的方法

他的底层源码是数组

泛型数组: 限制元素添加时的元素类型

private static final int DEFAULT_CAPACITY = 10;初始默认分配空间大小为10个元素
数组满的时候会以*1.5的空间大小扩增(会取整)

底层为数组的优势:
随机访问和遍历的效率高,
劣势:
删除和添加的效率比较低,

Vector是老版本的集合

vector与ArrayList的对比:

Vector             	    ArrayList
1.5之前             	1.5之后
线程安全,效率低     	线程不安全,效率高
底层数组已2倍速度扩充		底层数组已1.5倍速度扩充

3.4 LinkList实现类(链表)

存储有序不唯一的元素
优点:
擅长做删除和添加操作
缺点:
查找,随机访问效率低

特殊方法与头尾有关:
LinkedList list = new LinkedList<>();//钻石符号内不用写
list.add(434.43);
list.addFirst(1d);//把int转成double
list.addLast(3.4d);
System.out.println(list);
list.removeFirst();
list.removeLast();
System.out.println(list);
System.out.println(list.poll());
//获得最后一个元素
结果:
[1.0, 434.43, 3.4]
[434.43]
434.43

3.5 Iterator接口

是一个迭代器:专门做循环遍历
优点:效率高,是普通for循环遍历的倍
对不同的集合结构有不同的遍历规则
是重点,而且容易跟int的包装类Integer搞混,要牢记他的拼写。

3.6 Set接口

存储无序唯一的元素
相较于List,没有自己特有的方法,只有父接口Collection里的方法

3.7 HashSet实现类

无序唯一的元素

去重原理是什么?
借助元素对象的两个方法:HashCode、Equals
首先获得要存入元素的哈希值,
通过比较哈希值,
依次比较集合中已有的元素哈希值,
如果哈希值不同,认为是不同的对象,存入集合
如果哈希值相同,再使用equals方法对哈希值相同的两个对象的属性进行比较
如果属性都相等就拒绝存入集合中
如果属性有一点不相同,可以存入集合中

底层实现:
哈希表
例如一根线上有很多夹子
每一个夹子都是一个哈希值24,65,32,63
每个夹子能夹很多衣服,他们的哈希值都一样,但分开之后的哈希值肯定有区别

3.8 TreeSet实现类

有序,唯一的元素(树是有序的)数值大小的有序,树会给你排序

TreeSet去重排序原理
利用比较器对象的比较方法依次比较想存入的元素与已存入的元素依次比较,
如果比较的结果为0,则认为是相同元素,拒绝存入
如果比较的结果为1,则认为是不同元素,可以存入,并且位置靠前
如果比较的结果为-1,则认为是不同元素,可以存入,并且位置靠后

让自定义的对象拥有比较的能力,设置该类实现Comparable接口,实现CompareTo方法
重写比较方法

3.9 比较器

集合中存入数据时(add、put)时进行比较
外部比较器 Comparator 方法Compare
内部比较器 Comparable 方法CompareTo

内部比较器:
实现Comparable接口,实现CompareTo方法

缺点:
1、如果每次更改比较规则的时候都要改源码
2、只有实现了比较器接口的对象才可以存入TreeSet项目里进行排序

外部比较器:
能解决内部比较器的缺点

使用步骤:
1、创建一个比较器类,实现Comparator接口
2、重写compare()方法

3.10 Map大类

3.10.1 Hashmap

Map 一对一对进行元素存储
以键值对key, value形式
key无序唯一
value无序不唯一

解释:键值对形式更符合网络发展的使用场所。

遍历map集合四种方法
主要思路是因为Map没有迭代器方法,所以我们需要把Map型集合转成Connection型集合,再调用迭代器方法进行遍历。
1、第一种遍历

		Map<Integer, Student> map = new HashMap<>();
        Student student = new Student(1, "张三", 24, "八嘎雅鹿");
        Student student1 = new Student(2, "张四", 22, "八嘎雅鹿");
        Student student2 = new Student(4, "李三", 14, "八嘎雅鹿");
        map.put(student.getStuid(), student);
        map.put(student1.getStuid(), student1);
        map.put(student2.getStuid(), student2);
        System.out.println(map);
        Student student3 = map.get(2);
        student3.setAge(312);
        System.out.println(map);
        System.out.println();
        Collection<Student> values = map.values();
        Iterator<Student> iterator = values.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println();

2、第二种遍历

        Set<Integer> set = map.keySet();
        Iterator<Integer> iterator1 = set.iterator();
        while (iterator1.hasNext()) {
            Student stu = map.get(iterator.next());
            System.out.println(stu);
        }
        System.out.println();

3、第三种遍历:Entry同时封装多个对象

        Set<Map.Entry<Integer, Student>> entries = map.entrySet();
        Iterator<Map.Entry<Integer, Student>> iterator2 = entries.iterator();
        while (iterator2.hasNext()) {
            Student stu = iterator2.next().getValue();
            System.out.println(stu);
        }

        System.out.println();

4、第四种遍历:增强型for循环

        Collection<Student> values5 = map.values();
        for (Student student4:values5){
            System.out.println(student4);
        }

增强for循环:
增强型for循环:可以在不知道下标的情况下遍历集合/数组
普通for循环:必须知道下标
for(集合中元素的类型 代号(形参): 要遍历的集合){对代号进行操作}

修改方法
会将原有的值覆盖掉,来实现修改
HashMap的键值对都可以设置为空
注意事项:
保证key值唯一的原理时,key值类型要求重写HashMap()

HashTable和HashMap的区别:
table继承于Dictionary、线程安全、操作速度慢、效率低;不允许为空;初始值11;老版本; 底层数组已2倍速度扩充
Map继承于AbstractMap、线程不安全,操作速度快,效率高;允许为空;初始值16;新版本;底层数组已1.5倍速度扩充

3.10.2 TreeMap

与HashMap的区别
1、key值去重的原理不同
2、底层存储数据的实现不同
3、TreeMap的key值可以去重+排序,HashMap不能排序只能去重

思考:System.out.println( c );
一般输出语句默认调用toString(只有在输出语句里是这样)
会对String类型的变量调用tostring方法吗?

答案:会的,虽然是废二遍事。


总结

本文花费大篇幅讲述了集合的分类,List和Set区别,Hash和Tree区别,Connection和Map区别。请大家在仔细区分的同时学习各自特殊的方法。感谢各位客官在宝贵的生命中分给这篇文章一些时间,感谢你们用心观看。话说,在下面临一些问题,心情有些低迷,有什么方法能学到大火球术,传送门法术,心灵控制术这些奇门功法吗?或者告诉我异世界的传送卡车会在什么时候在什么地方出现?

标签:JAVA,list,System,println,第二周,集中学习,数组,集合,out
From: https://blog.csdn.net/howwickhappy/article/details/140712194

相关文章

  • [Java面向对象]final
    final简介[2]final关键字可用于多个场景,且在不同场景具有不同的作用。首先,final是一个非访问修饰符,仅适用于变量,方法或类。下面是使用final的不同场景:java中的final关键字上面这张图可以概括成:当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实质上是常......
  • JAVA集中学习第二周项目实践[图书管理系统]
    系列文章目录第一章JAVA集中学习第一周学习记录(一)第二章JAVA集中学习第一周项目实践第三章JAVA集中学习第一周学习记录(二)第四章JAVA集中学习第一周课后习题第五章JAVA集中学习第二周学习记录(一)第六章JAVA集中学习第二周项目实践文章目录系列文章目录......
  • [Java并发]
    多线程的价值(这里展示的是网上的答案,我觉得真正重要的是减少进程切换的代价)发挥多核CPU的优势多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事而不互相干扰。防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的......
  • java位运算
    位运算符:针对二进制的值补码形式进行计算的&|^(相同为0,不同为1)~<<>>>>>publicclassWeiOptDemo1{publicstaticvoidmain(String[]args){bytea1=3;byteb1=4;System.out.println(a1&b1);System.out.println(a1|b1);System.o......
  • java 06
    输入:引入scannerimportjava.util.ScannerScannerscanner=newScanner(System.in)Stringname=mySanneer.nextInt()//输入内容在命令框输入Javainput进制:十进制转二进制:不断除以2最后将余数倒着拍;转8转16相似;位运算:1>>2:1向右位移两位;1<<2左移2原码反码补码:如......
  • 创建 Java 虚拟机JVM中的参数说明
    1、上一篇创建虚拟机的代码加参数备注varOptions:array[0..4]ofJavaVMOption;VM_args:JavaVMInitArgs;ErrCode:Integer;begin{创建Java虚拟机}FJavaVM:=TJavaVM.Create(JNI_VERSION_1_8);//这个选项设置Java类路径,指定JVM应该在哪里......
  • java静态代码检测-spotbugs
    以前使用的findbugs宣布在2016年后已经不做维护了,取而代之的是spotbugs.要想使用spotbugs,需要在代码仓库中做一些配置1.在maven项目的pom.xml文件中,加入依赖包: officalwebsiteurlreference: https://spotbugs.readthedocs.io/en/latest/maven.html<plugin><groupId......
  • LeetCode 2.两数相加 java
    力扣链接2.两数相加-力扣(LeetCode)题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0......
  • 【一手源码展示】Java代码TikTok内嵌商城代码程序,TikTok跨境电商系统源码,TK商城源码
    这套程序已经做了很久了我这边修复二开优化也好几个版本搭建起来做起来确实费劲前后端分离的程序 二开效果页面展示:......
  • Java-----学习笔记4
    Java中的方法Java中的方法与C语言的函数有些相似,它们都是为了完成特定功能的代码块,都可以被多次调用。main方法publicstaticvoidmain(String[]args){}public---访问控制符,控制方法可见性。static---这个关键字表示该方法是静态的。void---返回类型void--不需要......