java集合稳定性_java集合(二)

1.关于map的遍历

/**使用entrySet遍历map类KV,而不是keySet方式遍历

keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key

1.Map集合中提供了get()获取元素的方法,get()对应一个键去除其对应的值,这种方式比较局限和单一。

/**

* 2.不能全部取出来,要去除所有元素(值),则必须要拿到所有的键,然后才能渠道所有与其对应的值,针对这种新的需求

*  java提供了相应的解决方案

*  解决方案:

*  Map集合中提供了两中取出方式:

*  <1> 返回值类型Set方法是keySet():返回此映射中包含的键的set视图,将Map中所有的键存入到set集合,因为set具备迭代器,所有迭代方式取出所有的键再根据get

*    方法,获取每一个键对应的值

*  <2> 返回值类型:Set>方法是entrySet()

*   去除的是关系,关系中包含key和value,其中map。entry来标识这种数据类型:将map集合中的映射关系存入到set集合中,这个关系的数据类型为:Map.Entry

* 3.values()方法返回的是所有的value值。这就是map从三个角度去获取值的方法

*/

@Test

public void testKeyset() {

Map map = new HashMap<>();

map.put("1", "fengyw1");

map.put("2", "fengyw2");

map.put("3", "fengyw3");

map.put("4", "fengyw4");

map.put("5", "fengyw5");

// 使用keyset遍历

Set k = map.keySet();

Iterator kt = k.iterator();

while (kt.hasNext()) {

String key = kt.next();

String value = map.get(key);//这个相当于又循环了一遍

System.out.println(key + ": " + value);

}

System.out.println("keyset is  end ........");}

@Test

public void testEntryset() {

System.out.println("mapset is  start ........");

Map map = new HashMap<>();

map.put("1", "fengyw1");

map.put("2", "fengyw2");

map.put("3", "fengyw3");

map.put("4", "fengyw4");

map.put("5", "fengyw5");

// 使用keyset遍历

Set> setMap = map.entrySet();

Iterator> entryTr = setMap.iterator();

while(entryTr.hasNext()){

Map.Entry entry = entryTr.next();

System.out.println(entry.getKey() +": "+entry.getValue());

}

System.out.println("mapset is  end ........");

}

}

.entryset是一次遍历,keyset相当于拿到了key值以后,又对每个key值去遍历map

2.Comparator和Comparable的区别

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。

Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

(1)、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身

(2)、可以使用多种排序标准,比如升序、降序

3利用set的不可重复性去重,避免list遍历

package entity;

import java.util.Comparator;

public class User implements Comparable{

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int compareTo(User o) {

// TODO Auto-generated method stub

return this.name.compareTo(o.name);

}

}

package mytest;

import java.util.ArrayList;

import java.util.Comparator;

import java.util.Date;

import java.util.Set;

import java.util.TreeSet;

import entity.User;

public class MySet {

public static void main(String[] args){

ArrayList mList = new ArrayList<>();

ArrayList subList = new ArrayList<>();

for (int i = 0; i < 10000; i++) {

User people = new User();

people.setAge(10 + i);

people.setName("jack" + i);

mList.add(people);

}

for (int i = 0; i < 9999; i++) {

User people = new User();

people.setAge(10 + i);

people.setName("jack" + i);

subList.add(people);

}

quchong(mList,subList);

quchongSet(mList,subList);

}

private static void quchong(ArrayList mList, ArrayList subList) {

Long s = new Date().getTime();

for (User people : subList) {

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

if (people.getName().equals(mList.get(i).getName())) {

mList.remove(i);

}

}

}

Long s2 = new Date().getTime();

System.out.println("去重耗费了"+ (s2-s));//去重耗费了556

}

private static void quchongSet(ArrayList mList, ArrayList subList) {

Long s = new Date().getTime();

Set user1 = new TreeSet();

user1.addAll(mList);

user1.removeAll(subList);

Long s2 = new Date().getTime();

System.out.println("去重耗费了"+ (s2-s));//去重耗费了2

}

}

4.合理利用好集合的有序性 (sort) 和稳定性(order)

说明:稳定性指集合每次遍历的元素次序是一定的。有序性是指遍历的结果是按某种比较规则

依次排列的。如: ArrayList 是order / unsort;HashMap是unorder / unsort;TreeSet是

order / sort

5.java中的ListIterator和Iterator

(1)Iterator可以应用于所有的集合,Set、list和map这些集合的子类型,而ListIterator只能用于list及其子类型

(2)ListIterator有add方法,可以向List中添加对象,而Iterator不能

(3)ListIterator和Iterator都有hashNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法。可以逆向。

(4)ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能

(5)都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改

package mytest;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import java.util.ListIterator;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)

public class IteratorListTest {

@Test

public void test(){

// TODO Auto-generated method stub

List list = new LinkedList<>();

list.add("fengyw1");

list.add("fengyw2");

list.add("fengyw3");

ListIterator iter = list.listIterator();

String first = iter.next();

iter.remove(); //如果这里不删除也不添加,用set,结果一样

System.out.println("first:"+first);

iter.add("fengyw4");

//遍历List元素

System.out.println("遍历List中元素,方法一:");

for(String str : list)

System.out.println(str+"   ");

iter = list.listIterator();

System.out.println("遍历List中元素,方法二:");

while(iter.hasNext())

{

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

}

System.out.println("遍历List中元素,方法三:");

Iterator iterTor = list.iterator();

while(iterTor.hasNext()){

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

}

}

}

first:fengyw1

遍历List中元素,方法一:

fengyw4

fengyw2

fengyw3

遍历List中元素,方法二:

fengyw4

fengyw2

fengyw3

遍历List中元素,方法三:

fengyw4

fengyw2

fengyw3

6.ArraList中的iterator的理解

private class Itr implements Iterator {

int cursor;       // cursor表示下一个元素的索引位置

int lastRet = -1; // lastRet表示上一个元素的索引位置

int expectedModCount = modCount;//modCount用于记录ArrayList集合的修改次数

public boolean hasNext() {

return cursor != size;

}

@SuppressWarnings("unchecked")

public E next() {//获取当前元素

checkForComodification();

int i = cursor;

if (i >= size)

throw new NoSuchElementException();

Object[] elementData = ArrayList.this.elementData;

if (i >= elementData.length)

throw new ConcurrentModificationException();

cursor = i + 1;

return (E) elementData[lastRet = i];

}

public void remove() {

if (lastRet < 0)

throw new IllegalStateException();

checkForComodification();

try {

ArrayList.this.remove(lastRet);//调用了本身的remove方法

cursor = lastRet;

lastRet = -1;

expectedModCount = modCount;

} catch (IndexOutOfBoundsException ex) {

throw new ConcurrentModificationException();

}}

final void checkForComodification() {

if (modCount != expectedModCount)

throw new ConcurrentModificationException();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值