`

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最新2024学习路线+Java自学全套免费网盘资料

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

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

    Java 中高级核心知识全面解析 Java 是一种面向对象的编程语言,它具有平台独立性、多线程、网络编程等特点。本文将对 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