*面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

*数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象。

*集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

集合框架图

1、Collection (集合的最大接口)继承关系

  ——List 可以存放重复的内容

  ——Set  不能存放重复的内容,所以的重复内容靠hashCode()和equals()两个方法区分

  ——Queue  队列接口

  ——SortedSet  可以对集合中的数据进行排序

Collection定义了集合框架的共性功能。

1,添加

add(e);

addAll(collection);

2,删除

remove(e);

removeAll(collection);

clear();

3,判断。

contains(e);

isEmpty();

4,获取

iterator();

size();

5,获取交集。

retainAll();

6,集合变数组。

toArray();

*add方法的参数类型是Object。以便于接收任意类型对象。

*集合中存储的都是对象的引用(地址)

2、List的常用子类

List:

特有方法。凡是可以操作角标的方法都是该体系特有的方法。

add(index,element);

addAll(index,Collection);

remove(index);

set(index,element);

get(index):

subList(from,to);

listIterator();

int indexOf(obj):获取指定元素的位置。

ListIterator listIterator();

——ArrayList   线程不安全,查询速度快

——Vector  线程安全,但速度慢,已被ArrayList替代

——LinkedList  链表结果,增删速度快

4、Set接口

Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。

|——HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

  HashSet是如何保证元素唯一性的呢?

  是通过元素的两个方法,hashCode和equals来完成。

  如果元素的HashCode值相同,才会判断equals是否为true。

  如果元素的hashcode值不同,不会调用equals。

  注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

——TreeSet:

有序的存放:TreeSet  线程不安全,可以对Set集合中的元素进行排序

通过compareTo或者compare方法来保证元素的唯一性,元素以二叉树的形式存放。

5、Object类

*在实际开发中经常会碰到区分同一对象的问题,一个完整的类最好覆写Object类的hashCode()、equals()、toString()三个方法。

6、集合的输出

——4种常见的输出方式

  ——Iterator: 迭代输出,使用最多的输出方式

  ——ListIterator: Iterator的子接口,专门用于输出List中的内容

  ——Enumeration

  ——foreach

在迭代时,不可以通过集合对象的方法操作集合中的元素。

因为会发生ConcurrentModificationException异常。

所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,

只能对元素进行判断,取出,删除的操作,

如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

该接口只能通过List集合的listIterator方法获取。

7、Map接口

*Correction、Set、List接口都属于单值的操作,而Map中的每个元素都使用key——>value的形式存储在集合中。

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

1,添加。

put(K key, V value) 

putAll(Map<? extends K,? extends V> m)

2,删除。

clear() 

remove(Object key)

3,判断。

containsValue(Object value) 

containsKey(Object key) 

isEmpty()

4,获取。

get(Object key) 

size() 

values()

entrySet() 

keySet()

8、Map接口的常用子类

Map

|HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。

|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

9、集合工具类

Collections:集合框架的工具类。里面定义的都是静态方法。

Collections和Collection有什么区别?

Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。

它有两个常用的子接口,

List:对元素都有定义索引。有序的。可以重复元素。

Set:不可以重复元素。无序。

Collections是集合框架中的一个工具类。该类中的方法都是静态的

提供的方法中有可以对list集合进行排序,二分查找等方法。

通常常用的集合都是线程不安全的。因为要提高效率。

如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

 

Map遍历
方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet())
{      
     System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
} 

方法二 在for-each循环中遍历keys或values。
如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//遍历map中的键
for (Integer key : map.keySet()) { 
  System.out.println("Key = " + key);
}
//遍历map中的值
for (Integer value : map.values()) {  
   System.out.println("Value = " + value);
}

该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。
方法三使用Iterator遍历
使用泛型:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {  
   Map.Entry<Integer, Integer> entry = entries.next();  
   System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

你也可以在keySet和values上应用同样的方法。
该种方式看起来冗余却有其优点所在。首先,在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。
从性能方面看,该方法类同于for-each遍历(即方法二)的性能。
方法四、通过键找值遍历(效率低)

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) { 
   Integer value = map.get(key); 
   System.out.println("Key = " + key + ", Value = " + value);
}

作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的Map实现中该方法慢了20%~200%)。如果你安装了FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。 

 

 

 

List遍历

遍历List集合的三种方法

List<String> list = new ArrayList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

方法一:

超级for循环遍历

for(String attribute : list) {

  System.out.println(attribute);

}

方法二:

对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:

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

  system.out.println(list.get(i));

}

方法三:

集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代

Iterator it = list.iterator();

while(it.hasNext()) {

  System.ou.println(it.next);

}

 

 

JSON转化

fastJson对于json格式字符串的解析主要用到了一下三个类:

JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。

JSONObject:fastJson提供的json对象。

JSONArray:fastJson提供json数组对象。

 

 

Array数组和ArrayList互转

一、ArrayList转换为数组

ArrayList提供public <T> T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组,返回数组的运行时类型就是指定数组的运行时类型。

import java.util.ArrayList;

import java.util.List;

public class Test {  

    public static void main(String[] args) {  

        List<String> list=new ArrayList<String>();  

        list.add("a");  

        list.add("b");  

        list.add("c");  

        int size=list.size();  

        String[] array = (String[])list.toArray(new String[size]);  

        for(int i=0;i<array.length;i++){  

            System.out.println(array[i]);  

        }  

    }  

}

 

二、数组转换为List

2.1 其实数组转换成为List的问题,Arrays对象也提供给我们public static <T> List<T> asList(T... a)供我们调用。

import java.util.Arrays;  

import java.util.List;  

public class Test {  

    public static void main(String[] args) {  

        String[] array=new String[3];  

        array[0]="a";  

        array[1]="b";  

        array[2]="c";  

        List<String> list=Arrays.asList(array);  

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

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

        }  

    }  

}

JAVA中list,set,map与数组之间的转换详解

package test;

import java.util.*;

/**

 * Created by ming

 */

public class Test {

    public static void main(String[] args) {

        Set<Long> longSet=new HashSet<>();

        longSet.add(1L);

        longSet.add(2L);

        List<Long> longList=new ArrayList<>();

        longList.addAll(longSet);//set转list

        for(Long t : longList){

            System.out.println(t);

        }

        Set<Long> set2=new HashSet<>();

        set2.addAll(longList);//list转set

        for(Long s : set2){

            System.out.println(s);

        }

        Map<Long,Long> map=new HashMap<>();//list转map

        for(Long t : longList){

            map.put(t,t);

        }

        for(Long s : set2){//set转map

            System.out.println(s);

        }

 

        Collection<Long> collections= map.values();

        for (Long t : collections){

            System.out.println("map转集合"+t);

        }

 

        Long longs[]={2L,3L,4L};//定义一个数组

        List<Long> longList1 = Arrays.asList(longs);//数组转集合

        for(Long t : longList1){

            System.out.println("数组转集合"+t);

        }

 

       Long [] newLongs= longList1.toArray(new Long []{});

        System.out.println("集合转数组的方法:"+newLongs.length);

    }

}

 

posted on 2019-11-21 15:39  Youngkee_叔叔  阅读(594)  评论(0编辑  收藏  举报