




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA 基础知识精华总结基础知识精华总结 1 对象的初始化 1 非静态对象的初始化 在创建对象时 对象所在类的所有数据成员会首先进行初始化 基本类型 int 型 初始化为 0 如果为对象 这些对象会按顺序初始化 在所有类成员初始化完成之后 才调用本类的构造方法创建对象 构造方法的作用就是初始化 2 静态对象的初始化 程序中主类的静态变量会在 main 方法执行前初始化 不仅第一次创建对象时 类中的所有静态变量都初始化 并且第一次访问某类 注意此时 未创建此类对象 的静态对象时 所有的静态变量也要按它们在类中的顺序初始化 2 继承时 对象的初始化过程 1 主类的超类由高到低按顺序初始化静态成员 无论静态成员是否为 private 2 主类静态成员的初始化 3 主类的超类由高到低进行默认构造方法的调用 注意 在调用每一个超类的默认构造 方法前 先 进行对此超类进行非静态对象的初始化 4 主类非静态成员的初始化 5 调用主类的构造方法 3 关于构造方法 1 类可以没有构造方法 但如果有多个构造方法 就应该要有默认的构造方法 否则在继承此类时 需要在子类中显式调用父类的某一个非默认的构造方法了 2 在一个构造方法中 只能调用一次其他的构造方法 并且调用构造方法的语句必须是第一条语句 4 有关 public private 和 protected 1 无 public 修饰的类 可以被其他类访问的条件是 a 两个类在同一文件中 b 两个类在同一文件夹 中 c 两个类在同一软件包中 2 protected 继承类和同一软件包的类可访问 3 如果构造方法为 private 那么在其他类中不能创建该类的对象 5 抽象类 1 抽象类不能创建对象 2 如果一个类中一个方法为抽象方法 则这个类必须为 abstract 抽象类 3 继承抽象类的类在类中必须实现抽象类中的抽象方法 4 抽象类中可以有抽象方法 也可有非抽象方法 抽象方法不能为 private 5 间接继承抽象类的类可以不给出抽象方法的定义 6 final 关键字 1 一个对象是常量 不代表不能转变对象的成员 仍可以其成员进行操作 2 常量在使用前必须赋值 但除了在声明的同时初始化外 就只能在构造方法中初始化 3 final 修饰的方法不能被重置 在子类中不能出现同名方法 4 如果声明一个类为 final 则所有的方法均为 final 无论其是否被 final 修饰 但数据成员可为 final 也可不是 7 接口 interface 用 implements 来实现接口 1 接口中的所有数据均为 static 和 final 即静态常量 尽管可以不用这两个关键字修饰 但必须给常 量赋初值 2 接口中的方法均为 public 在实现接口类中 实现方法必须可 public 关键字 3 如果使用 public 来修饰接口 则接口必须与文件名相同 8 多重继承 1 一个类继承了一个类和接口 那么必须将类写在前面 接口写在后面 接口之间用逗号分隔 2 接口之间可多重继承 注意使用关键字 extends 3 一个类虽只实现了一个接口 但不仅要实现这个接口的所有方法 还要实现这个接口继承的接口 的方法 接口中的所有方法均须在类中实现 9 接口的嵌入 1 接口嵌入类中 可以使用 private 修饰 此时 接口只能在所在的类中实现 其他类不 能访问 2 嵌入接口中的接口一定要为 public 10 类的嵌入 1 类可以嵌入另一个类中 也可以嵌入接口中 2 在静态方法或其他方法中 不能直接创建内部类对象 需通过手段来取得 手段有两种 class A class B B getB B b new B return b static void m A a new A A B ab a getB 或者是 A B ab a new B 3 一个类继承了另一个类的内部类 因为超类是内部类 而内部类的构造方法不能自动被调用 这 样就需要在子类的构造方法中明确的调用超类的构造方法 接上例 class C extends A B C new A super 这一句就实现了对内部类构造方法的调用 构造方法也可这样写 C A a a super 使用这个构造方法创建对象 要写成 C c new C a a 是 A 的对象 11 异常类 Java 中除了 RunTimeException 类 其他异常均须捕获或抛出 java 父类与子类间的关系总结父类与子类间的关系总结 1 子类会先执行父类构造器内的代码 再执行自身类构造器的代码 最后执行被主函数调用的方法 2 可以用 super 显式地指定继承父类构造器 但 super 一定要写在第一行 3 父类构造器方法设为 public 或默认为 protected 如设置为私有 那么子类写构造方法就会出错 因为 子类默认了继承父类的构造器 4 父类构造器方法可以重载 但子类只继承一个构造器方法 就是不带参数的那个 5 父类的公有变量子类也可以继承 但并不是指向同一个变量 而是复制了一个副本 在子类里赋值只 是改变子类副本的值 不影响父对象中变量的值 6 子类没有覆盖父类的方法 A 子类实例也可以调用 A 方法 因为它自动从父类继承下来 就是说子类 有方法 A 这样使用并不会出错 7 如果父类含有抽象方法 则父类必须定义为抽象类 并且抽象方法在父类中只能定义 不能有具体的 代码实现 子类必须实现父类定义的抽象方法 子类不能继承父类的显式定义的构造方法 若想要继承父类的构造方法 需要通过覆盖该构造方法 并在 方法中通过 super 调用父类的该构造方法的方式来继承 1 父类中没有显式定义任何构造方法 此时父类中实际有一个默认的无参数构造方法 这时 在子类中 显式定义任何构造方法时 可以不用使用 super 调用父类的默认方法 2 父类中显式定义了默认的无参数构造方法 那么子类可以定义任意的构造方法 而不必使用 super 调 用父类的构造方法 3 父类中显示定义了构造方法 却没有显示定义默认的无参数构造方法 那么子类定义任何构造方法中 都需要通过 super 调用父类的构造方法 Java 之静态内部类 static class 在一个类中创建另外一个类 叫做成员内部类 这个成员内部类可以是静态 的 利用 static 关键字修饰 也可以是非静态的 由于静态的内部类在定义 使用的时候会有种种的限制 所以在实际工作中用到的并不多 在开发过程中 内部类中使用的最多的还是非静态地成员内部类 不过在特定的情况下 静态内部类也能够发挥其独特的作用 每次当用 new 关键字创建出一个子类对象 时 那么程序会先执行父类中不带参数的构造函数 然后再执行子类的构造函数 一 静态内部类的使用目的 一 静态内部类的使用目的 在定义内部类的时候 可以在其前面加上一个权限修饰符 static 此时这个内部类就变为了静态内部类 不过由于种种的原因 如使用上的限制等等因素 具体的使用限制 笔者在下面的内容中会详细阐述 在 实际工作中用的并不是很多 但是并不是说其没有价值 在某些特殊的情况下 少了这个静态内部类还真 是不行 如在进行代码程序测试的时候 如果在每一个 Java 源文件中都设置一个主方法 主方法是某个应 用程序的入口 必须具有 那么会出现很多额外的代码 而且最主要的时这段主程序的代码对于 Java 文 件来说 只是一个形式 其本身并不需要这种主方法 但是少了这个主方法又是万万不行的 在这种情况 下 就可以将主方法写入到静态内部类中 从而不用为每个 Java 源文件都设置一个类似的主方法 这对 于代码测试是非常有用的 在一些中大型的应用程序开发中 则是一个常用的技术手段 为此 这个静态 内部类虽然不怎么常用 但是程序开发人员还必须要掌握它 也许在某个关键的时刻 其还可以发挥巨大 的作用也说不定 二 静态内部类的使用限制 二 静态内部类的使用限制 将某个内部类定义为静态类 跟将其他类定义为静态类的方法基本相同 引用规则也基本一致 不过其细 节方面仍然有很大的不同 具体来说 主要有如下几个地方要引起各位程序开发人员的注意 一 是静态成员 包括静态变量与静态成员 的定义 一般情况下 如果一个内部类不是被定义成静态内部 类 那么在定义成员变量或者成员方法的时候 是不能够被定义成静态成员变量与静态成员方法的 也就 是说 在非静态内部类中不可以声明静态成员 如现在在一个 student 类中定义了一个内部类 age 如果没有将这 个类利用 static 关键字修饰 即没有定义为静态类 那么在这个内部类中如果要利用 static 关键字来修饰 某个成员方法或者成员变量是不允许的 在编译的时候就通不过 故程序开发人员需要注意 只有将某个 内部类修饰为静态类 然后才能够在这个类中定义静态的成员变量与成员方法 这是静态内部类都有的一 个特性 也正是因为这个原因 有时候少了这个静态的内部类 很多工作就无法完成 或者说要绕一个大 圈才能够实现某个用户的需求 这也是静态的内部类之所以要存在的一个重要原因 二 是在成员的引用上 有比较大的限制 一般的非静态内部类 可以随意的访问外部类中的成员变量与 成员方法 即使这些成员方法被修饰为 private 私有的成员变量或者方法 其非静态内部类都可以随意的 访问 则是非静态内部类的特权 因为在其他类中是无法访问被定义为私有的成员变量或则方法 但是如 果一个内部类被定义为静态的 那么在引用外部类的成员方法或则成员变量的时候 就会有诸多的限制 如不能够从静态内部类的对象中访问外部类的非静态成员 包括成员变量与成员方法 这是什么意思呢 如 果在外部类中定义了两个变量 一个是非静态的变量 一个是静态的变量 那么在静态内部类中 无论在 成员方法内部还是在其他地方 都只能够引用外部类中的静态的变量 而不能够访问非静态的变量 在静 态内部类中 可以定义静态的方法 也只有在静态的内部类中可以定义静态的方法 在静态方法中引用外 部类的成员 但是无论在内部类的什么地方引用 有一个共同点 即都只能够引用外部类中的静态成员方 法或者成员变量 对于那些非静态的成员变量与成员方法 在静态内部类中是无法访问的 这就是静态内 部类的最大使用限制 在普通的非静态内部类中是没有这个限制的 也正是这个原因 决定了静态内部类 只应用在一些特定的场合 其应用范围远远没有像非静态的内部类那样广泛 三 是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上 通常情况下 在一个类 中创建成员内部类的时候 有一个强制性的规定 即内部类的实例一定要绑定在外部类的实例中 也就是 说 在创建内部类之前要先在外部类中要利用 new 关键字来创建这个内部类的对象 如此的话如果从外 部类中初始化一个内部类对象 那么内部类对象就会绑定在外部类对象上 也就是说 普通非静态内部类 的对象是依附在外部类对象之中的 但是 如果成员开发人员创建的时静态内部类 那么这就又另当别论 了 通常情况下 程序员在定义静态内部类的时候 是不需要定义绑定在外部类的实例上的 也就是说 要在一个外部类中定义一个静态的内部类 不需要利用关键字 new 来创建内部类的实例 即在创建静态 类内部对象时 不需要其外部类的对象 具体为什么会这样 一般程序开发人员不需要了解这么深入 只 需要记住有这个规则即可 在定义静态内部类的时候 千万不要犯画蛇添足的错误 从以上的分析中可 以看出 静态内部类与非静态的内部类还是有很大的不同的 一般程序开发人员可以这么理解 非静态的 内部类对象隐式地在外部类中保存了一个引用 指向创建它的外部类对象 不管这么理解 程序开发人员 都需要牢记静态内部类与非静态内部类的差异 如是否可以创建静态的成员方法与成员变量 静态内部类 可以创建静态的成员而非静态的内部类不可以 对于访问外部类的成员的限制 静态内部类只可以访问外 部类中的静态成员变量与成员方法而非静态的内部类即可以访问静态的也可以访问非静态的外部类成员方 法与成员变量 这两个差异是静态内部类与非静态外部类最大的差异 也是静态内部类之所以存在的原 因 了解了这个差异之后 程序开发人员还需要知道 在什么情况下该使用静态内部类 如在程序测试的 时候 为了避免在各个 Java 源文件中书写主方法的代码 可以将主方法写入到静态内部类中 以减少代 码的书写量 让代码更加的简洁 总之 静态内部类在 Java 语言中是一个很特殊的类 跟普通的静态类 以及非静态的内部类都有很大的差异 作为程序开发人员 必须要知道他们之间的差异 并在实际工作中 在合适的地方采用合适的类 不过总的来说 静态内部类的使用频率并不是很高 但是在有一些场合 如 果没有这个内部静态类的话 可能会起到事倍功半的反面效果 JSPJSP 内置对象及方法内置对象及方法 1 request 对象 客户端的请求信息被封装在 request 对象中 通过它才能了解到客户的需求 然后做出响应 它是 HttpServletRequest 类的实例 1 object getAttribute String name 返回指定属性的属性值 2 Enumeration getAttributeNames 返回所有可用属性名的枚举 3 String getCharacterEncoding 返回字符编码方式 4 int getContentLength 返回请求体的长度 以字节数 5 String getContentType 得到请求体的 MIME 类型 6 ServletInputStream getInputStream 得到请求体中一行的二进制流 7 String getParameter String name 返回 name 指定参数的参数值 8 Enumeration getParameterNames 返回可用参数名的枚举 9 String getParameterValues String name 返回包含参数 name 的所有值的数组 10 String getProtocol 返回请求用的协议类型及版本号 11 String getScheme 返回请求用的计划名 如 http https 及 ftp 等 12 String getServerName 返回接受请求的服务器主机名 13 int getServerPort 返回服务器接受此请求所用的端口号 14 BufferedReader getReader 返回解码过了的请求体 15 String getRemoteAddr 返回发送此请求的客户端 IP 地址 16 String getRemoteHost 返回发送此请求的客户端主机名 17 void setAttribute String key Object obj 设置属性的属性值 18 String getRealPath String path 返回一虚拟路径的真实路径 2 response 对象 response 对象包含了响应客户请求的有关信息 但在 JSP 中很少直接用到它 它是 HttpServletResponse 类 的实例 1 String getCharacterEncoding 返回响应用的是何种字符编码 2 ServletOutputStream getOutputStream 返回响应的一个二进制输出流 3 PrintWriter getWriter 返回可以向客户端输出字符的一个对象 4 void setContentLength int len 设置响应头长度 5 void setContentType String type 设置响应的 MIME 类型 6 sendRedirect java lang String location 重新定向客户端的请求 3 session 对象 session 对象指的是客户端与服务器的一次会话 从客户连到服务器的一个 WebApplication 开始 直到客 户端与服务器断开连接为止 它是 HttpSession 类的实例 1 long getCreationTime 返回 SESSION 创建时间 2 public String getId 返回 SESSION 创建时 JSP 引擎为它设的惟一 ID 号 3 long getLastAccessedTime 返回此 SESSION 里客户端最近一次请求时间 4 int getMaxInactiveInterval 返回两次请求间隔多长时间此 SESSION 被取消 ms 5 String getValueNames 返回一个包含此 SESSION 中所有可用属性的数组 6 void invalidate 取消 SESSION 使 SESSION 不可用 7 boolean isNew 返回服务器创建的一个 SESSION 客户端是否已经加入 8 void removeValue String name 删除 SESSION 中指定的属性 9 void setMaxInactiveInterval 设置两次请求间隔多长时间此 SESSION 被取消 ms 4 out 对象 out 对象是 JspWriter 类的实例 是向客户端输出内容常用的对象 1 void clear 清除缓冲区的内容 2 void clearBuffer 清除缓冲区的当前内容 3 void flush 清空流 4 int getBufferSize 返回缓冲区以字节数的大小 如不设缓冲区则为 0 5 int getRemaining 返回缓冲区还剩余多少可用 6 boolean isAutoFlush 返回缓冲区满时 是自动清空还是抛出异常 7 void close 关闭输出流 5 page 对象 page 对象就是指向当前 JSP 页面本身 有点象类中的 this 指针 它是 java lang Object 类的实例 1 class getClass 返回此 Object 的类 2 int hashCode 返回此 Object 的 hash 码 3 boolean equals Object obj 判断此 Object 是否与指定的 Object 对象相等 4 void copy Object obj 把此 Object 拷贝到指定的 Object 对象中 5 Object clone 克隆此 Object 对象 6 String toString 把此 Object 对象转换成 String 类的对象 7 void notify 唤醒一个等待的线程 8 void notifyAll 唤醒所有等待的线程 9 void wait int timeout 使一个线程处于等待直到 timeout 结束或被唤醒 10 void wait 使一个线程处于等待直到被唤醒 11 void enterMonitor 对 Object 加锁 12 void exitMonitor 对 Object 开锁 6 application 对象 application 对象实现了用户间数据的共享 可存放全局变量 它开始于服务器的启动 直到服务器的关闭 在此期间 此对象将一直存在 这样在用户的前后连接或不同用户之间的连接中 可以对此对象的同一属 性进行操作 在任何地方对此对象属性的操作 都将影响到其他用户对此的访问 服务器的启动和关闭决 定了 application 对象的生命 它是 ServletContext 类的实例 1 Object getAttribute String name 返回给定名的属性值 2 Enumeration getAttributeNames 返回所有可用属性名的枚举 3 void setAttribute String name Object obj 设定属性的属性值 4 void removeAttribute String name 删除一属性及其属性值 5 String getServerInfo 返回 JSP SERVLET 引擎名及版本号 6 String getRealPath String path 返回一虚拟路径的真实路径 7 ServletContext getContext String uripath 返回指定 WebApplication 的 application 对象 8 int getMajorVersion 返回服务器支持的 Servlet API 的最大版本号 9 int getMinorVersion 返回服务器支持的 Servlet API 的最大版本号 10 String getMimeType String file 返回指定文件的 MIME 类型 11 URL getResource String path 返回指定资源 文件及目录 的 URL 路径 12 InputStream getResourceAsStream String path 返回指定资源的输入流 13 RequestDispatcher getRequestDispatcher String uripath 返回指定资源 RequestDispatcher 对象 14 Servlet getServlet String name 返回指定名的 Servlet 15 Enumeration getServlets 返回所有 Servlet 的枚举 16 Enumeration getServletNames 返回所有 Servlet 名的枚举 17 void log String msg 把指定消息写入 Servlet 的日志文件 18 void log Exception exception String msg 把指定异常的栈轨迹及错误消息写入 Servlet 日志文件 19 void log String msg Throwable throwable 把栈轨迹及给出的 Throwable 异常的说明信息写入 Servlet 的日志文件 7 exception 对象 exception 对象是一个例外对象 当一个页面在运行过程中发生了例外 就产生这个对象 如果一个 JSP 页 面要应用此对象 就必须把 isErrorPage 设为 true 否则无法编译 他实际上是 java lang Throwable 的对象 1 String getMessage 返回描述异常的消息 2 String toString 返回关于异常的简短描述消息 3 void printStackTrace 显示异常及其栈轨迹 4 Throwable FillInStackTrace 重写异常的执行栈轨迹 8 pageContext 对象 pageContext 对象提供了对 JSP 页面内所有的对象及名字空间的访问 也就是说他可以访问到本页所在的 session 也可以取本页面所在的 application 的某一属性值 他相当于页面中所有功能的集大成者 它的本 类名也叫 pageContext 1 JspWriter getOut 返回当前客户端响应被使用的 JspWriter 流 out 2 HttpSession getSession 返回当前页中的 HttpSession 对象 session 3 Object getPage 返回当前页的 Object 对象 page 4 ServletRequest getRequest 返回当前页的 ServletRequest 对象 request 5 ServletResponse getResponse 返回当前页的 ServletResponse 对象 response 6 Exception getException 返回当前页的 Exception 对象 exception 7 ServletConfig getServletConfig 返回当前页的 ServletConfig 对象 config 8 ServletContext getServletContext 返回当前页的 ServletContext 对象 application 9 void setAttribute String name Object attribute 设置属性及属性值 10 void setAttribute String name Object obj int scope 在指定范围内设置属性及属性值 11 public Object getAttribute String name 取属性的值 12 Object getAttribute String name int scope 在指定范围内取属性的值 13 public Object findAttribute String name 寻找一属性 返回起属性值或 NULL 14 void removeAttribute String name 删除某属性 15 void removeAttribute String name int scope 在指定范围删除某属性 16 int getAttributeScope String name 返回某属性的作用范围 17 Enumeration getAttributeNamesInScope int scope 返回指定范围内可用的属性名枚举 18 void release 释放 pageContext 所占用的资源 19 void forward String relativeUrlPath 使当前页面重导到另一页面 20 void include String relativeUrlPath 在当前位置包含另一文件 9 config 对象 config 对象是在一个 Servlet 初始化时 JSP 引擎向它传递信息用的 此信息包括 Servlet 初始化时所要用 到的参数 通过属性名和属性值构成 以及服务器的有关信息 通过传递一个 ServletContext 对象 1 ServletContext getServletContext 返回含有服务器相关信息的 ServletContext 对象 2 String getInitParameter String name 返回初始化参数的值 3 Enumeration getInitParameterNames 返回 Servlet 初始化所需所有参数的枚举 子类不能重写父类的静态方法 也不能把父类不是静态的重写成静态的方法 在子类中声明和父类相同的方法就可以将父类的静态方法隐藏 就是为了达到重写的目的 所以就要用到隐藏 上边我说了 子类是不能重写父类的静态方法的 高内聚就是提高模块内部的关联程度 低耦合就是降低模块之间的关联程度 在 java 中可以使用 final 关键字来声明 类 变量 方法 final 标记的类不能被继承 final 标识的类不能被继承 即不能有子类 final 标记的方法不能被子类覆写 final 标记的方法不能被子类覆写 final 声明的变量 成员变量和局部变量 只能赋值一次 被 final 标记的变量最好用大写表示 Public 所有人都可以访问 访问权限最大 Static 静态 是所有对象公有的 Final 常量 抽象方法 就是一个只有声明而没有实现的方法 没有方法体的方法 比普通类的定义中多出了一个抽象方法 普通类的定义在抽象类中都实用 抽象类在类的声明处要使用 abstract 声明为抽象类 抽象方法也是 1 抽象类必须用 abstract 关键字类修饰 abstract class A 2 抽象类中不一定要有抽象方法 抽象方法也要用 abstract 来修饰 public abstract void fun 抽象类中必须要有抽象方法 抽象方法只需声明不需要去实现 抽象类不能直接被实例化因此必须要由子类去实现如果子类是普通类则必须覆写抽象类中全部的抽象方 法 如果子类是抽象类 则可以不必覆写父类中的抽象方法 抽象类不能被直接实例化 即不能直接通过 new 关键字来实例化抽象类 抽象类也属于 java 的单继承 抽象类的实例化要调用类的构造方法 子类在实例化时要先调用父类的构造方法 因此抽象类中一定有构 造方法 fina 标记的类不能被继承 而抽象类必须由子类来实现 因此 抽象类不能使用 final 来标记 如果在抽象类中全部都是抽象方法和全局变量那么该类则用接口来表示 接口中的全局变量 public static final String NAME 接口的访问权限永远是 public 接口在程序中叫做实现 即接口是通过子类实现的 接口中包括 常量 抽象方法 接口中规定必须是常量和抽象方法 一个类可以实现多个接口但只能继承一个父类 不能继承多个抽象类 一个新的接口可以使用 extends 关键字去继承多个已有的接口 实现接口的多继承 注意 接口可以多继承 而抽象类不能多继承 1 普通类 普通类之间是单继承关系 不建议去继承一个普通类 2 普通类 抽象类必须由子类去实现 子类必须覆写抽象类中所有的抽象方法 3 普通类 可实现多接口 接口由子类去实现 子类必须实现接口中所有的方法 4 抽象类 抽象类间是单继承关系 抽象类子类可以不用覆写父类中的抽像方法 5 抽象类 可实现多接口 抽象内中可以有非抽象方法 因此可以实现接口中的抽象方法 6 接口 多继承或单继承 不能是实现关系 接口在继承时可以不去覆写父接口中的方法 线性表 链表 哈希表是常用的数据结构 在进行 Java 开发时 JDK 已经为我们提供了一系列相应的类 来实现基本的数据结构 这些类均在 java util 包中 本文试图通过简单的描述 向读者阐述各个类的作用 以及如何正确使用这些类 Collection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection 接口 Collection 是最基本的集合接口 一个 Collection 代表一组 Object 即 Collection 的元素 Elements 一些 Collection 允许相同的元素而另一些不行 一些能排序而另一些不行 Java SDK 不提供直接继承自 Collection 的类 Java SDK 提供的类都是继承自 Collection 的 子接口 如 List 和 Set 所有实现 Collection 接口的类都必须提供两个标准的构造函数 无参数的构造函数用于创建一个空的 Collection 有一个 Collection 参数的构造函数用于创建一个新的 Collection 这个新的 Collection 与传入的 Collection 有相同的元素 后一个构造函数允许用户复制一个 Collection 如何遍历 Collection 中的每一个元素 不论 Collection 的实际类型如何 它都支持一个 iterator 的方法 该方法返回一个迭代子 使用该迭代子即可逐一访问 Collection 中每一个元素 典型的用法如下 Iterator it collection iterator 获得一个迭代子 while it hasNext Object obj it next 得到下一个元素 由 Collection 接口派生的两个接口是 List 和 Set List 接口 List 是有序的 Collection 使用此接口能够精确的控制每个元素插入的位置 用户能够使用索引 元 素在 List 中的位置 类似于数组下标 来访问 List 中的元素 这类似于 Java 的数组 和下面要提到的 Set 不同 List 允许有相同的元素 除了具有 Collection 接口必备的 iterator 方法外 List 还提供一个 listIterator 方法 返回一个 ListIterator 接口 和标准的 Iterator 接口相比 ListIterator 多了一些 add 之类的方法 允许添加 删除 设定元素 还能向前或向后遍历 实现 List 接口的常用类有 LinkedList ArrayList Vector 和 Stack LinkedList 类 LinkedList 实现了 List 接口 允许 null 元素 此外 LinkedList 提供额外的 get remove insert 方法在 LinkedList 的首部或尾部 这些操作使 LinkedList 可被用作堆栈 stack 队列 queue 或双向队列 deque 注意 LinkedList 没有同步方法 如果多个线程同时访问一个 List 则必须自己实现访问同步 一种解 决方法是在创建 List 时构造一个同步的 List List list Collections synchronizedList new LinkedList ArrayList 类 ArrayList 实现了可变大小的数组 它允许所有元素 包括 null ArrayList 没有同步 size isEmpty get set 方法运行时间为常数 但是 add 方法开销为分摊的常数 添加 n 个元素需要 O n 的时间 其他的方法运行时间为线性 每个 ArrayList 实例都有一个容量 Capacity 即用于存储元素的数组的大小 这个容量可随着不断 添加新元素而自动增加 但是增长算法并没有定义 当需要插入大量元素时 在插入前可以调用 ensureCapacity 方法来增加 ArrayList 的容量以提高插入效率 和 LinkedList 一样 ArrayList 也是非同步的 unsynchronized Vector 类 Vector 非常类似 ArrayList 但是 Vector 是同步的 由 Vector 创建的 Iterator 虽然和 ArrayList 创建的 Iterator 是同一接口 但是 因为 Vector 是同步的 当一个 Iterator 被创建而且正在被使用 另一个线程改 变了 Vector 的状态 例如 添加或删除了一些元素 这时调用 Iterator 的方法时将抛出 ConcurrentModificationException 因此必须捕获该异常 Page Stack 类 Stack 继承自 Vector 实现一个后进先出的堆栈 Stack 提供 5 个额外的方法使得 Vector 得以被当作堆 栈使用 基本的 push 和 pop 方法 还有 peek 方法得到栈顶的元素 empty 方法测试堆栈是否为空 search 方法检测一个元素在堆栈中的位置 Stack 刚创建后是空栈 Set 接口 Set 是一种不包含重复的元素的 Collection 即任意的两个元素 e1 和 e2 都有 e1 equals e2 false Set 最多有一个 null 元素 很明显 Set 的构造函数有一个约束条件 传入的 Collection 参数不能包含重复的元素 请注意 必须小心操作可变对象 Mutable Object 如果一个 Set 中的可变元素改变了自身状态导致 Object equals Object true 将导致一些问题 Map 接口 请注意 Map 没有继承 Collection 接口 Map 提供 key 到 value 的映射 一个 Map 中不能包含相同的 key 每个 key 只能映射一个 value Map 接口提供 3 种集合的视图 Map 的内容可以被当作一组 key 集合 一组 value 集合 或者一组 key value 映射 Hashtable 类 Hashtable 继承 Map 接口 实现一个 key value 映射的哈希表 任何非空 non null 的对象都可作为 key 或者 value 添加数据使用 put key value 取出数据使用 get key 这两个基本操作的时间开销为常数 Hashtable 通过 initial capacity 和 load factor 两个参数调整性能 通常缺省的 load factor 0 75 较好地实现 了时间和空间的均衡 增大 load factor 可以节省空间但相应的查找时间将增大 这会影响像 get 和 put 这 样的操作 使用 Hashtable 的简单示例如下 将 1 2 3 放到 Hashtable 中 他们的 key 分别是 one two three Hashtable numbers new Hashtable numbers put one new Integer 1 numbers put two new Integer 2 numbers put three new Integer 3 要取出一个数 比如 2 用相应的 key Integer n Integer numbers get two System out println two n 由于作为 key 的对象将通过计算其散列函数来确定与之对应的 value 的位置 因此任何作为 key 的对 象都必须实现 hashCode 和 equals 方法 hashCode 和 equals 方法继承自根类 Object 如果你用自定义的类 当作 key 的话 要相当小心 按照散列函数的定义 如果两个对象相同 即 obj1 equals obj2 true 则它 们的 hashCode 必须相同 但如果两个对象不同 则它们的 hashCode 不一定不同 如果两个不同对象的 hashCode 相同 这种现象称为冲突 冲突会导致操作哈希表的时间开销增大 所以尽量定义好的 hashCode 方法 能加快哈希表的操作 如果相同的对象有不同的 hashCode 对哈希表的操作会出现意想不到的结果 期待的 get 方法返回 null 要避免这种问题 只需要牢记一条 要同时复写 equals 方法和 hashCode 方法 而不要只写其中一 个 Hashtable 是同步的 HashMap 类 HashMap 和 Hashtable 类似 不同之处在于 HashMap 是非同步的 并且允许 null 即 null value 和 null key 但是将 HashMap 视为 Collection 时 values 方法可返回 Collection 其迭代子操作时间开销 和 HashMap 的容量成比例 因此 如果迭代操作的性能相当重要的话 不要将 HashMap 的初始化容量设 得过高 或者 load factor 过低 WeakHashMap 类 WeakHashMap 是一种改进的 HashMap 它对 key 实行 弱引用 如果一个 key 不再被外部所引用 那么该 key 可以被 GC 回收 javajava 中中 listlist setset 和和 mapmap 的区别的区别 List 按对象进入的顺序保存对象 不做排序或编辑操作 Set 对每个对象只接受一次 并使用自己内 部的排序方法 通常 你只关心某个元素是否属于 Set 而不关心它的顺序 否则应该使用 List Map 同 样对每个元素保存一份 但这是基于 键 的 Map 也有内置的排序 因而不关心元素添加的顺序 如果添 加元素的顺序对你很重要 应该使用 LinkedHashSet 或者 LinkedHashMap List 的功能方法 实际上有两种 List 一种是基本的 ArrayList 其优点在于随机访问元素 另一种是更强大的 LinkedList 它并不是为快速随机访问设计的 而是具有一套更通用的方法 List 次序是 List 最重要的特点 它保证维护元素特定的顺序 List 为 Collection 添加了许多方 法 使得能够向 List 中间插入与移除元素 这只推荐 LinkedList 使用 一个 List 可以生成 ListIterator 使用它可以从两个方向遍历 List 也可以从 List 中间插入和移除元素 ArrayList 由数组实现的 List 允许对元素进行快速随机访问 但是向 List 中间插入与移除元素 的速度很慢 ListIterator 只应该用来由后向前遍历 ArrayList 而不是用来插入和移除元素 因为那比 LinkedList 开销要大很多 LinkedList 对顺序访问进行了优化 向 List 中间插入与删除的开销并不大 随机访问则相对较慢 使用 ArrayList 代替 还具有下列方法 addFirst addLast getFirst getLast removeFirst 和 removeLast 这些方法 没有在任何接口或基类中定义过 使得 LinkedList 可以当 作堆栈 队列和双向队列使用 Set 的功能方法 Set 具有与 Collection 完全一样的接口 因此没有任何额外的功能 不像前面有两个不同的 List 实际上 Set 就是 Collection 只是行为不同 这是继承与多态思想的典型应用 表现不同的行为 Set 不保存重复的元素 至于如何判断元素相同则较为负责 Set 存入 Set 的每个元素都必须是唯一的 因为 Set 不保存重复元素 加入 Set 的元素必须定义 equals 方法以确保对象的唯一性 Set 与 Collection 有完全一样的接口 Set 接口不保证维护元素的次 序 HashSet 为快速查找设计的 Set 存入 HashSet 的对象必须定义 hashCode TreeSet 保存次序的 Set 底层为树结构 使用它可以从 Set 中提取有序的序列 LinkedHashSet 具有 HashSet 的查询速度 且内部使用链表维护元素的顺序 插入的次序 于是在 使用迭代器遍历 Set 时 结果会按元素插入的次序显示 Map 的功能方法 方法 put Object key Object value 添加一个 值 想要得东西 和与 值 相关联的 键 key 使用它来查找 方法 get Object key 返回与给定 键 相关联的 值 可以用 containsKey 和 containsValue 测试 Map 中是否包含某个 键 或 值 标准的 Java 类库中包含了几种不同的 Map HashMap TreeMap LinkedHashMap WeakHashMap IdentityHashMap 它们都有同样的基本接口 Map 但是行为 效率 排序策略 保存对象的生命周期和判定 键 等价的策略等各不相同 执行效率是 Map 的一个大问题 看看 get 要做哪些事 就会明白为什么在 ArrayList 中搜索 键 是相当慢的 而这正是 HashMap 提高速度的地方 HashMap 使用了特殊的值 称为 散列码 hash code 来取代对键的缓慢搜索 散列码 是 相对唯一 用以代表对象的 int 值 它是通过将该对象的某些信 息进行转换而生成的 所有 Java 对象都能产生散列码 因为 hashCode 是定义在基类 Object 中的方法 HashMap 就是使用对象的 hashCod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年物业管理担保合同范本
- 2025年房屋拆迁合同范本
- 2025年广告承揽合同范本
- 2024-2025学年新教材高中物理 第三章 机械波 5 多普勒效应说课稿1 新人教版选择性必修第一册
- 2025年土建方向质量员证理论考试笔试试题含答案
- 2025年自然科学基础知识考试试卷及答案
- 市政给排水管道施工质量控制标准
- 9 激光切割做班徽说课稿小学劳动人民版五年级上册-人民版
- 百师联盟2026届高三上学期9月调研考试语文试卷(含答案)
- 拉管施工申请书
- 建设工程监理专业教学标准(高等职业教育专科)2025修订
- T/CHES 79-2022大中型输水渠道工程维修养护规程
- 心理治疗师考试试题及答案
- 海洋工程概论课件
- 2025年广东广州市高三二模高考政治试卷试题(含答案详解)
- 兵团职工考试试题及答案
- 留置针的使用规范
- 钢结构转换层技术交底
- 《人工智能技术基础》课件-第四章 机器学习
- 老年人70岁驾考三力测试题库
- 2025年中路高科交通科技集团有限公司-企业报告(供应商版)
评论
0/150
提交评论