java集合类

1.Collection,Map层次图

2.Collection接口

list

存放有序且允许重复的集合的接口  这里的有序是指存入顺序和取出顺序相同。子类有:{ ArrayList,LinkedList}   
ArrayList: 是通过数组结构实现的List集合 (通过索引值快速取出数据) 删除,插入慢,可使用for语句遍历
     public Object get(int index)           返回列表中指定位置的元素
    public void add(int index, Object element)   在列表的指定位置插入指定元素.将当前处于该位置的元素(如果有的话)和所有后续元素向右移动
     public Object set(int index, Object element) 用指定元素替换列表中指定位置的元素,返回替换出来的元素
     public Object remove(int index)         移除列表中指定位置的元素
     List subList(int fromIndex, int toIndex)     返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
     int indexOf(Object o)             返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 LinkedList: 是通过使用双向链表实现的List集合(毫无疑问,LinkedList对于频繁的插入删除有着较好的效率,
       适合实现栈(Stack)和队列(Queue)。可使用for语句遍历   void addFirst(E e)    将指定元素插入此双端队列的开头。
   void addLast(E e)      将指定元素添加到此列表的结尾。等效于add(E e)
  E getFirst()         返回此列表的第一个元素,等效于element(),只看不动.
  E getLast()         返回此列表的最后一个元素。只看不动. set
存放无序且不包含重复元素的集合的接口。子类:{HashSet SorterSet}实现类:{ LinkedHashSet, TreeSet} 

LinkHashSet:

  根据元素的哈希码进行存放,同时用链表记录元素的加入顺序。 不能使用for语句遍历,可以使用foreach,Iterator
TreeSet:
 TreeSet使用红黑树结构对加入的元素进行排序存放,输出时也会按排序后的顺序,所以放入TreeSet中元素必须是”可排序的”
两个对象判断是否重复是通过HashCode和equals 比较的。TreeSet不能使用for语句遍历,可以使用foreach,Iterator
Collection代码实现

遍历:
        Collection <String>collection1=new ArrayList();
collection1.add("1");
collection1.add("1");
Iterator<String> iterator=collection1.iterator();
while (iterator.hasNext())
Log.d(TAG, "onCreate:collection1:: "+iterator.next());

集合对象排序:

(1) 排序对象实现Comparable接口重写方法compareTo

public class Person2  implements Comparable<Person2>{

    public String name;
public int age; public Person2(String name, int age) {
this.name = name;
this.age = age;
} @Override
public int compareTo(@NonNull Person2 o) {
return this.age-o.age;
}
}
     List<Person2> list=new ArrayList<>();
list.add(new Person2("gxw",23));
list.add(new Person2("gxw2",25));
list.add(new Person2("gxw4",22));
Collections.sort(list);
for(Person2 person2:list){
Log.d(TAG, "onCreate: Person2::"+person2.name+"**"+person2.age); }

(2) 创建一个比较器,实现ava.util.Comparator接口,重写compare方法

public class Comparator<E> implements java.util.Comparator<Person3> {
@Override
public int compare(Person3 o1, Person3 o2) {
/**
* 先比较name,再比较age
*/
int flag= o1.getName().compareTo(o2.getName());
if(flag==0){
return o1.getAge()-o2.getAge();
}else{
return flag;
} }
}
public class Person3  {
public String name;
public int age; public Person3(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public int getAge() {
return age;
} @Override
public String toString() {
return "Person3{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
     List<Person3> list2=new ArrayList<>();
list2.add(new Person3("gxw",23));
list2.add(new Person3("gxw",24));
list2.add(new Person3("gxw",25));
list2.add(new Person3("gxc",23));
list2.add(new Person3("gxe",23));
list2.add(new Person3("gxy",24));
list2.add(new Person3("gxa",25));
list2.add(new Person3("gxz",25));
Comparator<Person3> comparator=new Comparator<Person3>();
Collections.sort(list2,comparator); for(Person3 person3:list2){
Log.d(TAG, "onCreate: Person3::"+person3.toString());
}

Map接口

Map实现类中存储的“键-值”映射对是通过键来唯一标识。
V   put(K key, V value)               将指定的"键-值"对存入Map中
V get(Object key);    返回指定键所映射的值
V remove(Object key);  根据指定的键把此"键-值"对从Map中移除。
boolean containsKey(Object key); 判断此Map是否包含指定键的"键-值"对。
boolean containsValue(Object value); 判断此Map是否包含指定值的"键-值"对。
int size();  获得些Map中"键-值"对的数量。
Set<K> keySet();   返回此Map中包含的键的Set集。
Collection<V> values();  返回此Map中包含的值的Collection集。值是可重复的.
对于Map接口来说,其本身是不能直接使用迭代进行输出的,因为Map中的每一个位置存放的是一对值(keyvalue),
而Iterator中每次只能找到一个值。所以如果非要使用迭代进行输出的话,要按照以下操作步骤完成:
1.将Map的实例通过entrySet()方法变为Set接口对象
2.通过Set接口的实例的iterator() 将Iterator实例化
3.通过Iterator迭代输出,每个内容都是Map.Entry的对象
4.通过Map.Entry进行keyvalue的分离。getKey,getValue
HashMap:
  HashMap中的映射对的"键"如果是自定义的类,应该重写hashCode()和equals()方法。
  Hashtable 
  是同步的(线程安全的);
  不能有null键,也不能有null值,否则运行时出空指针异常;
  基于陈旧的Dictionary<K,V>类 ,有contains() 方法,用于测试此映射表中是否存在指定值,等同于HashMap类中的containsValue()   HashMap
  是不同步的(线程非安全的);
  能存储最多一个null键,任意多个null值;
  有containsKey(),containsValue()方法,没有contains() 方法
  继承AbstractMap<K,V>
TreeMap:
  TreeMap内部使用红黑树结构对"key"进行排序存放,所以放入TreeMap中的"key-value"对的"key"必须是"可排序"的。
  TreeMap()使用键的自然顺序构造一个新的、空的树映射。
  TreeMap(Comparator<? super K>  comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。
Map代码实现

遍历:

(1)遍历key-Vaule值
     HashMap<String,String> map=new HashMap<String,String>();
map.put("key1","value2");
map.put("key2","value1");
map.put("key4","value4");
map.put("key3","value3");
Iterator<Map.Entry<String,String>>it=map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry1 = it.next();
Log.d(TAG, "onCreate: Map::entry"+entry1.getKey()+"*"+entry1.getValue());
}
(2)keySet遍历key值
       Set<String> set1=map.keySet();
Iterator<String> it2=set1.iterator();
while (it2.hasNext())
Log.d(TAG, "onCreate: KeySet::"+it2.next());

(3)遍历Value值

        for(String s:map.values()){
Log.d(TAG, "onCreate: MapValue::"+s);
}

(4)遍历key_Value

     for(Map.Entry<String,String> entry3:map.entrySet()){

            Log.d(TAG, "onCreate: Map3:::"+entry3.getKey()+"*"+entry3.getValue());
}
Map排序

key值排序:
     TreeMap<PersonMap,String> map2=new TreeMap<>();
map2.put(new PersonMap("gxw",23),"222");
map2.put(new PersonMap("gxw2",23),"322");
map2.put(new PersonMap("gxw3",24),"332");
map2.put(new PersonMap("gxw",24),"342");
map2.put(new PersonMap("gxwr",23),"3424");
for(Map.Entry<PersonMap,String> en:map2.entrySet()){
Map.Entry<PersonMap,String> it3=en;
Log.d(TAG, "onCreate: Map210:"+it3.getKey().toString()+"*"+it3.getValue());
}
public class PersonMap  implements Comparable<PersonMap>{

    String name;
int age; public PersonMap(String name, int age) {
this.name = name;
this.age = age;
} @Override
public int compareTo(@NonNull PersonMap o) {
int flag=this.age-o.age;
if(flag==0){
return this.name.compareTo(o.name);
}else{ }
return flag;
} @Override
public String toString() {
return "PersonMap{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Value排序
        TreeMap<PersonMap,String> map3=new TreeMap<>();
map3.put(new PersonMap("gxw",23),"222");
map3.put(new PersonMap("gxw2",23),"322");
map3.put(new PersonMap("gxw3",24),"332");
map3.put(new PersonMap("gxw",24),"342");
map3.put(new PersonMap("gxwr",23),"3424");
List<Map.Entry<PersonMap,String>>list3=new ArrayList<>(map3.entrySet()); MapComapreble ma=new MapComapreble();
Collections.sort(list3,ma);
for (Map.Entry<PersonMap,String> keyss:list3)
Log.d(TAG, "onCreate: Value230:::"+keyss.getKey().toString()+"**"+keyss.getValue());
public class MapComapreble implements java.util.Comparator<Map.Entry<PersonMap,String>>  {

    @Override
public int compare(Map.Entry<PersonMap, String> o1, Map.Entry<PersonMap, String> o2) {
return o1.getValue().compareTo(o2.getValue());
} }

小结:

Set: 无序,无下标,不能随机访问,不可重复
List:有序,有下标,可以随机访问,可重复
Map:"key-value"对,较多存放和查询,较少遍历
HashMap-读写两者都较高
ArrayList-读(指定下标随机访问)快,插入/删除元素慢
LinkedList-读(指定下标随机访问)慢,插入/删除元素快


 
 
 
 

Java 集合类的细节的更多相关文章

  1. Java集合详解8:Java集合类细节精讲

    今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http://cmsblogs.com/?cat=5 具体 ...

  2. Java集合详解8:Java集合类细节精讲,细节决定成败

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  3. 摘抄转载前辈们的Java集合类总结

    本文摘自 Blue Sky:http://www.cnblogs.com/hubcarl JAVA 集合类介绍和使用 类关系示意图Iterable(接口) │ └--Collection (接口) ├ ...

  4. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...

  5. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

  6. Java集合类: Set、List、Map、Queue使用

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  7. 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理

    本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...

  8. 一招破解 Java 集合类面试题

    今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...

  9. Java集合类: Set、List、Map、Queue使用场景

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

随机推荐

  1. C#中跨线程访问控件

    net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ...

  2. profibus

    在研究profibus之前先提出问题,带着问题查看 profibus跟硬件无关?只是软件上的协议复杂? profibus和modbus的区别? 解读: profibus跟硬件关系不大,profibus ...

  3. C语言break/continue/exit/return的功能区别

    break是跳出整个循环而执行循环体之外的下一条语句: continue只是跳出本次循环继续判断下一次循环条件是否满足. exit() 结束当前进程/当前程式/,在整个程式中,只要调用 exit ,就 ...

  4. ubuntu18.0安装redis

    ubuntu版本:Ubuntu-Server 10.04.1 LTS redis版本:4.0.9 安装 使用apt安装 sudo apt-get update sudo apt-get install ...

  5. node——模块化

    之前写的新闻部分几乎所有操作都写在了一起,这次开始进行模块化. 为什么要模块化: 1.提高开发效率,所有操作在一个文件内,不方便团队操作,模块化可多人同时操作 2.当程序出错,可以分模块寻找错误 3. ...

  6. vue学习笔记——脚手架安装

    项目启动:npm run build 脚手架 vue cli vue cli --2 安装命令 #全局安装 npm install --global vue-cli #卸载vue-cli  npm u ...

  7. php 常用header

    //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...

  8. FFMpeg 常用命令格式转换,视频合成

    FFmpeg都是命令行的,用起来肯定不方便.但是,这对技术宅应该不成问题.下面,我就罗列一些比较实用的使用方法吧. FFmpeg的下载与安装 FFmpeg是开源的.但我们不必去下载它的源代码.下载已经 ...

  9. PHP算法之判断是否是质数

    质数的定义 质数又称素数.一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数:否则称为合数. 实现思路 循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能 ...

  10. android AndroidManifest.xml 属性详细解析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...