Java基础知识(五集合)

集合是一种特别有用的工具类,可以用于存储数量不等的多个对象,并可以实现常见的数据结构,如堆栈、队列等。堆栈(先进后出,后进先出),队列(先进先出)

在编程过程中,通常需要集中存放多个数据。当然可以使用前面学过的数组来保存多个数据或者对象,但是数组的长度不可变化,一旦数组初始化完成,则长度就固定了下来。如果需要保存数量变化的数据,数组就有点无能为了,因此我们需要使用到集合类

Collection接口

这里写图片描述

Collection接口中定义的常用方法:

这里写图片描述

Collection集合的遍历

1.Iterator接口
Iterator接口是Collection接口的父接口,Iterator接口主要用于遍历Collection集合中的数据,通常我们也称为迭代器.

Iterator接口定义的方法

boolean hasNext(); 被迭代的集合元素还没有被遍历,则返回true
Object next(); 返回集合里的下一个元素
void remove(); 删除集合里上一次next返回的元素

遍历方法

Collection list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");

Iterator iterator = list.iterator();
while(iterator.hasNext()){
    String str = (String)iterator.next();
    if(str == "b"){
        iterator.remove();
    }
}

foreach循环

当一个数据被放入集合后,数据的类型将被“遗忘”,程序只知道它是一个Object类型的数据,所以我们可以把一个集合类似的看成一个类型为Object的数组,通过foreach方式进行遍历

Collection list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");

for(Object obj : list){
    String str = (String)obj;
    System.out.println(str);
}
Collection接口常用的子接口:

1.List接口
2.Queue接口
3.Set接口

List接口

List集合概述:
List代表一个元素有序、可重复的集合,集合中每个元素都有对应的顺序索引。
List作为Collection的子接口,可以使用Collection接口里面的全部方法,而且因为List是有序的元素结构,因此List还增加了一些根据索引来操作集合元素的方法。
List集合拓展的方法:
这里写图片描述

List的常用实现类

ArrayList类
Vector类
Stack类
LinkedList类

ArrayList类
ArrayList类简介
ArrayList类的底层封装了一个动态的、允许再分配的Object[]数组。如果想ArrayList中添加元素超过了数组的长度时,会重新分配一个长度更长的新数组
ArrayList拓展的方法:
1.

void ensureCapacity(int minCapacity);

将底层的Object[]数组长度增加minCapacity,可以通过这个方法一次性增加数组的长度,减少重新分配的次数,从而提高性能
2.

void trimToSize(); 

调整ArrayList或Vector集合的Object[]数组长度为当前元素的个数,当集合元素已经确定后,则可以通过这个方法,减少底层数组的长度,可以减少集合对象所占用的存储空间
Vector类
Vector类和ArrayList的用法以及底层原理几乎一样,但是由于Vector是一个古老的集合(JDK1.0就存在了),那时候Java还没有提供系统的集合框架,从JDK1.2以后,Java才提供了系统的集合框架,将Vector改为实现了List接口,从而导致Vector里有一些功能重复的方法
ArrayList类和Vector类的区别
ArrayList是线程不安全的,所以性能会更高;
Vector是线程安全的,所以性能会更低;

什么时候使用ArrayList,什么时候使用Vector?

1.通常我们都应该选择使用ArrayList
2.如果在多线程的情况下,因为ArrayList是线程不安全的,所以可以使用Collections工具类把一个ArrayList变成线程安全的集合

Queue接口

1.Queue集合概述
Queue集合用于模拟队列这种数据结构,即“先进先出(FIFO)”。新元素总是添加到队列的尾部,访问元素则会获得队列头部的元素,通常,队列不允许随机访问队列中的元素

Set接口

Set集合概述:
Set代表一个元素无序、不可重复的集合,如果尝试把两个相同的元素添加进同一个Set集合,则会添加失败,add方法返回false

Set的常用实现类
a.HashSet类
HashSet类简介:
HashSet是Set接口的典型实现类,大多数时候使用Set集合就是使用这个实现类,
HashSet是根据Hash算法来存储集合中的元素,因此具有很好的存取和查找的性能
注意:
HashSet类判断两个对象是否相同的原则,是根据equals和hashCode两个方法来判断的;
必须equals方法返回true,并且hashCode方法返回的值相同,HashSet才会把这两个对象当成是相同的对象,不能重复添加
b.LinkedHashSet类
c.TreeSet类

Set实现类的性能分析

HashSet和TreeSet是Set的两个典型实现类,HashSet的性能总是比TreeSet要好的,因为TreeSet需要额外的红黑树算法来维护元素的排序,当要对保持元素排序时,才考虑使用TreeSet,否则我们都应该使用HashSet

1.Set集合判断元素是否为同一个元素的原则,是根据equals方法
2.Set集合的元素可以为null,但是只能有一个null

Map接口

这里写图片描述
Map接口简介:
Map是一个可以保存映射关系数据的集合,因此Map集合里保存了两组值,一组值用于保存Map的key,另一组数组用于保存Map的value。key和value之间存在单向的一对一关系,即通过key总能找到唯一的value。

Map集合的遍历:

1.遍历key的方式:

Map map = new HashMap();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);

Set set = map.keySet();
for(Object obj : set){
    Integer key = (Integer)obj;
    System.out.println("key = " + key + ", value = " + map.get(key));
}

遍历Entry对象

Map<Integer, Integer> map = new HashMap();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);

Set<Entry<Integer, Integer>> set = map.entrySet();
for(Entry<Integer, Integer> entry : set){
    System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
}

1.HashMap类和Hashtable类
HashMap和Hashtable类是Map接口的两种典型实现类,关系类似于ArrayList和Vector之间的关系。Hashtable是一个非常古老的类,而且类名也没有遵照Java的命名规范,因此我们都应该选择使用HashMap

HashMap和Hashtable的区别:
1.Hashtable是线程安全的,HashMap线程不安全,所以HashMap性能要略高。
2.Hashtable的key和value都不能为null,HashMap的key和value则可以为null
这里写图片描述

集合工具类-Collections

Collections简介:
Collections是一个操作Set、List和Map等集合的工具类,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作

泛型

Java 1.5推出了一个新特性,参数化类型。也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口、方法的创建中,好处就是可以在编译时进行类型检查,并且所有强制转换都是自动和隐式的,也提高了代码的重用率。参数化类型就是泛型。

泛型在Collection中的运用

Collection<元素类型> c = new ArryList<元素类型>();

表示c集合内只能摆放泛型中所指明的类型,如果摆放其他类型则编译器会报错

List<String> list = new ArrayList<String>();
Set<Integer> set = new HashSet<Integer>();
Queue<List<Float>> queue = new LinkedList<List<Float>>();

泛型在Map中的运用
语法:

Map<key的类型, value的类型> map = new HashMap<key的类型, value的类型>();
Map<Integer, String> map = new HashMap<Integer, String>();

Java 7中泛型的新语法
Java 7以后,泛型语法可以更简单一点:
List list = new ArrayList<>();

深入泛型

泛型接口、类
定义泛型:
public class 类名<泛型名称1, 泛型名称2, …>{

}

比如:

public class Dog<T, E, ...>{

}
public class Dog<T>{
    T data;
}

定义泛型后,泛型直接可以作为数据类型来使用

使用泛型类创建对象

public class Dog<T>{
    public T getData(){

    }
}

创建对象:
Dog<String> dog = new Dog<>();
String str = dog.getData();//方法的返回值直接就是String类型,不需要强转
或者
Dog dog = new Dog();
String str = (String)dog.getData();//如果创建对象时没有指明泛型的类型,则类中所有泛型就变成了Object
泛型方法

泛型方法和泛型类的区别:
有时候在定义类、接口的时候并没有定义泛型,但是定义方法时想自己定义泛型,这也是可以的,泛型方法所定义的泛型只能在本方法使用

定义泛型方法:
[修饰符] <泛型名称1, 泛型名称2, …> 返回值类型 方法名([形参列表]){
//方法体
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值