Android逆向(教程更新)|Java基础语法-容器

VSole2021-08-04 07:40:00

0x01 基本概念


在我们开发程序中经常会与数据打交道,而我们一般是通过”容器”来容纳和管理数据。那什么是“容器”呢?生活中的容器不难理解,是用来容纳物体的,如锅碗瓢盆、书包和快递箱等。程序中的“容器”也有类似的功能,就是用来容纳和管理数据。

      实际上,我们之前学习的数组就是一种容器,可以在其中放置对象和相同类型的一组数据。而数组的容量是事先定义好,不能随着需求的变化而扩容。基于数组并不能满足我们对于“管理和组织数据的需求”,所以我们需要一种更强大、更灵活、容量随时可扩的容器来装载我们的对象。这就是我们要学习的容器,也叫集合。容器的接口层次结构图如图所示:

Java容器类类库的用途是保存对象,可以将其分为2个概念:

  • Collection:独立元素的序列,这些元素都服从一条或多条规则。List、Set都是Collection的一种,List必须按照顺序保存元素,而Set不能有重复元素。
  • Map:Map是键值对类型,允许用户通过键来查找对象。Hash表允许我们使用另一个对象来查找某个对象。

0x02 Collection接口

1)List的特点及实现类

List是有序、可重复的容器。List中每个元素都有索引标记。可以根据元素的索引标记访问元素,从而精确控制这些元素。List允许加入重复的元素。更准确的来说,List通常允许满足 e1.equals(e2) 的元素重复加入容器。List接口常用的实现类有3个:ArrayList、LinkedList和Vector。

2)ArrayList

ArrayList底层是用数组实现的存储。ArrayList是长度可变数组,元素以线性方式连续存储,内部允许存放重复元素。允许对元素进行随机的快速访问,但是向ArrayList中插入和删除元素的速度较慢。ArrayList是非线程安全的。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。

特点:查询效率高,增删效率低,线程不安全。

3)LinkedList

LinkedLis底层用双向链表实现的存储,内部采用双向循环链表实现,插入和删除元素的速度较快,随机访问的速度较慢,LinkedList也是非线程安全的。

特点:查询效率低,增删效率高,线程不安全

4)Vector

Vector底层是用数组实现的List,相关的方法都加了同步检查,所以Vector线程安全,效率低。

       特点:线程安全,效率低。

0x03 Set接口

Set接口继承Collection接口,Set容器的特点上面也提及过,无序不可重复。Set的常见实现类有HashSet、TreeSet等,我们一般使用HashSet。举例如下:


0x04 Map接口

Map就是用来存储“键(key)-值(value) 对”的。Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。Map在实际开发中使用非常广,特别是HashMap。put进行添加值键对,containsKey验证主要是否存在、containsValue验证值是否存在、keySet获取所有的键集合、values获取所有值集合、entrySet获取键值对。举例如下:

执行结果如下:

0x05总结


在后续协议分析实战中,我们会经常见到关于HashMap的用法,学会HashMap的使用对于后续的逆向分析是非常有帮助的。

在这里关于java的课程讲解就这么多了,很多细节以及实际操作在文章中并未讲出,如果想要更深入细致的学习可以去网上寻找相关java视频教程,不过我个人建议仍然是先了解个大概,需要用到时再去学习也不迟,希望大家能对之前讲解的文章耐心的阅读下来。

arraylistlist
本作品采用《CC 协议》,转载必须注明作者和本文链接
Listener 三个域对象ServletContextListenerHttpSessionListenerServletRequestListener很明显,ServletRequestListener 是最适合用来作为内存马的。因为 ServletRequestListener 是用来监听 ServletRequest对 象的,当我们访问任意资源时,都会触发ServletRequestListener#requestInitialized()方法。下面我们来实现一个恶意的 Listener。这里我找到了ServletRequestListener,因为根据名字以及其中的requestInitialized()方法感觉我们的发送的每个请求都会触发这个监控器。这里我们尝试自己写一个 Listener,并进行测试。因为前面猜想requestInitialized()方法可以触发 Listener 监控器,所以我们在requestInitialized()方法里面加上一些代码,来证明它何时被执行。
前两天做了一个导入的功能,导入开始的时候非常慢,导入2w条数据要1分多钟,后来一点一点的优化,从直接把list怼进Mysql中,到分配把list导入Mysql中,到多线程把list导入Mysql中。 时间是一点一点的变少了。非常的爽,最后变成了10s以内。 下面就展示一下过程。
多线程是Java的一个难点,但是它也很有趣,听说玩得溜得起飞的人,人生都开启多线程模式了…
ArrayList是线程不安全的,于是JDK新增加了一个线程并发安全的List——CopyOnWriteList,中心思想就是copy-on-write,简单来说是读写分离:读时共享、写时复制(原本的array)更新(且为独占式的加锁),而我们下面分析的源码具体实现也是这个思想的体现。 继承体系:
for 与 foreach 的区别
2022-04-16 15:01:11
之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因;接下来我们来探讨一下是否能够如此;
FastJson结合二次反序列化绕过黑名单
0x01 前言在上一篇文章中深入浅出内存马(一),我介绍了基于Tomcat的Filter内存马,不光是Fil
1 背景之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。使用属性拷贝工具容易存在一些隐患2 示例首先公司内部就遇到过 commons 包的 BeanUtils 进行属性拷贝性能较差的真实案例,然后该同事换成了 Spring 的 BeanUtils 性能好了很多,感兴趣大家可以使用性能测试框架或者基准测试框架去对比,这里就不对比了。接下来我们看 Spring 的 BeanUtils 的属性拷贝会存在啥问题:import?大家运行上述示例时,会发生类型转换异常。
1 背之前讲过“不推荐使用属性拷贝工具”,荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。接下来我们看 Spring 的 BeanUtils 的属性拷贝会存在啥问题:import?大家运行上述示例时,会发生类型转换异常。打断点可以看到,属性拷贝之后 B 类型的 second 对象中 ids 仍然为 Integer 类型:如果不转换为字符串,直接进行打印,并不会报错。使用CGlib 在不定义Converter 的情况下也会遇到类似问题:import?可以成功的将 A 中 List 转为 B 中的 List 类型。
//把Map的购物车转换为Item列表??//应付总价=商品总价+运费总价-总优惠??然后实现针对 VIP 用户的购物车逻辑。所以,这部分代码只需要额外处理多买折扣部分:public?
VSole
网络安全专家