Java 的一些高级知识你掌握了吗? 我最近在做一个网络通信的项目,本文中的提到的内容全都使用到了,主要有IO,类加载器,序列化,线程池 等等.这里做一下整理。
作者:赵磊
博客:http://elf8848.iteye.com
--------------------------修饰符------------------------------
java48个修饰符有以下几个不常用的:
不常用到的关键字有:const,goto,native,strictfp,transient,volatile。
其中const和goto为java中的保留字。
transient 序列化的时候不被存储
volatile 弱同步 volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。参见:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
srticftp 修饰类和方法,意思是FP-strict,精确浮点,符合IEEE-754规范的。当一个class或interface用strictfp声明,内部所有的float和double表达式都会成为strictfp的。
native 是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。
--------------------线程池-------------------
java.util.concurrent.Executors工具类
此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。此类支持以下各种方法:
创建并返回设置有常用配置字符串的 ExecutorService 的方法。
创建并返回设置有常用配置字符串的 ScheduledExecutorService 的方法。
创建并返回“包装的”ExecutorService 方法,它通过使特定于实现的方法不可访问来禁用重新配置。
创建并返回 ThreadFactory 的方法,它可将新创建的线程设置为已知的状态。
创建并返回非闭包形式的 Callable 的方法,这样可将其用于需要 Callable 的执行方法中。
创建一个线程池,用来执行定任务。 例子: http://elf8848.iteye.com/blog/1538673
Executors. newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
Executors. newFixedThreadPool(int nThreads)
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。
Executors. newCachedThreadPool(ThreadFactory threadFactory)
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
Executors. newSingleThreadExecutor()
----------------------------集合类--------------------------------
返回一个只包含指定对象的不可变 List。返回的列表是可序列化的。 其中包含一个obj对象
List<T> list=Collections.<T>singletonList(T obj);
返回一个只包含指定对象的不可变 set。返回的 set 是可序列化的。其中包含一个obj对象
Set<T> set=Collections.<T>singleton(T obj);
返回一个不可变 的映射,它只将指定键映射到指定值。返回的映射是可序列化的。
只包含指定键-值映射关系的不可变映射。
Map(K ,V) map=Collections.<K,V>singletonMap(K key,V value);
返回指定有序 set 的不可修改 视图。
SortedSet<T> set=Collections.unmodifiableSortedSet(SortedSet<T> s)
返回指定列表的不可修改 视图。
List<T> list=Collections.unmodifiableList(List<? extends T> list)
返回指定映射的不可修改 视图。
Map<K,V> map=Collections.unmodifiableMap(Map<? extends K,? extends V> m)
返回指定列表支持的同步(线程安全的)列表。
List<T> a=Collections.synchronizedList(List<T> list)
返回由指定映射支持的同步(线程安全的)映射。
Map<K,V> a=Collections.synchronizedMap(Map<K,V> m)
返回指定 set 支持的同步(线程安全的)set。
Set<T> a=Collections.synchronizedSet(Set<T> s)
---List包含---
如果列表包含指定的元素,则返回 true。
boolean contains(Object o)
---Map包含---
如果此映射包含指定键的映射关系,则返回 true。
boolean containsKey(Object key)
如果此映射将一个或多个键映射到指定值,则返回 true。
boolean containsValue(Object value)
测试此映射表中是否存在与指定值关联的键。(此方法在功能上等同于 containsValue 方法,Hashtable,ConcurrentHashMap中有这个方法)
contains(Object value)
---Set包含---
如果 set 包含指定的元素,则返回 true。
boolean contains(Object o)
CopyOnWriteArrayList
CopyOnWriteArraySet
它最适合于具有以下特征的应用程序:
set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
它是线程安全的。
因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。
迭代器不支持可变 remove 操作。
使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
-----------------------------类.this 类 的作用--------------------
this指的是当前正在访问这段代码的对象,当在内部类中使用this指的就是内部类的对象,
为了访问外层类对象,就可以使用外层类名.this来访问,一般也只在这种情况下使用这种
----------------------------- 类加载器部分 -----------------------
请看:《深入探讨 Java 类加载器》
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
核心节选:
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
类加载器的代理模式
类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。
线程上下文类加载器
线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器。Java 应用运行的初始线程的上下文类加载器是系统类加载器。在线程中运行的代码可以通过此类加载器来加载类和资源。
类加载器与 Web 容器
对于运行在 Java EE™容器中的 Web 应用来说,类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。
----------------------------- 序列化部分 -------------------------
----------------------------- IO部分 ------------------------------
ByteArrayInputStream 字节数组转流
ByteArrayOutputStream 流转字节数组,其中的数据被写入一个 byte 数组
StringReader 把String读到Reader
StringWriter 把String写到Write
OutputStreamWriter String转流,是字符流通向字节流的桥梁
InputStreamReader 流转String,是字节流通向字符流的桥梁
CharArrayReader 此类实现一个可用作字符输入流的字符缓冲区。
CharArrayWriter 此类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。
FileReader 用来读取字符文件的便捷类。
FilterWriter 用来写入字符文件的便捷类。
FileInputStream 从文件系统中的某个文件中获得输入字节。
FileOutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
ObjectOutputStream 对象序列化
ObjectInputStream 对象序列化
----------------------------- IO部分 文本文件编码------------------------------
读取文本文件内容,并正确指定编码
public static void main(String[] args) throws Exception { String path="d:\\计算.txt"; File file=new File(path); FileInputStream in=new FileInputStream(file); //文本文件编码是UTF-8,如果是其它,请修改下面 InputStreamReader read = new InputStreamReader(in, "UTF-8"); BufferedReader ra = new BufferedReader(read); String s=ra.readLine(); while(s!=null){ System.out.println(s); s=ra.readLine(); } }
写入文本文件,并正确指定编码
final File file = new File("d:\\a.txt"); if (!file.exists()) { new File(file.getParent()).mkdirs(); file.createNewFile(); //文件不存在,建立 } final Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); out.write("大量文字内容,比如HTML代码"); out.flush(); out.close();
问:用JAVA字符流向硬盘写一个a.txt文件时,默认情况下a.txt会使用什么字符集编码?
答:"字符流"默认用JVM中所设置的字符集编码, JVM是从系统变量file.encoding中读取操作系统的默认编码的字符集,来设置JVM的字符集编码的。
要查看系统的file.encoding参数,可以用以下代码:
public static void main(final String[] args) { final String encoding = System.getProperty("file.encoding"); System.out.println(encoding); }
结果与操作系统(我用MS Windows)的区域语言有关系,如下表
中文(中国) | GBK |
中文(新加坡) | GBK |
中文(香港特别行政区) | MS950 |
中文(澳门特别行政区) | MS950 |
中文(台湾) | MS950 |
---------------------------------Java 网络编码解码-----------------------------------------
java.net.URLEncoder
java.net.URLDecoder
try { String encodeStr = URLEncoder.encode("中国", "utf-8"); System.out.println("处理后:" + encodeStr); String decodeStr = URLDecoder.decode(encodeStr, "utf-8"); System.out.println("解码:" + decodeStr); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
处理后:%E4%B8%AD%E5%9B%BD
解码:中国
相关推荐
本资料"JAVA高级知识点整理.rar"主要涵盖了多线程、虚拟机、Java IO/NIO以及Java集合框架等核心主题,旨在帮助开发者深入理解Java平台的高级特性和最佳实践。 首先,多线程是Java编程中的重要组成部分,它允许程序...
"Java高级知识点详解系列"聚焦于几个核心领域:Java内存管理、泛型以及反射。这些概念在实际开发中至关重要,理解它们能够帮助开发者写出更高效、更灵活且更易于维护的代码。 1. **Java内存**:Java内存主要涉及堆...
Java相对高级的知识思维导图,如企业环境搭建、性能优化、高并发、大数据、高可用、可扩展以及应用框架等。有需要的可以下载。
Java高级知识整理是Java开发者进一步提升技能的关键环节,它涵盖了多线程、设计模式、反射、JVM优化、集合框架的深入理解等多个方面。初学者通过学习这些高级知识,能够更好地掌握Java编程的精髓,提高代码质量和...
java高级知识及类和对象知识
集中的知识点,适用于已经学过之后,快速过一遍复习(临时抱佛脚),比如面试前复习一下。不适用于没学过这些知识点的...包括spring注解,maven,git,java集合,泛型,jdk8,jvm参数,正则表达式,sql 洁牙密码:alex
**JAVA高级工程师知识图谱详解** 在信息技术领域,JAVA作为一种广泛应用的编程语言,对于成为一名优秀的JAVA高级工程师,需要掌握的知识点广泛且深入。本知识图谱涵盖了JAVA开发的关键概念、技术框架、工具库以及...
Java是目前企业开发中最常用的编程语言之一,Java面试知识点涵盖了Java语言的方方面面,包括Java基础知识、Java高级知识、Java设计模式、Java框架等等。以下是Java核心面试知识点的整理。 一、JVM JVM(Java ...
对于想要学习Java的初学者而言,本学习路线旨在覆盖从基础到高级,甚至是架构师级别的知识体系。以下是对所提供的文件内容的详细知识点解析: 1. 学习方法 - Java基础:指出了学习Java的首要任务是掌握其基础语法、...
Java 中高级核心知识全面解析 Java 是一种面向对象的编程语言,它具有平台独立性、多线程、网络编程等特点。本文将对 Java 中的高级核心知识进行全面解析,从基础知识到高级特性,全方位解析 Java 的核心技术。 一...
Java 高级面试题大全带答案(2021年...该资源涵盖了 Java 语言的各种知识点,包括 Java 变量和数据类型、Java 内存管理、Java 线程、Java 基础知识、Java 高级知识等,为学习和面试 Java 相关知识提供了有价值的参考。
Java高级工程师知识图谱
最近的java 面试知识点, 比较全的java基础知识面试知识,linux
本文将深入探讨Java的中高级核心知识,涵盖语言基础、面向对象特性、核心技术等多个方面。 **1. Java语言特点** Java语言的主要特点是:简单性、面向对象、健壮性、安全性、高效性、可移植性、多线程支持以及动态性...
Java 高级知识 * Java 中的高级语法:Java 中的高级语法包括 lambda 表达式、流式编程、Optional 等。在上面的程序代码中,使用了基本语法和高级语法的结合。 * Java 中的设计模式:Java 中的设计模式包括工厂模式...
下面将对Java的一些关键高级知识点进行详尽的阐述。 1. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口以及ExecutorService等。理解线程的同步和通信机制,如synchronized关键字、wait/...
"Java高级软件工程师面试题集(2020)" 该面试题集涵盖了 Java 方向的多个方面,包括基础知识、高级知识、数据库、程序设计、面试技巧等。下面是从该文件中生成的相关知识点: 一、面向对象的特征 * 抽象:抽象是...
本题库涵盖了 Java 语言的基础知识和高级知识,包括 Java 入门、数据类型和运算符、流程控制与数组、封装、继承、抽象类与接口、多态、异常、多线程机制、输入输出流、泛型和集合框架、基于 Swing 的图形用户界面...
java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料...
【Java高级知识体系】 在"张孝祥JAVA视频教程高级部分完整版"中,我们可以期待深入学习Java编程语言的高级特性和实践技巧。这通常涵盖了Java的多线程、网络编程、I/O流、反射、枚举、集合框架、设计模式、JVM优化等...