[零基础学JAVA]Java SE应用部分-35.JAVA类集之三

简介:
JAVA按以下重要顺序 
· 面向对象 
· 类集框架 
· JDBC 
· 文件编程
本季目标
主要讲解以下的内容: 
· Collection 
· List 
· Set 
· Map 
· Iterator 
· ListIteator 
· Enumeration 
· for…each语句(JDK 1.5的新特性) 
· Comparable接口 
· 二叉树
1、类集结构
(1)类集的产生目的
类集简单来讲就是一个动态的对象数组,此对象数组可以改变大小,可以任意的实现对象的增加、删除、输出。所有的类集存放java.util包中。
(2)类集的划分 
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的注意点:
################Michael分割线####################
2、代码讲解
(8)Vector 
使用List接口接收Vector的对象
image
与Demo10相似,就换了一个子类Vector哈,看下效果:
image
使用Enumeration进行输出
image
Vector子类允许直接使用 addElement(Object obj) ,也是可以向集合中加入元素的,看下效果:
image
(9)TreeSet
image
看下效果,进行排序了哈~
image
如何排序的?是任意的对象都可以排序吗?验证一下哈~!
image
看下效果,出错了哈~
image
如果自己写了一个对象,则无法排序了
TreeSet排序是如何进行处理的? 使用了比较器(Comparable接口) 
如果一个类想使用TreeSet 进行排序操作,则对象所在的类必然要实现Comparable接口。同时指定排序的规则(二叉树)。 
把以上的内容实现一下:之前的String能否排序?肯定可以。
((Student)obj).name 向下转型哈~
image
看下效果:
image
把以上的需求改一下:之前我留过一道题目: 
声明一个学生类,里面有姓名、年龄、成绩属性,按成绩由高到低排序,如果成绩相等,则按年龄进行由低到高排序。
<1>、可以直接使用TreeSet进行排序 
<2>、可以直接使用Arrays.sort方法排序 
此两种方式的核心实现没有任何区别。 
Comparable接口中的compareTo()方法只能返回三个值 
· 如果小于:则返回-1 
· 如果大于:则返回1 
· 如果等于:则返回0
image
看下效果:
image
如果成绩相同,则按年龄从低到高排序哈~
image
看下效果:
image
如果此处使用了TreeSet,则向里面增加内容也正常了
image
看下效果:
image
上面排序的原理是二叉算法哈~
(10)二叉算法(了解) 
假如现在有以下的字符串: 
“A”、“X”、“B”,“Y”、“Z”,如何进行排序呢? 

    X 

        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();    
        }    
}
看下效果:
image
###########################Michael分割线############################








本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/139800 ,如需转载请自行联系原作者
相关文章
|
1月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
143 57
|
3天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
52 8
|
1月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
73 17
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
133 4
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
76 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
58 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
49 5
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
90 5