海纳百川的Java 集合(List/Set/Map)

一些常见的数据结构:

List集合:

ArrayList

     特点:内部基于数组实现的一个集合类。查询比较快,添加和删除相对比较慢

     遍历方式:如迭代器和for循环(还有其他遍历方式,这里就不全部举例了,下同)

ArrayList bag = new ArrayList();//创建集合对象

bag.add("电脑");//往数组里面添加数据

bag.add(200);

bag.add("鼠标");

bag.add("小人书");

bag.add("教材");

bag.add("牛奶");

 

For循环:

for(int i=0;i<bag.size();i++){

System.out.println(bag.get(i));

}

迭代器iterator:

//使用迭代器遍历集合ArrayList   bag

// 获得一个迭代器

Iterator it = bag.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

 

双向迭代器:

Iterator  单向的迭代器接口,从左到右依次获得数据,判断是否有下一个;获得下一个

   |-- ListIterator   双向的迭代器接口,它的主要方法如下:

    Iterator中有的它也有;

                         boolean hasPrevious() 判断是否有上一个;

     Object  previous() 获得上一个元素;

LikedList:(是双向链表)

基于链表的List集合

1、 内部是基于双向链表结构实现的。添加和删除比较快,查询相对ArrayList比较慢

2、 内部相对于ArrayList而言多了一些操作头和尾的方法

3、 可以充当队列,堆栈

4、 不是线程安全的(同步的)

 

 

总结:LinkedList底层是基于双向链表容器类,添加和删除比较快。查找和修改较慢。

ArrayList与LinkedList的区别;

都是list的实现类

ArrayList : 数组集合(线程不安全)

特点:查询修改效率高,插入删除效率低

 

LinkedList:链表集合(双向链表)(线程不安全)拥有

特点:插入删除效率高

 

Set集合:不重复,添加无序的集合(底层是map,使用的map中的key键部分,value部分均为map的同一个静态常量)

HashSet

a、HashSet特点:

①不能添加重复元素,无序的(添加顺序和打印顺序不一致:不记录添加顺序);

②HashSet容器对象:添加完一种类型的数据之后,还能够添加其他类型(如果不定义什么类型就可以)

b、HashSet判断重复的标准通过:

         ①判断hashcode

         ②判断equals

如果两个对象的hashCode值相等,并且equals返回为true 就表示对象相等(重复)

在定义类时可以覆写这两个方法(为什么加这一句,废话不多说看下面的使用)

c、HashSet的使用

HashSet<自定义类> st = new HashSet ();//自定义类为存放的数据的类型

例如:

HashSet<MyType> st = new HashSet<>();

class MyType{

//覆写这两个方法,可以在st.add()方法添加数据的时候虚拟机调用

//快捷方式:shitf+alt + s 自动生成,建议equals 自己写,hashcode的方法不要动

Hashcode(){}

equals (){}

}

St.add(new MyType());(或者具体的对象)

TreeSet

a、TreeSet特点:

①不能添加重复元素,无序的(添加顺序和打印顺序不一致:不记录添加顺序);

②TreeSet容器对象:添加一种类型之后不能再添加其他类型

b、TreeSet判断重复的标准通过:

TreeSet<自定义类> st = new TreeSet();//自定义类为存放的数据的类型

①自然排序:通过自定义类实现Comparable接口 ,通过compareTo()覆写进行判断重复

②自定义排序:通过实现比较器comparator接口,通过compare()覆写进行判断重复

这两个方法返回的结果值都是一样的作用

(返回   0:重复  1:表示按add前后进行排序添加   -1:表示按add前后的倒序进行排序添加)

Map:

a、Map的解释:

键值对集合,上面两种都是collector的实现类,map不是,里面需要存放的是泛型entry<K,V>的类型(这个entry是Map接口里面的内部接口)(K\V是泛型,也就是可以自定义类型的,也可以自定义类型范围的泛型)

b、判断重复的标准

使用key作为判断重复的标准.只拿key 和已经存在的一对一对key进行比较;就少拿了一个value而已;这个原理和HashSet,TreeSet一样。设计Map的时候,并没有说具体按照什么进行判断重复,而是通过实现类进行判断;

因此实现类:HashMap、TreeMap的使用原理一样都是,但是HashSet,TreeSet里面不是键值对

c、Map的存储原理:

利用封装的,如果要封装,首先有个类型,这个类型是Entry,

 

Entry类型作用:Entry用来封装用户添加的一对数据.Entry类型有两个字段,添加的时候,使用Entry把两个值封装成一个对象,然后放到Map容器里面。对于Map而言,看到的只有Entry对象。

 

d、遍历方式:

通过转换成set或者list集合进行遍历:调用的是

entrySet()   返回:entry的set集合

KeySet() 返回:key的set集合

values() 返回:V(值的类型)的Collection集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值