Java有自动的垃圾回收器,不须要人工回收内存,例如,文件或使用了系统资源的另外一个对象的句柄。在这种状况下,当资源的再也不须要时,将其回收和再利用将显得十分重要。能够为任何一个类添加 finalize 方法。finalize 方法将在垃圾回收器清除对象以前调用 。在实际应用中,不要依赖于使用finalize 方法回收任何短缺的资源 , 这是由于很难知道这个方法何时才可以调用。(这点实际上是和net机制是同样的)html
Java包概念其实就是net中命名空间java
综上所述 : • 只能在继承层次内进行类型转换 。 • 在将超类转换成子类以前 ,应该使用instanceof 进行检查。segmentfault
abstract中能够包含具体实现,不能被实例化,同C#是同样的。数组
Java 中它容许在运行时肯定数组的大小数据结构
对象中的数据称为实例域 ( instance field ) , 操纵数据的过程称为方法 ( method )app
数组列表(ArryList)的容量与数组的大小有一个很是重要的区别。若是为数组分配 100 个元素的存储空间,数组就有100 个空位置可使用 。而容量为 100 个元素的数组列表只是拥有保存 100 个元素的潜力 ( 实际上,从新分配空间的话 , 将会超过100 ) , 可是在最初 ,甚至完成初始化构造以后 ,数组列表根本就不含有任何元素 。jvm
一旦可以确认数组列表的大小再也不发生变化,就能够调用 trimToSize 方法 。这个方法将存储区域的大小调整为当前元素数量所须要的存储空间数目。垃圾回收器将回收多余的存储空间。spa
有时,须要将 int 这样的基本类型转换为对象。全部的基本类型都冇一个与之对应的类。。例如,Integer 类对应基本类型 int.一般,这些类称为包装器( wrapper ).net
装箱和拆箱是编译器承认的,而不是虚拟机。编译器在生成类的字节码时,插人必要的方法调用。虚拟机只是执行这些字节码 。线程
除非全部继承的方法都有意义,不然不要使用继承
在覆盖方法事,不要改变预期的行为 假如我就是要这样设计,Holiday类继承GregorianCalendar类,那么我只能把共有方法add覆盖成合理的代码,或者什么都不作,或者抛出一个异常。可是add方法变味了,变的不像我当初设计的那样了。这里做者的意思是:不要这样,在覆盖父类中的方法时,不要偏离最初的设计想法。
使用多态,而非类型信息
有了抽象类为何还要引入接口?
使用抽象类表示通用属性存在这样一个问题:每一个类只能扩展于一个类。 接口能够提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。
接口中支持静态方法
public interface InterfaceA { static void getName() { System.out.println("6666"); } }
默认方法
public interface InterfaceA { default void getName() { System.out.println("6666"); } }
默认方法解决冲突
超类优先
内部类是一种编译器现象,与虚拟机无关。编译器将会把内部类翻译成用$分隔外部类名与内部类名的常规类文件,而虚拟机则对此一无所知。
TalkingClock$TimePrinter.class
内部类:http://www.javashuo.com/article/p-qxqvuwlq-eb.html
http://www.javashuo.com/article/p-ykcbqdos-da.html
若是在子类中覆盖了超类的一个方法,子类方法中声明的受查异常不能比超类方 法中声明的异常更通用( 也就是说,子类方法中能够抛出更特定的异常,或者根本不抛出任何异常。特别须要说明的是,若是超类方法没有抛出任何受查常,子类也不能抛出任何受查异常。
带资源的try语句 try - with - resources ) 的最简形式为 : try ( Resource res = . . . ) { work with res }
try块退出时,会自动调用res.close。
静态的Thread.getAllStackTrace()方法,它能够产生全部线程的堆栈轨迹。
Map<Thread,StackTraceElement[ ]> map = Thread.getAl1StackTraces(); for ( Thread t : map .keySet()) { StackTraceElement[ ] frames = map.get( t ) ; analyze frames }
全局日志记录器
Logger.getClobal().info()
关闭/开启全部级别记录
Logger.getClobal().setLevel(Level.OFF)
Level.ALL
获取记录器
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp")
修改日志管理器配置
配置文件地址:jre/lib/1ogging.properties
日志管理器在VM启动过程当中初始化,这在 main 执行以前完成。若是在main中调用 System.setProperty("java.util.logging.config.file",file) ,也会调用LogManager.readConfiguration( )来从新初始化曰志管理器。
前期泛型程序设计是用继承实现的,ArrayList类只维护一个Object引用的数组:
public class ArrayList{ private Object [ ] elementData; public Object get ( int i ) { } public void add ( Object o ) { } }
这种方式存在的问题:
public static <T extends Coiparab1e> T min(T[] a) { }
一个类型变量或通配符能够有多个限定,T extends Comparable & Serializable 限定类型用 “ & ” 分隔,而逗号用来分隔类型变量
https://www.cnblogs.com/DebugLZQ/archive/2012/09/03/2669383.html
http://www.javashuo.com/article/p-stdyutiz-ga.html
https://blog.csdn.net/tianshiainiforever/article/details/51698863
http://www.javashuo.com/article/p-rqpfykzm-dz.html
Iterator 接口的 remove 方法将会删除上次调用 next 方法时返回的元素。 在决定删除某个元素以前应该先看一下这个元素是很具备实际意义的。然而,若是想要删除指定位置上的元素,仍然须要越过这个元素。若是调用remove以前没有调用 next 将是不合法的。若是这样作,将会抛出一个 IllegalStateException 异常。
Iterator<String> it = c.iterator(); it.next(); it.remove();
优先级队列使用了一个优雅且高效的数据结构,称为堆( heap )。堆(可不是jvm中的堆)是一个能够自我调整的二叉树,对树执行添加( add ),和删除 ( remore ) 操做,可让最小的元素移动到根,而没必要花费时间对元素进行排序。