------- android培训、java培训、期待与您交流! ----------
如何在java中存储大量数据?我们想到的是java的集合,也叫容器。集合类都是继承Collection接口的。所以我们首先分析Collection接口。Collection口中有很多方法,是其他类通用的,所以其他子框架一样!
//collection都有两个构造方法:1不带参数的。2带参数的且参数为另一个同类集合
public static void collectionDemo_1()
{
Collection<String> col = new ArrayList<String>();
//Collection<String> col2 = new ArrayList<String>(col);
col.add("hello");
col.add("java");//用于增加一个元素。
System.out.println(col.contains("java"));//用于测试是否包含该元素。
//下面的代码为toarray的用法:转化到一个数组中。
String[] str = new String[col.size()];
col.toArray(str);
for(String s:str)
System.out.println(s);
col.clear();//用于清空所有元素。
System.out.println(col.size());//size是测试集合的大小,返回个数!
}
那么还是有几点要说:1.为什么用Collection作为类型?这是面向接口编程,高手都是这么玩的,呵呵。面向接口可以方便后续程序的通用性。假如我要修改ArrayList为LinkedList那么只修该处即可。十分方便!2.这些方法都是通用的,其他的集合中都是可用的!
下面来了解各个详细的集合吧:
1ArrayList 那么先看一下demo:
public static void collectionDemo_2()
{
List<String> mylist = new ArrayList<String>();
mylist.add("i");
mylist.add("you");
mylist.add(1, "love");//这个方法有个重载,在index处添加element。
mylist.set(2, "her");//该方法所作用是去替换元素!
System.out.println(mylist.get(1));//得到元素!
System.out.println(mylist.indexOf("love"));//找出下标,
for(Iterator<String> it = mylist.iterator();it.hasNext();)
{
//it.remove();该方法可以移除取到元素!
System.out.println(it.next());
}
//在Collection中都有iterator但是list接口下有ListIterator。以实现add和set
for(ListIterator<String> it = mylist.listIterator();it.hasNext();)
{
it.next();
it.set("haha");
}
System.out.println(mylist);
}
依旧是代码中告诉我们应该怎么用ArrayList,其实相比较一下与Collection的区别,就是多了一个get,set的方法,细想一下为什么呢?其是ArrayList的底层结构就是数组,快捷的访问与修改,那么必然会有set与get了。增加了方便性!
另一点就是在Iterator了。list接口下增加了ListIterator。其中可以有set,add,和remove方便了程序的书写!
2LinkedList的方法没有什么特殊的,就是多了几个首尾元素的操作方法!
public static void collectionDemo_3()
{
LinkedList<String> mylist = new LinkedList<String>();
mylist.add("shit");
mylist.add("shut");
mylist.add("up");
mylist.addFirst("lin");//以前的方法在链表首尾增加元素!
mylist.addLast("!");
mylist.removeFirst();//以前的方法在链表的首尾删除元素!
mylist.removeLast();
System.out.println(mylist.getFirst());
System.out.println(mylist.getLast());
//新的一些方法
String str = mylist.peek();
String str1 = mylist.peekFirst();//获取list的首尾元素,但不删除。
String str2 = mylist.peekLast();//唯一的区别是当list为空时返回null!
String mystr = mylist.pollFirst();//获取并移除该元素!
String mystr1 = mylist.pollLast();
for(Iterator<String> it = mylist.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
LinkedList的方法中,体现出了他的底层结构的特点:链表的操作,主要是对首尾元素的操作,因为要作为栈和队列的体现。那么如果要在首尾添加元素用:addFirst和addLast。删除用:removeFrist和rermoveLast。要取出元素时候用:peekFrist和peekLast。或者pollFrist和polllast唯一的区别就是,你是取出该元素的时候是否要删除该元素!
3Vector是一个不常用的东东,但他有一个特殊的迭代器:枚举迭代器Enumeration
public static void collectionDemo_4()
{
Vector<String> v = new Vector<String>();
v.add("this");
v.add("is");
v.add("vector");
for(Enumeration<String> en = v.elements();en.hasMoreElements();)
{
System.out.println(en.nextElement());
}
}
vector的enumeration迭代和iterator一样。
上面就是几个重要的list接口下的类ArrayList呢是不同步的。Vector是同步的。数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 。
4hashSet
public static void collectionDemo_5()
{
HashSet<person> hc = new HashSet<person>();
hc.add(new person("lisi",33));
hc.add(new person("wangwu",22));
hc.add(new person("zhaoliu",11));
for(Iterator<person> it = hc.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
}
class person
{
private String name;
private int age;
person(String name,int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return name+""+age;
}
public int hashCode()
{
return 60*age;
}
public boolean equals(Object obj)
{
person p = (person)obj;
if(p.name.equals(name)&&(p.age == age) )
return true;
else return false;
}
}
关于HashSet没有什么特殊的东西,就是set的作用是哈希表为底层的,他主要就是不可以存储同一个元素或者对象!所以一个对象进入检查时,要首先看他的hashcode,然后再比较equals方法。关于覆盖不覆盖就要看你的代码了。随机应变!
5.TreeSet也是有set集合来的,所以哟加入了主要是排序功能!
我们扩展一下刚才的person让他继承implments comparable接口那么就可以比较两个对象了,而且comparable接口也是作为TreeSet集合传入的必要接口!所以在实现compareTo(Object o)
public int compareTo(Object o) {
person p = (person)o;
if(p.age > age)
return 1;
else if (p.age == age)
return 0;
else
return -1;
}
所以有了TreeSet的demopublic static void collectionDemo_6()
{
TreeSet<person> ts = new TreeSet<person>(new mycompare());
ts.add(new person("zhansannn",11));
ts.add(new person("lisi",22));
ts.add(new person("wangwu",14));
ts.add(new person("zhaoliu",18));
for(Iterator<person> it = ts.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
作为上面的方法,重要的是结论,在会用你的compareTo的方法比较对象。所以会有按年龄排序。那么又有了一个需求,如果你的类不让你implments但是你又要进行比较器compartor的使用!也就是说你要有一个比较器类,implments compartor接口。所以覆盖compare(Object
o1,ObjectO2)
class mycompare implements Comparator
{
@Override
public int compare(Object o1, Object o2) {
person p1 = (person)o1;
person p2 = (person)o2;
if(p1.name.length() > p2.name.length())
return 1;
else if(p1.name.length() < p2.name.length())
return -1;
else return 0;
}
}
所以关键是排序问题的话,你就可以用TreeSet集合了!所以到目前为止,你要了解结合的每个作用,然后再活学活用!
6.Map的主要是HashMap,HashTable,TreeMap为重点其中:
HashMap:哈希表数据结构,为同步的,不允许存储null的键值对。
HashTable:哈希表数据结构,为不同步的,允许存储null的键值对。
TreeMap:二叉树数据结构,线程不同步,可以给map中的键排序。
public static void collectionDemo_7()
{
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("en", "11");//map中特有的添加方法。
hm.put("cn", "33");
hm.put("kt", "22");
System.out.println(hm.containsKey("cn"));//是否包含该键
System.out.println(hm.get("en"));//通过键的来获取值。
System.out.println(hm.values());//获取所有的值得映射表
hm.clear();//清空,清空一个用remove
System.out.println(hm.size());//获取键值对的个数
}
但是我们始终没有迭代器来迭代,于是我们看到Set keySet();返回一个存储键的Set集合。于是
Set<String> s = hm.keySet();
for(Iterator<String> it = s.iterator();it.hasNext();)
{
System.out.println(it.next());
}
通过Set遍历,你还可以在里面通过get()来获取值;所以keyset可以满足你的需要!
另外Map集合还提供了entrySet来提供全部逻辑映射的访问!
public static void collectionDemo_8()
{
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("en", "11");//map中特有的添加方法。
hm.put("cn", "33");
hm.put("kt", "22");
Set<Map.Entry<String, String>> ens = hm.entrySet();
for(Iterator<Map.Entry<String, String>> it = ens.iterator();it.hasNext();)
{
Map.Entry<String, String> s = it.next();
System.out.println(s.getValue()+"----"+s.getKey());
}
}
由于返回值为Map.Entry<k,v>的对象所以,你必须去用getKey和getValue才能获得键值对!
上述就是集合类的东西,要活学活用!
------- android培训、java培训、期待与您交流! ----------