集合类
1.List结构的集合类(ArrayList类、LinkedList类、Vector类、Stack类);Map结构的集合类(HashMap类、Hashtable类);Set结构的集合类(HashSet类、TreeSet类);Queue结构的集合(Queue接口)
2.List结构的集合类的常用方法
(1)ArrayList类
- 添加:add()可以添加一个对象或者是通过for循环,通过位置进行添加,若重复添加的是相同的数据,不会覆盖之前的数据
- 删除:remove()同样是可以直接删除一个对象,或通过在for循环中通过位置index删除
(2)LinkedList类
addFirst():表示把后添加的数据放在最前面
addLast():表示把数据放在最后面
(3)Vector类
(4)Stack类
(5)ArrayList和Vector的区别
- 相同点:都是java的集合类,都可以用来存放java对象
- 不同点:
a.同步性:Vector是同步的,线程安全,效率低。ArrayList是异步的,不是线程安全,效率高。
b.数据增长:从内部实现机制来讲ArrayList和Vector都是使用数组来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以,最后你获得的这个集合所占的空间总是比你实际需要的要大,所以如果你要在集合中保存大量的数据,那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
3.Map结构集合类
(1)HashMap:通过键值对对存储数据,若存储的数据key是相同的话,会用后面的替换前面的,不允许有相同的key同时存在
- 遍历:可以利用迭代器进行遍历(keySet,EntrySet效率高)
//创建一个HashMap对象
HashMap<String,Emp> hm=new HashMap<String,Emp>();
Emp emp1=new Emp("01","aa",1);
Emp emp2=new Emp("02","bb",2);
//将emp放入到hm
hm.put("01",emp1);
hm.put("02",emp2);
//如果你要查找编号是02
if(hm.containsKey("02")){
System.out.println("yes");
//如何取出
Emp emp=(Emp) hm.get("02");
System.out.println(emp.getName());
}else
System.out.println("no");
//遍历HashMap中所有的Key和value
//Iterator迭代
Iterator<HashMap.Entry<String,Emp>> it=hm.entrySet().iterator();
//hasNext返回一个boolean
while(it.hasNext()){
//取出key
HashMap.Entry<String,Emp> entry=(HashMap.Entry)it.next();
String empkey= entry.getKey();
Emp empvalue=(Emp)entry.getValue();
//String key=it.next().toString();
//通过key取出value
// Emp emp=(Emp) hm.get(key);
System.out.println(empkey+empvalue.getName());
}
//遍历HashMap中所有的Key和value
//Iterator迭代
Iterator it=hm.keySet().iterator();
//hasNext返回一个boolean
while(it.hasNext()){
//取出key
String key=it.next().toString();
//通过key取出value
Emp emp=(Emp) hm.get(key);
System.out.println(emp.getName());
}
- 查找:containsKey():通过key查找;containsValue():通过值查找
(2)Hashtable
(3)Hashtable和HashMap区别:
- 相同点:都是java的集合类,都可以用来存放java对象
- 不同点:
a.Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
b.同步性:Hashtable是同步的,这个类的一些方法保证了Hashtable中的对象是线程安全的。HashMap是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果不需要线程安全的集合,使用HashMap。
c.值:HashMap可以让你将控制作为一个表的条目的Key或value但是Hashtable是不能放入空值的(null)
4.总结:
- 如果要求线程安全:Vector、Hashtable
- 不要求线程安全:ArrayList、LinkedList、HashMap
- 要求键值对:HashMap、Hashtable
- 数据量很大,又要求线程安全考虑:Vector
泛型以及反射机制
1.泛型:本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法。
2.java反射机制:(在运行过程中,可以动态的获取所有信息(所有属性和方法)以及动态调用某个对象的方法的功能)
(1)Class cl=Class.forName("包名.类名");
(2)获取类对象之后就可以进行查看信息或调用方法等
获取构造方法Constructor 调用构造方法 newInstance
获取成员方法Method 调用成员方法invoke(object,实参)
获取成员变量Field 调用成员变量第一步是实例化一个student对象,然后利用set(对象,实参)
3.优点:类型安全;向后兼容;层次清晰;性能较高(用GJ(泛型java)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件)
4.泛型基本用途:
(1)集合中
(2)如果多个类共有某些方法,可以将这些类写入泛型类中,把不同的对象当做参数传入进去,调用即可,无需在各个类里面单独写。
异常
1.处理异常的方法:在发生异常的地方直接处理;将异常抛给调用者,让调用者处理
2.异常分类
(1)检查性异常:java.lang.Exception 程序正确,但因为外在的环境条件不满足引发
(2)运行期异常:java.lang.RuntimeException
(3)错误:java.lang.Error
3.异常处理
(1)try...catch
(2)finally 如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应的catch块,finally块将马上执行。一般说把需要关闭的资源【文件,连接,内存.....】
以下情形,finally块将不会被执行
- finally块中发生了异常;
- 程序所在线程死亡;
- 在前面的代码中用了System.exit();
- 关闭cpu。
(3)抛出异常,抛给调用者 throws
4.多个异常处理的规则