您的位置:首页 > 编程语言 > Java开发

java集合和数组互相转换

2015-01-18 00:17 225 查看
// 抽时间多了解集合框架和数组,不能只要是数组就会写ArrayList,碰到键值对就是HashMap

// 每次用到集合,我们都要像小和尚念经般的熟悉下面内容:

a) List Set Map是集合体系中最主要的三个接口,List和Set继承自Collection接口,Map也属于集合系统,但是和Collection不同:

b) Set不允许重复,HashSet和TreeSet是两个主要的实现类,值不能重复是最大的特点:

c) List有序且允许元素重复,ArrayList,LinkedList和Vector是三个主要的实现类,ArrayList是线程不安全的,
Vector是线程安全的,这两个底层都是由数组实现的,LinkedList是线程安全的,底层通过链表来实现的;

d) Map 是键值对集合,其中Key是集合,key是不能重复的(HashCode函数和equals函数决定的),value可以重复,HashMap,TreeMap和
Hashtable是Map的三个组要实现类,
HashTable 是线程安全的,不能存储null值,
HashMap是线程不安全的,可以存储null值;

e) Hashtable的contains(Object),指的是是否包含value而不是key

// HashTable 和HashMap 之间还有些文章要做:[推荐使用HashMap而不是HashTable]

Hashtable和HashMap类有三个重要的不同之处,第一个不同主要是历史原因,Hashtable是基于陈旧的Dictionary类的,
HashMap是Java 1.2引进的Map接口的一个实现。
  
  也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的
行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法
就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象
来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断
Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
  
  第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的
key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一
个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。
  
  一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的
功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。
  
  关于Properties
  有时侯,你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一
些例子,如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简
单的方法,但Java提供了另外一种方法。
  
  Java.util.Properties类是Hashtable的一个子类,设计用于String keys和values。Properties对象的用法同Hashtable
的用法相象,但是类增加了两个节省时间的方法,你应该知道。
  
  Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反,用来读取文件,
并设定Properties对象来包含keys和values。
  
  注意,因为Properties扩展了Hashtable,你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。
另外,如果你将store()用于一个不包含String对象的Properties对象,store()将失败。作为put()和get()的替代,你应该
用setProperty()和getProperty(),它们用String参数。

// 数组拷贝的方法:
System.arraycopy
public static void arraycopy(Object src, int srcPos,Object dest,int destPos,int length)
Set set = new HashSet(Array.asList(array));

// 数组的浅拷贝与深拷贝:

// java中集合与数组之间的转化:
1) 采用集合.toArray() 方法,根据转化为数组的类型又可以分为:
转化为Object[] 类型数组
Object[] listArray = list.toArray();
Object[] setArray = set.toArray();

2) 转化为具体的数组:(参数为数组对象::)
String[] listArray = (String[])list.toArray(new String[0]);
String[] listArray = (String[])list.toArray(new String[list.size()]);
String[] setArray = (String[])set.toArray(new String[0]);
String[] setArray = (String[])set.toArray(new String[set.size()]);

3) 数组转化为集合 数组.asList()方法:
// 对于int[] 数组不能直接这样做,因为asList()方法的参数必须是对象
list = Arrays.asList(array);
// 使用list构造set
Set set = new HashSet(Array.asList(array));

4) 集合中赋值的方法
方法一:ArrayList<Integer> list2= new ArrayList<Integer>(list2);//利用集合自带的构造方法
方法二:ArrayList<Integer> num2 =(ArrayList<Integer>) list1.clone();//利用克隆的方法进行赋值
ArrayList list1=new ArrayList();
ArrayList list2=new ArrayList();
list1.addAll(list2);
boolean Collection<E>.addAll(Collection<? extends E> c)

5) 为了方便的对Array对象,Collection对象进行操作,Java中提供了Arrays类和Collections类对其进行操作。

其中Arrays和Collections中所有的方法都为静态的,以方便直接传入对象引用,执行相应的功能。
十分常用的方法有:
Arrays.asList(数组对象)  //此静态方法用于将Array转化为List类型对象。常常用于List类型对象的初始化中。
// 值得注意的是collection对象.addAll(list对象),注意此处是collection对象而非Collections类
Collection.addAll(Collection对象,数组对象或可变参数列表 ) //该静态方法用于向一个已经存在的Collection中拼接数据

6) Util.Collections工具类
static <T> boolean addAll(Collection<? super T> c, T... a)
// 要求目标集合已存有的元素数量多于源集合
static <T> void copy(List<? super T> dest, List<? extends T> src)
static <T extends Comparable<? super T>> void sort(List<T> list)

// String类实现 Comparable了接口
根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。

List<String> list1 = new ArrayList<String>();
Collections.addAll(list1, "5", "3", "2", "4");
Collections.sort(list1);<span style="white-space:pre">																																	</span>        // 查询出所有的配置项
       autoArchiveList = autoArchiveService.queryRequestType(new HashMap<String,Object>(), page);
     
        for (Map<String, Object> map : autoArchiveList)
        {
            for(Iterator<Map.Entry<String,Object>> ite = map.entrySet().iterator(); ite.hasNext();)
           {   
                Map.Entry<String,Object> entry = (Map.Entry<String,Object>) ite.next(); 
              
                if ("SERVICENAME".equalsIgnoreCase(entry.getKey()) && StringUtils.isEmpty((String)entry.getValue()))
                {
                    archiveList4Temp.add(map);
                }
            }  
        }
        
        // 如果非业务类别相关配置从autoArchiveList移除
        autoArchiveList.removeAll(archiveList4Temp);
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>
        if (dataSet != null )
        {
                Object value = null;
                Map<String, Object> voMap = null;
                for (; dataSet.next(); list.add(voMap))
                {
                    voMap = new HashMap<String, Object>();
                    List columnNames = dataSet.getColumnNames();
       
                    String columnName;
                    for (Iterator iterator = columnNames.iterator(); iterator.hasNext(); voMap.put(columnName, value))
                    {
                        columnName = (String)iterator.next();
                        value = dataSet.getObject(c
4000
olumnName);
                    }

                }
        }<span style="white-space:pre">	</span>
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>
<span style="white-space:pre">	</span>public Map<String, Object> bulidQueryData()
       {
        ActionContext aCtx = ActionContext.getContext();
        Map requestParamMap = aCtx.getParameters();
        Map<String, Object> queryMap = new HashMap<String, Object>();
        
        if (null == requestParamMap || requestParamMap.isEmpty()) 
        {
            return queryMap;
        }
        
        for (Iterator<Entry> it = requestParamMap.entrySet().iterator(); it.hasNext(); )
        {
             Entry entry = it.next();
             String[] value = (String[])entry.getValue();
             
             if ((null != value) && (value.length > 0))
             {
                queryMap.put((String)entry.getKey(), value[0].trim());
             }
        }
      
        return queryMap;
     }<span style="white-space:pre">	</span>
     // 注意格式,为每一行代码负责
     public String getDictValue(String id,String dataDictId)
     {
        List<Value> categoryList = UIDataProvider.getCategoryListFromDataDictId(dataDictId);
        for(Value category:categoryList)
        {
            if(category.getId().equals(id))
            {
                return category.getName();
            }
        }
    return "";
    }

    String SubLevel = getDictValue("1","QINGYUAN.HUAKE.EMP");

    if ((condition1 && condition2) || (condition3 && condition4) || !(condition5 && condition6)) 
    {
        doSomthingAoutIt();
    }

    alpha = (aLongBooleanExpression) ? beta : gamma;

    for (initialization; condition; update) 
    {
        statements;
    }

    设法让你的程序结构符合目的
    if (booleanException) { return true;else { return false;}
    应该代之以如下方法:return booleanException;
<span style="white-space:pre">	</span>
   类似地:
   if (condition) {return x;}return y;
    应该写为:return (condition ? x : y);

<span style="white-space:pre">																					</span>




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: