http://www.cnblogs.com/wanliwang01/p/java_core.htmlhtml
Java核心編程部分的基礎學習內容就不一一介紹了,本文的重點是JAVA中相對複雜的一些概念,主體內容以下圖所示。java
反射reflect是理解Java語言工做原理的基礎,Java編譯器首先須要將咱們編寫的.java源文件編譯爲.class字節碼,而後再JVM虛擬機上運行,接下來經過一個表格,來了解反射的基本操做。編程
功能數組 |
示例安全 |
泛化的Class引用併發 |
Class<?> intClass = int.classapp Class<? extends Number> bounded = int.classide Class<? super Person> per = Person.clss.getSuperClass();函數式編程 type.newInstance();函數 |
類型轉換前先作檢查 |
Instanceof() @SuppressWarnings("unchecked") |
反射操做 |
Class<?> x = Class.forName("xxx"); Method[] methods = x.getMethods(); Constructor[] ctors = x.getConstructors(); Method m = x.getDeclaredMethod("name"); m.setAccessible(true); m.invoke(new XXX()); |
動態代理 |
DynamicProxyHandler implements InvocationHandler… Proxy.newProxyInstance(X.class.getClassLoader(), new Class[]{X.classs} , new DynamicProxyHandler(real)); |
泛型接口 |
public interfacte Generator<T>{T next();} |
泛型方法 |
public <T> T get(); |
匿名內部類 |
很是重要的概念,在jdk1.8如下時,須要使用該方式實現函數函數式編程 List<String> ids = Lists.transform(travelTicketList, new Function<TravelTicketInfoDTO, String>() { @Override public String apply(TravelTicketInfoDTO dto) { return dto.getId(); } }); 爲了兼容性,泛型存在編譯時進行擦除的操做。 |
泛型的邊界限制 |
class A<T extends Dimension & HasColor & Weight> |
Tip:
使用類的準備工做包括3個步驟:加載,由類加載器執行,查找classpath指定路徑,並從字節碼中建立一個Class對象;連接,驗證字節碼,爲靜態域分配空間;初始化,首先初始化超類,而後執行靜態初始化器和初始化塊。
Tuple元組的概念(C#中很經常使用),將一組對象直接打包存儲的一個對象,該對象只能讀取,且不能新增。
JDK提供的容器很是的多,主要的有HashMap,HashSet,ArrayList、LinkedList,以及最多見的數組。
定義 |
詮釋 |
List |
ArrayList, LinkedList |
Set |
HashSet, TreeSet, LinkedHashSet Tree表示其底層經過tree結構存儲,保持有序 |
Map |
HashMap,TreeMap,LinkedHashMap,IdentityHashMap |
Queue, Stack |
|
Enum |
其繼承之Enum,默認提供一個values方法(編譯時織入)用於獲取枚舉類型數組 平常使用中,一般須要添加value和describe兩個參數和1個valueOf的方法,方面展現 在java中,switch和enum很容易實現狀態機,職責鏈等;EnumMap/Set的使用; |
Tip:
Collections類中提供了不少的的便捷方法用於容器操做,此外,guava庫對以上的容器類型提供了一個很是有用的擴充,尤爲是XXXs.xxx也提供類不少便捷的靜態方法。
在使用集合時,必定要注意其可變性,以及線程安全等問題,纔不容易出錯。
好比系統提供的線程安全的集,List<String> list = Collections.synchronizedList(new ArrayList<String>());
當針對大對象時,爲了便於垃圾回收,java提供了Reference類及其子類,SoftReference,WeakReference,PhantomReference,WeakHashMap等。
提到併發,不可避免的設計不少的概念,但這裏就不一一介紹,這兒將經過解決問題的方式來展現java併發方面的知識,快速便捷的實現"靴子落地"。
問題 |
解決方案 |
如何建立一個任務? |
ExecutorService exec = Executors.newFixedThreadPool(5); exec.execute(new Runnable() { public void run() { } }); |
如何在任務中返回值? |
class CallDemo implements Callable<String> |
如何休眠? |
Thread.sleep(500); TimeUnit.MILLISECONDS.sleep(500); |
如何設置優先級? 如何讓出控制權? 如何設置爲後臺線程 |
Thread.currentThread().setPriority(1); Thread.yield(); thread.setDaemon(true); |
如何處理異常 |
MyUncaghtExceptionHandler implements UncaughtExceptionHandler t.setUncaughtExceptionHandler(new MyUncaghtExceptionHandler()); |
如何解決共享資源競爭 |
lock.lock();
synchronized (new Object()) {}
ThreadLocal<Integer> value = new ThreadLocal<Integer>(); |
如何終結和中斷任務 |
exec.shutdown(); Future<?> f= exec.submit(new ExceptionThread()); f.cancel(true); while(Thread.interrupted()){ |
線程之間如何協做 |
wait(), notifyAll(), 生產者消費者模式 死鎖, 哲學家就餐問題 |
Java有什麼同步工具類麼? |
CountDownLatch, CyclicBarrier, DelayQueue, PriorityBlockingQueue ScheduledExecutor, Semaphore, Exchanger 此外,還提供了不少免鎖容器,好比ConcurrentHashMap |
Java提供了很是全面的I/O功能,經過一個表格來熟悉經常使用類,具體操做實現當時查找資料便可。
基礎類型 |
實現類 |
InputStream |
ByteArrayInputStream, StringBufferInputStream, FileInputStream |
OutputStream |
..對應input |
FilterInput/OutputStream |
DataInputStream, BufferedInputStream |
Reader/Writer |
InputStreamReader, OutputStreamWriter, FileReader, FileWriter, StringReader… |
Java nio |
通道和緩衝器 ByteBuffer, CharBuffer, |
文件加鎖 |
FileOutputStream fos = new FileOutputStream("xxx"); FileLock fl = fos.getChannel().tryLock(); |
文件壓縮 |
CheckedInputStream, ZipOutputStream |
Serializable |
writeObject, readObject |
Java提供了3中標準註解和4種元註解,加粗部分爲最經常使用的選項。
定義 |
詮釋 |
標準註解 |
@Override, @Deprecated, @SuppressWarnings |
@Target |
CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE |
@Retention |
SOURCE, CLASS, RUNTIME |
其餘 |
@Documented , @Inherited |
建立註解 |
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AnnoStudy { public int id() default -1; } |
操做註解 |
AnnoStudy anno = CollectionStudy.class.getMethod("first", null).getAnnotation(AnnoStudy.class); |