Java基础

Java 2大运行机制:

1.虚拟机JVM  :一个虚拟的计算机,具有指令集,负责执行指令、管理数据、内存、寄存器;不同平台有不同虚拟机:.java→编译.class→执行JVM(for windows、unix。。)

2.垃圾收集机制GC:提供系统级进程跟踪存储空间分配,在JVM空闲时检查并释放空间,自动进行无法精确控制干预。

Java特点:

1.面向对象:类(抽象概念定义)、对象(实例);封装、继承、多态

2.健壮性:对比c艹去掉指针、内存申请

3.跨平台:JVM负责java程序在相应操作系统中的运行

JDK:工具包;JRE:运行环境(体验:.java javac编译 java运行class文件)

配置环境变量:java工具目录bin配置到path中,能javac即可

一个java源文件只能一个public类

native、strictfp、transient、volatile、assert  命名0-9_$

包名:xxxyyyzzz     接口名类名:XxxYyyZzz    变量名函数名:xxxYyyZzz    常量名:XXX_YYY_ZZZ

类{成员变量 方法{局部变量}}

数据类型>基本数据类型+引用类型{类class{string字符串} 接口interface 数组[]}

byte1 short2 int float4 long double8字节

double>float>long>int>char+short>byte从下向上类型转换,上向下强制类型转换(精度降低或溢出),基本类型对应的包装类可以把字符串转换为基本类型

封装类:Boolean、Byte、Short、Integer、Long、Character、Float、Doube

int[] a  或者int a[]不能申明指定长度,只能创建指定如int a[]=new int[3]

类和对象

面向过程:结构体中函数是动宾关系;面向对象:主谓关系,

类是抽象,对象是实例:定义类,声明创建类的对象,调用对象的方法

栈内存存放地址?堆内存存放数据?栈内存指向对内存数据

匿名对象:new Person().shout(),只用一次方法就可以用匿名对象,作为实参传递给函数调用

类中同名方法的重载、父类方法的重写

成员方法中的this,指向调用这个方法的对象

jdk主要的包:lang(string math integer system thread)、net、io、util

类设计

extends:java类不能多重继承,只有一个父类,继承了父类的public、protected方法和属性

super:调用父类的属性、方法、构造器,不仅限于直接父类。(this调用子类的构造方法,super父类的构造方法,不能同时出现;第一行不是this或super会自动加上,且同一个类只能实例化一次,所以只能放在第一行)

多态:子类的对象可以替代父类的对象使用,父类类型的变量可以指向子类的对象。

  --声明为父类类型:属性是编译时确定的,编译时是父类,尽管引用的子类,但不能再访问子类添加的属性和方法

  --动态绑定:声明父类,调用方法时调用子类的方法。因为编译是父类,方法的调用是运行时确定的。

  方法的形参是父类,可以调用子类的形参作为实参调用

==比较两边的类型必须一致,equals是object的方法,只能比较引用类型。但比较File、String、Date、封装类比较类型类容不考虑是否是同一个对象。

toString返回类名+引用地址,String类重写,返回字符串的值。

高级特性

static:也叫类成员,静态成员可以直接引用访问,静态方法内部只能访问静态属性,静态块常用来类属性初始化。

abstract:只有方法声明没有实现

interface:只有常量、方法的定义,没有变量和实现,一个类可以实现多个接口

inner class:引用时必须给出完整名称,可以使用包含类的静态和实例成员变量,static内部类不能有static成员,非静态内部类只能有静态的final型常量。

6.异常:

error:JVM系统内部错误、资源耗尽等严重情况;Exception编程错误或偶然问题

Throwable>(Error>LinkageError+VirtualMachineError+AWTError)+(Exception>(RuntimeException>类型转换+下标越界+空指针)+...+IOException)

抓抛模型:抛出异常,从调用方法到调用者一级一级捕获,只针对Exception,Error无效

try catch{getMessage()  printStackTrace()} finally  显式抛出异常

7.集合

Collection>List+Set+Queue

Iterator迭代器{Iterator/remove/reationAll/toArray/next/hasNext}

set{用equals判断}>

  (HashSet{hashCode存储,equals相等且hash相等才相等}

    >LinkedHashSet{hash存储位置,链表维护次序,看起来是插入顺序保存,访问性能高,插入性能略低})

  +TreeSet{comparator/first/last/lower/subSet/headSet/tailSet,支持自然排序和定制排序,实现SortedSet确保集合处于排序状态||自然排序:调用compareTo方法升序排序,把对象加入TreeSet必须实现Comparable接口必须实现compare方法||定制排序:创建TreeSet集合时提供一个Comparator接口的实现类对象}

List{索引访问指定位置add/addAll/get/indexOf/lastIndexOf/remove/set/subList

额外提供listIterator方法,返回ListIterator对象hasPrevious/previous/add}

  >vector线程安全

  +arrayList线程不安全{Arrays.asList返回一个固定长度的List集合}

map{指定key找到唯一确定的Value clear/containsKey/containsValue/entrySet/equals/get/hashCode/isEmpty/KeySet/put/putAll/remove/size/values}

  >(HashTable{古老不建议用}

      >Properties{HashTable的子类,处理属性文件故都是字符串类型})

  +(HashMap{不能保证元素对的顺序,equals和hashCode返回ok}

      >LinkedHashMap{hashMap的子类,可以维护迭代顺序顺序与插入一致。})

  +TreeMap{存储时对key-value排序;自然排序:实现Comparable接口且key必须是同一个类的对象。定制排序:创建时传入一个Comparable对象负责对所有key排序,不需要map的key实现接口}

Collections工具类

操作Set List Map集合,排序{reverse/shuffle随机排序/sort/swap}、查询{max/min/frequency}、修改{replaceAll}等操作,

对集合设置不可变、同步控制{synchronizedCollection.List.Map.Set.SortedMap.SortedSet多进程并发访问集合的安全问题}等方法

Enumeration是Iterator的古老版本

8.泛型(generics)

  List<Integer> myIntList = new ArrayList<Integer>();//把集合中的类型限定为特定的数据类型。

  myIntList.add(new Integer(0));

<E>泛型:增加可读性,编译时检查增加稳定性

  public interface Iterator<E>{}

  若Foo是Bar的子类型,G是泛型,G<Foo>是G<Bar>的子类型并不成立

?通配符:Collection<Object>并不是任何Collections的父类,Collections<?>是父类

  public void drawAll(List<Shape> shapes){};//只能使用Shape的list来调用,不能对List<Circle>调用

  public void drawAll(List<? extends Shape> shapes);//可以是其子类任意通配符

限制通配符:Shape是上限,代价是向shapes中写入是非法的,因为没有确定是什么类型。

  static void fromArrayToCollection(Object[] a, Collection<?> c){}//用一个object数组和一个collection作为参数,尝试把所有object放入collection中

泛型方法:static <T> void fromArrayToCollection(T[] a, Collection<T> c){}//泛型方法,把方法的生命繁星花

9.枚举类  

枚举:

  enum定义的枚举类默认继承了java.lang.Enum类,构造器只能private,所有实例必须显式列出,自动添加public static final修饰,提供values方法遍历

注解: 可以在编译、加载、运行时被读取,并执行相应的处理。不改变原有逻辑情况下补充信息。修饰包、类、构造器、方法、成员变量、参数、局部变量声明。

@Override重写父类方法、@Deprecated元素已过时、@SuppressWarnings抑制编译器警告

@Retention指定注解可以保留多久@Target指定修饰注解能修饰哪些程序元素@Documented将被javadoc工具提取成文档@Inherited被修饰的元素将具有继承性,子类自动拥有该注释。

10.IO

  输入:外→程序内存中

File类:

  操作平台无关的文件/目录,不能访问内容本身

  (File:文件名getName/renameTo检测exists操作createNewFile/delete/mkDir)

IO流:

  输入流/输出流;字节流(8位字节)/字符流(16位字节);

  角色:节点流(从IO读写数据的流)/处理流(封装节点流连接来读写操作)

InputStream & Reader:所有输入流的基类

  FileInputStream{int read(byte[] b)}

  Reader(int read[char[] c])

  文件IO资源不属于内存的资源,GC无法回收,应该显式关闭文件IO资源。

OutputStream & Writer{write}

对象序列化:

  序列化就是把对象保存到磁盘上,或者允许网上传输

  序列化是RMI远程方法调用必须实现的机制,后者是J2EE的基础

  必须实现两个接口之一:Serializable、Externalizable

  

11.常用类

String(String(char a[])startsWith/endsWith/compareTo/contains/indexOf/subString/trim)

  >基本数据的转化parseInt

  >getChars字符串放到数组中 toCharArray全部字符放到一个字符数组中

  >getBytes使用平台编码,将当前字符串转为字节数组

StringBuffer{append效率低} &StringBuilder效率高

Date{SimpleDateFormat/format}  (Random  Math)

12.反射

Class类、Java类加载机制、ClassLoader类加载、反射机制、Constructor、动态代理

反射:运行时构造任意类的对象,获取。。,生成动态代理

>Class:JRE为每一个保留一个Class对象,获得属性、方法、构造器,实现的接口

类的对象newInstance

Constructor对象:getConstructor、setAccessible

method:获取getMethod(s) getDeclaredMethod     其方法invoke

Annotation:get...

泛型:getGenerSuperclass、泛型类型ParameterizedType、getActualTypeArguments获取实际的泛型参数数组

创建动态代理Proxy:AOP

ClassforName//getName/getSuperClass/getInterfaces/getClassLoader/getSuperclass

+ClassLoader:把类装载进JVM

13.多线程

进程:系统运行一个程序就是从进程创建、运行、消亡的过程

线程:程序中耽搁顺序的流控制,时间片

创建多线程:1、创建Thread的子类,重写run方法。2创建Runnable的实现类,实现run方法

run方法:线程运行时会执行的代码,start方法:启动一个新的线程,虚拟机调用其run方法

线程的生命周期对Thread进行操作:new新建(start)调用了start可执行runnable(调度|←yield)运行run(sleep/其他线程join/IO被动)阻塞blocking(←interrupt)、死亡(IsAlive)

线程调度:分时调度/优先级抢占调度

线程安全:多线程应用访问共享对象时,抢CPU控制权,一个线程夹在另一个线程中可能导致执行错误。

synchronized同步方法、同步代码块,区别是控制范围不同

线程通信:线程的同步方法,其中某个变量需要其他线程修改才能符合,用wait出让cpu,notify唤醒结束等待

记住:线程就是为了更好地利用CPU,提高程序运行速率的!

what   why    how

struts是线程安全的,但bug太多。

原文地址:https://www.cnblogs.com/tabCtrlShift/p/5952897.html