在某峰培训机构不知不觉已经一个半月了,飞快的时间里还有瀑布般下落的知识...能够从这里面接收到多少也是因人而遇。


今天是2016/8/20,星期六,打算这两天把java阶段里认为比较重要的知识点总结一下。这就是第一篇--集合。

ok,进入正题:

集合:

1.

集合与数组在使用的意义可以说是一样的,都是为了存储一种数据

而这种数据可以是基本数据类型,也可以是引用类型。

(基本数据类型(8种):byte,short,char,int,long,float,double,boolean)

(引用数据类型:引用,接口,数组,枚举...)





     2.

但数组在实际应用中经常会遇到长度不确定的情况,那么此时就不能够在使用数组了(数组的长度不可变,且在创建的时候要指明长度),

集合的出现能够很好的解决了这样的问题,动态的操作存储数据(增删改查)。

(插入知识点:在5.0的版本之前集合的元素都是object类型的,这样做的有点就是能够接受所有的类型,但也有个很致命的缺点:效率低,因为操作的过程中涉及太多的向上或向下转型了,还有因为适应的应用中人家在使用你的集合的时候很有可能不知道该集合存储的具体类型,所以经常出现类型转换异常(一般在向下转型的情况中出现ClassCaseExcption)),所以在5.0的版本中出现了:泛型,以及:包装类)




    3.

集合的分类(并列举一些常用的实现类):

a.Collection

1.List:(有序且可重复)

1.ArrayList(采用数组作为底层实现)

2.LinkedList(采用双链式结构作为底层实现)

2.Set:(无序且不可重复)(这里授课老师说这的元素是没有索引的,但我网上看过一些教学视频是说有索引的但是空间不连续,个人更偏向后者的说法)

1.HashSet

2.LinkedHashSet

3.TreeSet

b.Map

1.HashMap<Key,Value>(Key值是使用HashSet集合存储的,记得HashSet跟HashMap两者其实是相互调用彼此的一些方法的。)

2.TreeMap


*上面说的有序无序是指元素的添加顺序,而不可重复就要看你的具体怎么定义了。


*以上就是培训中教的所有集合了,不必把每种都学精,个人建议是每种都选一个深入点学,例如我选择:ArrayList,HashSet,HashMap,TreeMap这几个深入一点 学。以后使用集合的时候也就有优先使用这几个集合了。









4.

详解ArrayList:

既然ArrayList集合底层使用的数组实现,那么数组的一些优缺点也将会是ArrayList的优缺点。


使用ArrayList时效率问题:


1.数组扩容(最严重)

因为添加元素的时候集合会检查自身的长度是否足够容纳,如果不得话那么就会自动创建新的数组。解决的方法就是:适当的去预估你大致的元素数量,再去设置你集合的初始的长度,这是一个简单的调高集合效率的方法,还用就是在适当的时候使用trimSize()方法。

2.拆箱装箱

这只针对存储值类型的时候才引发的效率问题,因为添加和修改元素的时候会涉及到自动装箱和拆箱的操作

3.经常使用indexof,contains等方法

ArrayList集合其实就是一个动态的数组,内部也是通过循环的方法进行查找的。如果需要频繁执行这些方法可以考虑使用别的集合了。

*ArrayList 的方法动手查Api更好,但我想在提一下contains这个方法,他内部是使用equals方法来比较的,所以只需重写元素的equals方法即可。






5.从集合名找规律

有 Hash 字(如:HashSet,HashMap):

a.是通过哈希码来存储的,他判断两个元素是否相同分两个步骤:

1.--〉判断该对象的hash码是否一样,如果不一样则能够添加(每个对象的hash码都是唯一的,所以说如果不重写hashCode()方法那就...)

2.--〉如果一样,则来到第二个步骤,再调用元素对象的equals()方法进行比较是否比较。(equals()方法没冲写过就是直接比较栈的内容,所以不重写equals方法就...)


总结:遇到有hash字的集合就要想到重写hashCode方法,以及equals方法了。




有 Tree 字(例如:TreeSet,TreeMap):

b.tree是通过红黑二叉树的数据结构来存储的,不懂也不必去专研这个,接着往下看就好了。

tree 字涉及到元素顺序的问题,他在你添加元素的时候会与以存在的元素相比较再排序,

(插入个知识点:比较器接口(分两种)

1.顺序比较器:Comparable 自然顺序比较器,像String,包装类都会实现该接口。

步骤:泛型类要实现Comparable接口重写comparable方法(返回:正数升序,零相同,负数降序),使用集合的无参构造方法,

例如: TreeSet<Student> tree  = new TreeSet<Student>();这会默认调用自然顺序比较器

2.自定义比较器:Comparator自定义比较器,为那些没有实现自然顺序接口的准备的。上个代码吧————————:



public class TreeSet_Main2 {
	public static void main(String args[]){
<span >		</span>//自定义比较接口。使用了匿名内部类来实现。-1的意思就是降序
		Comparator<Student> compare = new Comparator<Student>() {
			@Override
			public int compare(Student o1, Student o2) {
				// TODO Auto-generated method stub
				return -1;
			}
		};
		TreeSet<Student> treeset = new TreeSet<Student>(compare);
		treeset.add(new Student("h",32,1));
		treeset.add(new Student("re",21,2));
		for(Student s:treeset){
			System.out.println(s);
		}
	}
}




6.集合的历遍

1.

集合的历遍有很多种方式,例如实现集合一般都有实现  Iterator  接口(迭代器),这主要就是用于历遍的吧:


例如:ArrayList集合的历遍方式:for循环(这应该是ArrayList独有的,因为他的底层使用数组实现的),增强for循环(底层就是用迭代器实现的),iterator迭代器。(下面只举例迭代器的用法)


接着以上的代码:

Iterator<Student> iterator = treeset.iterator();//获得迭代器对象
		while(iterator.hasNext()){//该处判断是为了防止在最后一次next()跳出界了。
			System.out.println(iterator.next());
		}

其他的集合历遍方式应该就是:增强for()循环,迭代器(Iterator)。

2.主要讲hashmap集合的集中遍历方式

***Map的历遍会复杂些***

HashMap:

public class HashMap_Main1 {
	public static void main(String args[]) {
		// HashMap<Student> hashmap = new HashMap<Student>();
		HashMap<Integer, Student> hashmap = new HashMap<Integer, Student>();
		hashmap.put(5, new Student("李昂", 33));// 如果键值不再在则添加,如果存在则修改。一般配合containsKey()方式使用。
		hashmap.put(2, new Student("杀手", 32));
		hashmap.put(2, new Student("约翰", 21));// 因为上面存在2的键值,所以起到的是修改功能
		hashmap.put(4, new Student("不冷", 12));
		// 遍历方式1,增强for循环(利用value()方法得到值得集合Collection,再使用增强for循环)
		Collection<Student> stu = hashmap.values();
		for (Student s : stu) {
			System.out.println("value1:" + s);
		}
		//遍历方式2,增强for循环(利用keySet()方法得到键的集合Set...注意不能嵌套使用增强for循环)
		Set<Integer> integers = hashmap.keySet();
		for(Integer i:integers){
			System.out.println("value2:"+hashmap.get(i));
		}
		//遍历方式3.迭代器(),(利用entrySet方法得到Set集合.再用这个对象生成迭代器对象)。这也是map特有的遍历方式
		Set<Entry<Integer,Student>> set = hashmap.entrySet();
		Iterator<Entry<Integer,Student>> iterator = set.iterator();
		while(iterator.hasNext()){
			Entry<Integer,Student> entry = iterator.next();
			System.out.println(entry.getKey()+";"+entry.getValue());
		}
	}
}

这篇就总结到这了,之后还会去写一些关于  

Thread线程  /  

servlet服务器  /  

http请求 /  

XML解析  /  

JSON解析  /

Socket网络编程 /  String    (看时间再决定)