You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.3 KiB

collection集合类

img_2.png

利用set可以去重

-添加内容add

遍历set使用迭代器iterator生成迭代器对象使用next方法

set集合类

  • 遍历方法

-Iterator ite=list.iterator(); while(ite.hasNext())

输出内容

  • iterator.next

map集合类

Integer

Integer.MAX_VALUE 2^31-1

对象创建过程

  • 分配空间

String

  • String是final修饰新对象,线程安全
  • stringBUffer是线程安全的
  • StringBUilder 不是线程安全的

GC算法的理解

  • 标记清除算法
  • 标记复制算法
  • 标记整理算法

hashmap扩容

  • img_3.png
  • 在扩容时会出现死循环

接口

  • 必须实现全部的抽象方法
  • 接口可以多继承
  • 接口中直接带有方法体1.8 默认方法、静态方法(必须接口调用)、私有方法
  • 父类,接口 方法名字一样,优先父类方法
  • 多继承的方法可以重复,如果有默认方法需要在实现里面重写

拷贝

img_4.png

java内存泄露

  • 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。
  • 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。
  • img_6.png
  • Vector v = new Vector(10);
  • Object o = new Object(); v.add(o);
  • v = null
  • 仅仅释放v是不够的
  • GC为了能够正确释放对象会监控每个对象的运行状况对他们的申请、引用、被引用、赋值等状况进行监控Java会使用有向图的方法进行管理内存实时监控对象是否可以达到如果不可到达则就将其回收这样也可以消除引用循环的问题。

内存泄露的原因

  • 长生命周期的对象持有短生命周期对象的引用
  • img_7.png
  • HashMap、Vector等的使用最容易出现内存泄露这些静态变量的生命周期和应用程序一致他们所引用的所有的对象Object也不能被释放
  • 监听器我们会调用一个控件的诸如addXXXListener() 等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。
  • 连接数据库连接dataSourse.getConnection()),网络连接(socket)和io连接除非其显式的调用了其close() 方法将其连接关闭否则是不会自动被GC 回收的
  • 内部类和外部模块的引用:
  • 单例模式:单例对象在初始化后将在 JVM 的整个生命周期中存在(以静态变量的方式)

java内存分配策略

  • Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配 对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。
  • 静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
  • 栈区 :当方法被执行时,方法体内的局部变量(其中包括基础数据类型、对象的引用)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  • 堆区 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存,也就是对象的实例。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。

避免内存泄露的方法

  • 在确认一个对象无用后将其所有引用显式的置为null
  • 在设一个引用变量为 null 值之前,应注意该引用变量指向的对象是否被监听,若有,要首先除去监听器,然后才可以赋空值;
  • 如果有数据库连接,使用 try…finally 结构,在 finally 中关闭 Statement 对象和连接。
  • 特别注意一些像 HashMap 、ArrayList 的集合对象,它们经常会引发内存泄漏。当它们被声明为 static 时,它们的生命周期就会和应用程序一样长。
  • 特别注意 事件监听 和 回调函数 。当一个监听器在使用的时候被注册,但不再使用之后却未被反注册。

内部类

  • 广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
  • 成员内部类可以无条件访问外部类的所有成员属性和成员方法包括private成员和静态成员
  • 在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:
  • 局部内部类:是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
  • 使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。
  • 静态内部类也是定义在另一个类里面的类只不过在类的前面多了一个关键字static。它不能使用外部类的非static成员变量或者方法