`

Java 高级知识

 
阅读更多

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)的区域语言有关系,如下表

 

标准和格式 JVM默认字符集
中文(中国) 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高级知识点整理.rar"主要涵盖了多线程、虚拟机、Java IO/NIO以及Java集合框架等核心主题,旨在帮助开发者深入理解Java平台的高级特性和最佳实践。 首先,多线程是Java编程中的重要组成部分,它允许程序...

    Java高级知识点详解系列

    "Java高级知识点详解系列"聚焦于几个核心领域:Java内存管理、泛型以及反射。这些概念在实际开发中至关重要,理解它们能够帮助开发者写出更高效、更灵活且更易于维护的代码。 1. **Java内存**:Java内存主要涉及堆...

    Java高级知识大纲

    Java相对高级的知识思维导图,如企业环境搭建、性能优化、高并发、大数据、高可用、可扩展以及应用框架等。有需要的可以下载。

    Java高级知识整理 初学者.zip

    Java高级知识整理是Java开发者进一步提升技能的关键环节,它涵盖了多线程、设计模式、反射、JVM优化、集合框架的深入理解等多个方面。初学者通过学习这些高级知识,能够更好地掌握Java编程的精髓,提高代码质量和...

    java高级知识及类和对象知识

    java高级知识及类和对象知识

    java高级知识点快速复习.zip

    集中的知识点,适用于已经学过之后,快速过一遍复习(临时抱佛脚),比如面试前复习一下。不适用于没学过这些知识点的...包括spring注解,maven,git,java集合,泛型,jdk8,jvm参数,正则表达式,sql 洁牙密码:alex

    JAVA高级工程师知识图谱_JAVA工程师知识图谱_java图谱_知识图谱_

    **JAVA高级工程师知识图谱详解** 在信息技术领域,JAVA作为一种广泛应用的编程语言,对于成为一名优秀的JAVA高级工程师,需要掌握的知识点广泛且深入。本知识图谱涵盖了JAVA开发的关键概念、技术框架、工具库以及...

    JAVA核心面试知识点整理

    Java是目前企业开发中最常用的编程语言之一,Java面试知识点涵盖了Java语言的方方面面,包括Java基础知识、Java高级知识、Java设计模式、Java框架等等。以下是Java核心面试知识点的整理。 一、JVM JVM(Java ...

    Java中高级核心知识全面解析.pdf

    Java 中高级核心知识全面解析 Java 是一种面向对象的编程语言,它具有平台独立性、多线程、网络编程等特点。本文将对 Java 中的高级核心知识进行全面解析,从基础知识到高级特性,全方位解析 Java 的核心技术。 一...

    Java最新2024学习路线+Java自学全套免费网盘资料

    对于想要学习Java的初学者而言,本学习路线旨在覆盖从基础到高级,甚至是架构师级别的知识体系。以下是对所提供的文件内容的详细知识点解析: 1. 学习方法 - Java基础:指出了学习Java的首要任务是掌握其基础语法、...

    Java高级面试题大全带答案(2021年Java面试题及答案整理)

    Java 高级面试题大全带答案(2021年...该资源涵盖了 Java 语言的各种知识点,包括 Java 变量和数据类型、Java 内存管理、Java 线程、Java 基础知识、Java 高级知识等,为学习和面试 Java 相关知识提供了有价值的参考。

    Java高级工程师知识图谱

    Java高级工程师知识图谱

    2018 java 面试知识点

    最近的java 面试知识点, 比较全的java基础知识面试知识,linux

    Java中高级核心知识全面解析(精华必看)

    本文将深入探讨Java的中高级核心知识,涵盖语言基础、面向对象特性、核心技术等多个方面。 **1. Java语言特点** Java语言的主要特点是:简单性、面向对象、健壮性、安全性、高效性、可移植性、多线程支持以及动态性...

    java高级工程师面试题及答案.docx

    Java 高级知识 * Java 中的高级语法:Java 中的高级语法包括 lambda 表达式、流式编程、Optional 等。在上面的程序代码中,使用了基本语法和高级语法的结合。 * Java 中的设计模式:Java 中的设计模式包括工厂模式...

    Java高级实用教程

    下面将对Java的一些关键高级知识点进行详尽的阐述。 1. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口以及ExecutorService等。理解线程的同步和通信机制,如synchronized关键字、wait/...

    Java高级软件工程师面试题集(2020).doc

    "Java高级软件工程师面试题集(2020)" 该面试题集涵盖了 Java 方向的多个方面,包括基础知识、高级知识、数据库、程序设计、面试技巧等。下面是从该文件中生成的相关知识点: 一、面向对象的特征 * 抽象:抽象是...

    Sun_Java程序员认证考试题库

    本题库涵盖了 Java 语言的基础知识和高级知识,包括 Java 入门、数据类型和运算符、流程控制与数组、封装、继承、抽象类与接口、多态、异常、多线程机制、输入输出流、泛型和集合框架、基于 Swing 的图形用户界面...

    本项目用于从头开始梳理Java知识体系,梳理路线为,Java基础—Java高级—Java并发—常用框架—常用中间件—.zip

    java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料...

    张孝祥JAVA视频教程高级部分完整版

    【Java高级知识体系】 在"张孝祥JAVA视频教程高级部分完整版"中,我们可以期待深入学习Java编程语言的高级特性和实践技巧。这通常涵盖了Java的多线程、网络编程、I/O流、反射、枚举、集合框架、设计模式、JVM优化等...

Global site tag (gtag.js) - Google Analytics