集合框架和泛型

集合框架(一)

在Java程序中如何临时存储数
变量
数组1.长度不能改变
2.数据类型单一(吃货联盟为了存储订单信息,菜品信息 定义了n个数组)
String[]dishMsg = {“红烧带鱼2份”};
String[]names = {“土豆”};
int[]time ={10};
类和对象(实体)
对象数组:它在一定程度上解决了数据类型单一的问题。
Order[]orsers {new Order(xx),newOrder(xxx);

1.了解Java集合框架体系结构

为了解决数组长度不可变问题!

实现可变数组:

1.定义普通数组,长度随便指定一个

2.当有数据需要插入时,判断当前长度是否足够存储数据,如果不够创建新的数组。
Array.copyOf(arr,length);

3.将新数组返回

封装:功能聚合,封装成统一的API.

Collection(收集) 顶级接口 无序且数据不唯一(可以重复)

List(接口)- 数据不唯一(可重复)有序
Set接口- 无序 数据唯一
ArrayList(实现类)
LinkedLIstanbul(实现类)
HashSet(实现类)
TreeSet (实现类)

工具类
Collections
Arrays
2.会使用ArrayList存取数据
ArrayList<存储的数据类型>集合名= newArrayList<存储的数据的类型>();
1.boolean add(Object object);向列表中追加元素
2.void add(int index, Object object);向列表中的指定索引添加元素
3.int size();获取列表的长度/元素个数
4.Object get(int index);根据索引获取对应的元素
5.boolean contains(Object obj); 判断是否包含某个元素

6.boolean remove(Object obj);删除指定的元素
7.Object remove(int index);根据索引删除元素 且返回被删除的元素值
来自于ArrayList的父级接口们:
toArray()转换为数组
clear()清除所有的元素
isEmpty()判断是否为空集合 list.size ==0
iterator()迭代器
了解:Cpllections.shuffle(list);工具类的方法 可以用来随机打乱集合内的数据
list Arrays.asList(T…t);可以创建集合并且赋值

集合泛型特点:它是用来约束/声明集合元素的数据类型的。
1,泛型必须是引用数据类型,如果是存储基本数据类型值,则必须将其转为对应引用数据类型(包装类型)。
byte>Byte
short>Short
int>Integer
long>Long
float>Float
double>Double
char>Character
boolean>Boolean

3.会使用LinkedList linkedList = new LinkedList<>():
List接口中的API它也有。
1.void addFirst(Object obj);将元素添加到第一个
2.void add Last(Object obj);将元素添加到最后一个
3.Object getFirst();获取第一个
4.Object getLast();获取最后一个
5.Object removeFirst();删除第一个
6.Object removeLast();删除最后一个

4.了解ArrayList LinkedList的区别

ArrayList:底层是数组结构,所以拥有索引,在遍历或随机查找时比较快,但是又因为是数组,数组长度不可变,每一次“增删”都是要创建新的数组,比较慢。
LinkedList:底层是链表结构,链表结构存储每一个元素由两部分组成,数据域和指针域,它没有索引。多个元素之间,通过指针域指向连接。因为没有索引 ,所以,查找比较慢,但是因为是链表所以在增删时只需要切换指针指向即可(尤其收尾更快)。
ArrayList Linkedlist都有索引,但不同。
ArrayListd的索引是固定的,类似于座位号。
LinkedList的索引是根据元素位置计算出来的,并非固定的。

5.掌握使用Set集合存取数据

无序 唯一
HashSet
其实它实现唯一是根据hashcode() equal()做的比较。

6 集合框架和泛型

Java高级特性入门

1,集合框架(一)

1.1 为什么使用集合框架

1.2 Java集合框架

Collection 接口可以用来存储一组不唯一(可重复),无序(存储时无顺序)的数据。

List接口可以用来存储一组不唯一,有序(存储时有顺序,先存的在前面,后存入的在后面)的对象。

Set接口可以用来存储一组唯一,无序的对象。

Map接口可以用来存储一组键值对象,提供key到value的映射。

1.3 List 接口

list: 主角: Collection 系列

Arraylist

Linkedlist

其中Arraylist实现了长度可变的数组,在内存分配连续的空间,遍历元素和随机访问元素的效率比较高。

Linkedlist采用链表存储方式,插入,删除元素时效率比较高。

1.3.1 Arraylist

Arraylist是实现自list,list又继承自Collection接口,那么Collection接口的通用方法也能被Arrarylist所使用。

方法名说明
boolean add(Object 0)在列表的末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o)在指定的索引位置添加元素,索引位置必须介于0和列表中元素个数之间
int size()返回列表中的元素个数
Object get(int index)返回指定索引位置添加元素。取出元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)判断列表中是否存在指定元素
boolean remove(Object o)从列表中删除元素
Object remove(int index)从列表中删除指定位置元素,起始索引位置从0开始

Arraylist的内部实现其实就是对数组做了封装。

C: Linkedlist也是list的实现类,List里有API也有。

方法名说明
void addFirst(Object o)在列表的首部添加元素
void addLast(Object o)在列表的末尾添加元素
Object getFirst()返回列表中的第一个元素
Object getLast()返回列表中的最后一个元素
Object removeFirst()删除并返回列表中的第一个元素
Oject removeLast()删除并返回列表中的最后一个元素

堆栈:采用该结构的集合,对元素的存取特点;

先进后出

栈的入口,出口都是栈的顶端位置。

压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。

弹栈:就是取元素。即,把栈的顶端位置 元素取出,栈中已有元素依次向栈顶方向移动一个位置。

Arraylist采用的就是数组结构,可以想到我们之前说过数组的长度不可改变,所以新增元素自然要将之前的元素先放到一个新数组。

数组,采用该结构的集合,对元素的存取特点

查找元素快:通过索引,可以快速访问指定位置的元素。

增删元素慢:

	指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置。再把原数组元素根据索引,复制到新数组对应索引的位置。

	指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。

C Linkedlist采用的就是链表结构。

多个节点之间,通过地址进行链接。

查看元素慢:想找某个元素,需要通过连接的节点,依次向后查找指定元素

增删元素块:

	增加元素: 只需要修改连接下个元素的地址即可。

	删除元素: 只需要修改连接下个元素的地址即可。

1.4 Set接口

1.4.1 HashSetSet可以用来存储一组唯一,无序的数据,Hashset是set接口常用的实现类,当然还有一个Treeset(自动排序)。如果你要用 存储数据类型的对象时 ,一定要保证是否根据你需求重写过equal()方法与hashcode().

1.4.2 set的遍历

以前我们数组可以 用for循环遍历,而我们list系列的集合因为有索引也可采用for循环来遍历。但是set集合,是无序的,所以无法再用for循环来遍历索引了。

方法1:通过迭代器Iterator实现遍历

获取iterator:Collection接口的iterator()方法

Iteratot的方法

	boolean hasNext() :判断是否存在另一个可访问的元素

	Object next():返回要访问的下一个元素

扩展:在迭代 集合的过程中,不能对集合进行增删操作 (会报并发访问异常),可以用迭代器的方法进行操作(子类listlterator:有增删方法)。

方法2:增强for循环

foreach:增强for循环只能针对实现了iterable接口的集合进行迭代;iyerable是jdk1.5中新定义的接口,就一个方法iterator()方法,只有实现了iterable 接口的类才能保证一定有itweator()方法,java有这种限定,其实是增强for循环内部还是用迭代器实现的。同时在使用增强for时也不能对元素赋值,(我们的List系列集合也可以用它)

2.集合框架(二)

2.1 Map接口

它也是非常重要的集合框架,后期很多技术都是基于它实现的,

Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作,最常用实现的实现类是Hasmap.

2.2 Map的遍历

注意:iterator()方法是Collection接口的,map没有。因为没有iterator()方法,所以使用增强for更别说普通for了。

C:任何容器都需要进行遍历,

1:通过迭代器Iterator实现遍历

通过keyset Iterator实现遍历

方法2:增强型for循环

不过就是对set集合的遍历换成增强for了而已。

方法3:键对值

遍历出来的就是一个一个的夫妻对(条目:包含着key value),理解起来会有难度

2.3 泛型的作用

是jdk1.5倍的一个特性。SUN公司使用泛型改写了集合框架中的所有接口和类。

泛性的作用:保证类型转换的安全性和稳定性包。

集合中泛型要使用包装类型(引用数据类型)

集合存储int型,在指定泛型用Integer, char>Character,double ->Double等。在"实用类"章节进行详细讲解。

2.4 Collections

类定义了一系列用于操作集合的静态方法.(类似Arrays).

2.5 可变参数

在jdk1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,这时候我们可以采用可变参数,它本质 上就是数组,只不过在给可变参数传递参数的时候,不需要再创建数组来传递了,而是直接将数组里的元素作为实际参数进行传递传递,其实,编译成的class字节码文件,将这些元素封装到一个数组中,然后 才进行传递使用的,不过都是系统帮你做的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值