在Android开发中我们经常需要对数据进行分类和操作,对于轻量级的数据存储我们可能不需要动用SQLite或效率以及类库不完善的XML,
由于 SharedPreferences不具备数据枚举方法,如果仅仅是一个String或Int数组可以通过一个标记分割设计外,
我们还是主要来看看 Android或者说Java提供的基础数据类型辅助类ArrayList LinkedList Set HashMap的介绍,
如果你熟悉C++的STL或Boost库可以略过本文。
在Java中提供了Collection和Map接口。
其中List和Set继承了Collection接口;
同时用Vector、ArrayList、 LinkedList三个类实现List接口,HashSet、TreeSet实现Set接口。
直接有HashTable、HashMap、 TreeMap实现Map接口。
Vector基于Array的List,性能也就不可能超越Array,并且Vector是“sychronized”的,这个也是Vector和 ArrayList的唯一的区别。
ArrayList:同Vector一样是一个基于Array的,但是不同的是ArrayList不是同步的。
所以在性能上要比Vector优越一些。 Android123提示大家适用于顺序性的查找
LinkedList:不同于前面两种List,它不是基于Array的,作为链表数据结构方式,所以不受Array性能的限制。
当对 LinkedList做添加,删除动作的时候只要更改nextNode的相关信息就可以实现了所以它适合于进行频繁进行插入和删除操作。
这就是 LinkedList的优势,当然对于元素的位置获取等方面就逊色很多。
List:
1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。
List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。
HashSet:HashSet的存储方式是把HashMap中的Key作为Set的对应存储项,HashMap的key是不能有重复的。
HashSet 能快速定位一个元素,但是放到HashSet中的对象需要实现hashCode()方法0。
TreeSet:将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的。
TreeSet不同于HashSet的根本是TreeSet是有序的。它是通过SortedMap来实现的。
Set总结:
1. Set实现的基础是Map(HashMap);
2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象,不能包含两个元素e1、e2(e1.equals(e2))。
Map是一种把键对象和值对象进行关联的容器,Map有两种比较常用的实现: HashTable、HashMap和TreeMap。
HashMap也用到了哈希码的算法,以便快速查找一个键,
TreeMap则是对键按序存放,因此它有一些扩展的方法,比如firstKey(),lastKey()等。
HashMap和Hashtable的区别。
HashMap允许空(null)键(key)或值(value),由于非线程安全,效率上可能高于Hashtable。
Hashtable不允许空(null)键(key)或值(value)。
有关更多实用的Android开发技巧我们将在后面的文章中着重介绍
android arraylist 研究共享
发现android的arraylist非常有用!虽然以前有了解过,但感觉对clear(),remove()理解还是不够清楚
所以特别自己写了一遍文章,希望加深自己的了解,顺便给大家分享下!
希望对那些对arraylist不够了解和上述三个函数的执行效果不够了解的人有点帮助
经过我的研究的出的结论
(先给出结论的原因是我写的不是很好,所以大家看到结论觉得没问题的话
后面的过程可以忽略android <wbr>arraylist <wbr>研究共享)
clear()函数执行后,会清除arraylist的所有内容,使其的size()变为0;
remove(int i)执行后,会清除arraylist中(0,1,2,3.。。)中的i的值!
而i后面的地址会自动减一! 而size同样减少1!
首先给出几个常用的函数!意思非常容易理解,所以就不解释了!
clear()
get(int i)
size()
remove(int i);
我以arraylist<point>为例!
首先建立一个arraylist!
public class MainActivity extends Activity {
private ArrayList<Point> points=new ArrayList<Point>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//构建arrylist
for (int i = 0; i < 5; i++) {
points.add(new Point(i,i));
}
//输出arrylist
for (int i = 0; i < points.size(); i++) {
System.out.println(points.get(i).x+" "+points.get(i).y);
}
}
}
这时程序必定输出一个0,0, 1,1 2,2 3,3 4,4
这时我们在输出arraylist前加上一句
points.clear();
system.out.println(points.size());
会发现屏幕只输出一个0!!!!!!!!!!(一开始我的理解也是arraylist.clear()只是清除最后一个point)
说明arraylist.clear()函数清除的是整个arraylist!
接着,我们再将points.clear()改为points.remove(1);
输出 4(arraylist的长度)
0,0 2,2 3,3 4,4
相信不用解释了吧
android小知识:ArrayList和数组之间的转换
android string import list class arrays
List----->数组
开发中不免碰到List与数组类型之间的相互转换,举一个简单的例子:
package test.test1;
import java.util.ArrayList;
import java.util.List;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
List list=new ArrayList();
list.add("王利虎");
list.add("张三");
list.add("李四");
int size=list.size();
String[] array=new String[size];
for(int i=0;i<list.size();i++){
array[i]=(String)list.get(i);
}
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
}
正如上面所列举的,当要将ArrayList类型的数据转换为String[]的时候,
必须对List类型进行遍历,其实没有这种必要,List提供给我们一个很好的方法解决List转换成为数组的问题,不防再看一个例子:
package test.test1;
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("王利虎");
list.add("张三");
list.add("李四");
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]);
}
}
}
你是否发现这才是你想要的呢?其实很简单,ArrayList提供public <T> T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组;
返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。
否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。
如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。
这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。
数组--->List
那么又怎么将数组转换成为List呢?不防再看一个小小的例子,如下所示:
package test.test1;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
String[] array=new String[3];
array[0]="王利虎";
array[1]="张三";
array[2]="李四";
List<String> list=new ArrayList<String>();
for(int i=0;i<array.length;i++){
list.add(array[i]);
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
你是不发现很费事啊?其实数组转换成为List的问题Arrays对象也提供给我们public static <T> List<T> asList(T... a)供我们调用, 试运行下面的例子:
package test.test1;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
String[] array=new String[3];
array[0]="王利虎";
array[1]="张三";
array[2]="李四";
List<String> list=Arrays.asList(array);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
简单吧,asList方法返回一个受指定数组支持的固定大小的列表,
此方法同 Collection.toArray 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。
返回的列表是可序列化的,并且实现了 RandomAccess。
除此之外, 此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:
package test.test1;
import java.util.Arrays;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
List<String> list = Arrays.asList("王利虎","张三","李四");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
来源:oschina
链接:https://my.oschina.net/u/2320057/blog/638300