Android java常见数据结构

StringBuffer、StringBuilder

  1. 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
  2. StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
  3. 由于 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包下,其中ArrayMapArraySet常见。

ArrayMapArraySet

数据类型需要声明,如<Object, Object>

在使用上与HashMapHashSet无异,所以也有相同特点,如Set不能存储相同value的的元素,因为Set无序,是根据value计算hashcode,如果相同且value1.equals(value2),则不予存储value2,而hashset的底层就是hashmap,所以同样不能存相同值。

但在效率上不同。Array是有序存储的,空间效率高时间效率低(数据量大时);Hash是无序存储的,空间效率低时间效率。(所以Android特有ArrayMapArraySet类型就是为了省空间

遍历方式

  • List类型遍历

形式区别

对于for循环:

forint i=0;i<arr.size();i++){...}

对于foreach:

forint 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);
  }
 }
}

 

posted @ 2022-03-22 09:30  小汀  阅读(88)  评论(0编辑  收藏  举报