JAVA按以下重要顺序
· 面向对象
· 类集框架
· JDBC
· 文件编程
· 面向对象
· 类集框架
· JDBC
· 文件编程
本季目标
主要讲解以下的内容:
· Collection
· List
· Set
· Map
· Iterator
· ListIteator
· Enumeration
· for…each语句(JDK 1.5的新特性)
· Comparable接口
· 二叉树
· Collection
· List
· Set
· Map
· Iterator
· ListIteator
· Enumeration
· for…each语句(JDK 1.5的新特性)
· Comparable接口
· 二叉树
1、类集结构
(1)类集的产生目的
类集简单来讲就是一个动态的对象数组,此对象数组可以改变大小,可以任意的实现对象的增加、删除、输出。所有的类集存放java.util包中。
(2)类集的划分
1、存放单值:Collection
2、存放一对值:Map
3、输出:Iterator
1、存放单值:Collection
2、存放一对值:Map
3、输出:Iterator
(3)类集的具体概念
<1>Collection(只能存放一个值)
|- 主要功能:用于输出使用
|- 子接口:List(允许有重复的元素,而且加入的顺序就是输出的顺序)
|- 子类:ArrayList,是在Java 2之后推出的,是新的类,是使用异步处理方式,其性能较高
|- 子类:Vector,是在JDK 1.0的时候就推出,因为是旧的类,有很多List所没有的功能,是使用同步处理方式,其线程安全性较高,会比较慢。使用Vector除了可以使用Iterator输出之外,也可以使用Enumeration进行输出。两者是通用的。Vector子类允许直接使用 addElement(Object obj),也是可以向集合中加入元素的。
|- 自己新增的方法:
|- 取每一个对象: public Object get(int ind) ;
|- 子类:Stack(栈)
|- 子接口:Set(不允许有重复元素,重复元素会替换)?如何可以区分重复元素呢?
|- 子类:HashSet:是无序列存放
|- 子类:TreeSet:有序存放,是通过Comparable接口完成的
|- 常用方法:
|- 增加一个对象: public boolean add(Object obj)
|- 取得类集的长度: public int size() ;
|- 判断集合中的内容是否为空: public boolean isEmpty()
|- 删除一个对象: public boolean remove(Object obj) :就必须牵扯到对象的比较状态。
|- 实例化Iterator对象: public Iterator iterator() ;
<2>JDK 1.5提供了一个方便的输出操作:for…each语句。
<3>Iterator接口输出是最常见的
|- 常用方法
|- public boolean hasNext():判断是否有下一个元素
|- public Object next():取出下一个元素
|- 子接口:ListIterator,可以进行双向输出,只对于List接口有用
|- 常用方法:具备了Iterator接口中的全部内容
|- public boolean hasPrevious()
|- public Object previous()
<4>Enumeration(在1.5之后也加入、泛型支持哈~)
|- 常用方法:
|- 判断是否有下一个元素: public boolean hasMoreElements()
|- 取出元素: public Object element()
5、 Map(存放一对值)
|- 功能:与Collection的功能不一样,Map的主要功能是用于查找使用的。
|- 注意点:
|- 使用Map操作时,不能直接使用Iterator进行输出。
|- 而且里面不能有重复key。
|- 如果非要使用Iterator进行输出,则必须按以下的步骤进行操作:
|- Map --> Set --> Iterator --> Map.Entry --> key与value的分离
|- 常用子类:
|- HashMap:无序存放,是新的类,是JDK 1.2时推出的,是异步处理,性能较高
|- Hashtable:是旧的类,是JDK 1.0时推出的,是线程安全的,性能较低
|- Properties(重点):属性文件操作类
|- TreeMap:有序存放
|- 常用方法:
|- 向集合中保存数据: public Object put(Object key,Object value):返回的是value
|- 从集合中查找数据: public Object get(Object key):根据key查找。
|- 将Map数据变为Set实例: Set<Map.Entry<K,V>> entrySet()
|- 将全部的key变为set实例: Set<K> keySet()
|- 将全部的vlaue变为Collection接口实例: Collection<V> values()
|- Map.Entry:保存key与value
|- public Object getKey()
|- public Object getValue()
|- 存放key的注意点:
<1>Collection(只能存放一个值)
|- 主要功能:用于输出使用
|- 子接口:List(允许有重复的元素,而且加入的顺序就是输出的顺序)
|- 子类:ArrayList,是在Java 2之后推出的,是新的类,是使用异步处理方式,其性能较高
|- 子类:Vector,是在JDK 1.0的时候就推出,因为是旧的类,有很多List所没有的功能,是使用同步处理方式,其线程安全性较高,会比较慢。使用Vector除了可以使用Iterator输出之外,也可以使用Enumeration进行输出。两者是通用的。Vector子类允许直接使用 addElement(Object obj),也是可以向集合中加入元素的。
|- 自己新增的方法:
|- 取每一个对象: public Object get(int ind) ;
|- 子类:Stack(栈)
|- 子接口:Set(不允许有重复元素,重复元素会替换)?如何可以区分重复元素呢?
|- 子类:HashSet:是无序列存放
|- 子类:TreeSet:有序存放,是通过Comparable接口完成的
|- 常用方法:
|- 增加一个对象: public boolean add(Object obj)
|- 取得类集的长度: public int size() ;
|- 判断集合中的内容是否为空: public boolean isEmpty()
|- 删除一个对象: public boolean remove(Object obj) :就必须牵扯到对象的比较状态。
|- 实例化Iterator对象: public Iterator iterator() ;
<2>JDK 1.5提供了一个方便的输出操作:for…each语句。
<3>Iterator接口输出是最常见的
|- 常用方法
|- public boolean hasNext():判断是否有下一个元素
|- public Object next():取出下一个元素
|- 子接口:ListIterator,可以进行双向输出,只对于List接口有用
|- 常用方法:具备了Iterator接口中的全部内容
|- public boolean hasPrevious()
|- public Object previous()
<4>Enumeration(在1.5之后也加入、泛型支持哈~)
|- 常用方法:
|- 判断是否有下一个元素: public boolean hasMoreElements()
|- 取出元素: public Object element()
5、 Map(存放一对值)
|- 功能:与Collection的功能不一样,Map的主要功能是用于查找使用的。
|- 注意点:
|- 使用Map操作时,不能直接使用Iterator进行输出。
|- 而且里面不能有重复key。
|- 如果非要使用Iterator进行输出,则必须按以下的步骤进行操作:
|- Map --> Set --> Iterator --> Map.Entry --> key与value的分离
|- 常用子类:
|- HashMap:无序存放,是新的类,是JDK 1.2时推出的,是异步处理,性能较高
|- Hashtable:是旧的类,是JDK 1.0时推出的,是线程安全的,性能较低
|- Properties(重点):属性文件操作类
|- TreeMap:有序存放
|- 常用方法:
|- 向集合中保存数据: public Object put(Object key,Object value):返回的是value
|- 从集合中查找数据: public Object get(Object key):根据key查找。
|- 将Map数据变为Set实例: Set<Map.Entry<K,V>> entrySet()
|- 将全部的key变为set实例: Set<K> keySet()
|- 将全部的vlaue变为Collection接口实例: Collection<V> values()
|- Map.Entry:保存key与value
|- public Object getKey()
|- public Object getValue()
|- 存放key的注意点:
################Michael分割线####################
2、代码讲解
(8)Vector
使用List接口接收Vector的对象
使用List接口接收Vector的对象
与Demo10相似,就换了一个子类Vector哈,看下效果:
使用Enumeration进行输出
Vector子类允许直接使用
addElement(Object obj)
,也是可以向集合中加入元素的,看下效果:
(9)TreeSet
看下效果,进行排序了哈~
如何排序的?是任意的对象都可以排序吗?验证一下哈~!
看下效果,出错了哈~
如果自己写了一个对象,则无法排序了
TreeSet排序是如何进行处理的?
使用了比较器(Comparable接口)
如果一个类想使用TreeSet 进行排序操作,则对象所在的类必然要实现Comparable接口。同时指定排序的规则(二叉树)。
把以上的内容实现一下:之前的String能否排序?肯定可以。
如果一个类想使用TreeSet 进行排序操作,则对象所在的类必然要实现Comparable接口。同时指定排序的规则(二叉树)。
把以上的内容实现一下:之前的String能否排序?肯定可以。
((Student)obj).name 向下转型哈~
看下效果:
把以上的需求改一下:之前我留过一道题目:
声明一个学生类,里面有姓名、年龄、成绩属性,按成绩由高到低排序,如果成绩相等,则按年龄进行由低到高排序。
<1>、可以直接使用TreeSet进行排序
<2>、可以直接使用Arrays.sort方法排序
此两种方式的核心实现没有任何区别。
Comparable接口中的compareTo()方法只能返回三个值
· 如果小于:则返回-1
· 如果大于:则返回1
· 如果等于:则返回0
声明一个学生类,里面有姓名、年龄、成绩属性,按成绩由高到低排序,如果成绩相等,则按年龄进行由低到高排序。
<1>、可以直接使用TreeSet进行排序
<2>、可以直接使用Arrays.sort方法排序
此两种方式的核心实现没有任何区别。
Comparable接口中的compareTo()方法只能返回三个值
· 如果小于:则返回-1
· 如果大于:则返回1
· 如果等于:则返回0
看下效果:
如果成绩相同,则按年龄从低到高排序哈~
看下效果:
如果此处使用了TreeSet,则向里面增加内容也正常了
看下效果:
上面排序的原理是二叉算法哈~
(10)二叉算法(了解)
假如现在有以下的字符串:
“A”、“X”、“B”,“Y”、“Z”,如何进行排序呢?
A
X
B
Y
Z
中序遍历:A B X Y Z ---> 排序
假如现在有以下的字符串:
“A”、“X”、“B”,“Y”、“Z”,如何进行排序呢?
A
X
B
Y
Z
中序遍历:A B X Y Z ---> 排序
Demo21:
import java.util.*;
class BinarySearchTree{
private class Node{
public void addNode(Node newNode){
if(newNode.data.compareTo(data)<0){
//要放在左子树
if (left== null){
left = newNode;
} else{
//还要继续向下进行判断
left.addNode(newNode);
}
}
if (newNode.data.compareTo(data)>0){
if (right== null){
right = newNode;
} else{
//还要继续向下进行判断
right.addNode(newNode);
}
}
}
//输出操作
public void printNode(){
if (left!= null){
left.printNode();
}
System.out.println(data);
if (right!= null){
right.printNode();
}
}
//左子树
public Node left;
//右子树
public Node right;
//在此处加入一个自己的比较值
public Comparable data;
}
//必须存在一个根节点,且第一个放进去的元素就是根节点
private Node root;
//不管怎么放,实际上最终都必须向Comparable接口的类型进行转换
public void add(Comparable obj){
//必须实例化好一个节点
Node newNode = new Node();
//设置自己的内容
newNode.data = obj;
//判断是否是第一个放入的元素
if (root== null){
root = newNode;
} else{
//就必须进行依次判断,看是放在左子树还是右子树
root.addNode(newNode);
}
}
public void print(){
root.printNode();
}
}
//使用TreeSet进行排序
public class Demo21{
public static void main(String[] args){
BinarySearchTree bst = new BinarySearchTree();
bst.add( "X");
bst.add( "A");
bst.add( "Y");
bst.add( "G");
bst.add( "C");
bst.print();
}
}
class BinarySearchTree{
private class Node{
public void addNode(Node newNode){
if(newNode.data.compareTo(data)<0){
//要放在左子树
if (left== null){
left = newNode;
} else{
//还要继续向下进行判断
left.addNode(newNode);
}
}
if (newNode.data.compareTo(data)>0){
if (right== null){
right = newNode;
} else{
//还要继续向下进行判断
right.addNode(newNode);
}
}
}
//输出操作
public void printNode(){
if (left!= null){
left.printNode();
}
System.out.println(data);
if (right!= null){
right.printNode();
}
}
//左子树
public Node left;
//右子树
public Node right;
//在此处加入一个自己的比较值
public Comparable data;
}
//必须存在一个根节点,且第一个放进去的元素就是根节点
private Node root;
//不管怎么放,实际上最终都必须向Comparable接口的类型进行转换
public void add(Comparable obj){
//必须实例化好一个节点
Node newNode = new Node();
//设置自己的内容
newNode.data = obj;
//判断是否是第一个放入的元素
if (root== null){
root = newNode;
} else{
//就必须进行依次判断,看是放在左子树还是右子树
root.addNode(newNode);
}
}
public void print(){
root.printNode();
}
}
//使用TreeSet进行排序
public class Demo21{
public static void main(String[] args){
BinarySearchTree bst = new BinarySearchTree();
bst.add( "X");
bst.add( "A");
bst.add( "Y");
bst.add( "G");
bst.add( "C");
bst.print();
}
}
看下效果:
###########################Michael分割线############################
本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/139800
,如需转载请自行联系原作者