Android java常见数据结构
StringBuffer、StringBuilder
- 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
- StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
- 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
数据结构类型
Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:
- 枚举(Enumeration)
- 位集合(BitSet)
- 向量(Vector)向量类和传统数组非常相似,但是Vector的大小能根据需要动态的变化(x2),使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小。且是同步的可在多线程用。
- 栈(Stack)栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
- 字典(Dictionary)字典类是一个抽象类,它定义了键映射到值的数据结构。类似Map。
- 哈希表(Hashtable)根据值定义键。 Dictionary(字典) 类的子类,位于 java.util 包中。
- 属性(Properties)继承于 Hashtable,表示了一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。实际使用如:获取环境变量System.getProperties()。
常用集合框架–容器
ArrayList
该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。
HashMap
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
HashTable
HashTable是线程安全的,是同步变量。
HashSet
该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
Android其他的常用数据类型:android.util包下,其中ArrayMap
、ArraySet
常见。
ArrayMap
和ArraySet
此数据类型需要声明,如<Object, Object>
在使用上与HashMap
、HashSet无异,所以也有相同特点,如Set不能存储相同value的的元素,因为Set无序,是根据value计算hashcode,如果相同且value1.equals(value2),则不予存储value2,而hashset的底层就是hashmap,所以同样不能存相同值。
但在效率上不同。Array是有序存储的,空间效率高时间效率低(数据量大时);Hash是无序存储的,空间效率低时间效率。(所以Android特有ArrayMap
、ArraySet类型就是为了省空间
)
遍历方式
- List类型遍历
形式区别
对于for循环: for(int i=0;i<arr.size();i++){...} 对于foreach: for(int i:arr){...} (它底层也是使用iterator的) 对于迭代器: Iterator it = arr.iterator(); while(it.hasNext()){ object o =it.next(); ...}
用法差别
for一般可以用于简单的顺序集合,并且可以预测集合的大小;
foreach可以遍历任何集合或者数组,但是使用者需要知道遍历元素的类型。
iterator是最强大的,它可以随之修改元素内部的元素。可以在遍历的时刻用remove()!!!!我的意思是其他两个都不可以!!!
而且iterator不需要知道元素类型和元素大小,通过hasnext()判断是否遍历完所有元素。
而且在对范型的集合进行遍历的时候,iterator是不二的选择,就是因为不需要知道元素类型便可以遍历。
- Map类型遍历
import java.util.*; public class Test{ public static void main(String[] args) { Map map = new HashMap(); map.put(“1”, “value1”); map.put(“2”, “value2”); map.put(“3”, “value3”); //第一种:普遍使用,二次取值 System.out.println("通过Map.keySet遍历key和value:"); for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); } //第二种 System.out.println("通过Map.entrySet使用iterator遍历key和value:"); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } //第三种:推荐,尤其是容量大时 System.out.println("通过Map.entrySet遍历key和value"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } //第四种 System.out.println("通过Map.values()遍历所有的value,但不能遍历key"); for (String v : map.values()) { System.out.println("value= " + v); } } }
本文来自博客园,作者:小汀,转载请注明原文链接:https://www.cnblogs.com/1118zjg/p/16037889.html