一,JAVA JDK,JVM,内存,垃圾处理

版权声明:随意 https://blog.csdn.net/caokangnsd/article/details/82555798

+

JDK:

JVM:JAVA虚拟机,加载.class并运行.class

JRE:JAVA运行环境除了包含JVM以外还包含运行JAVA程序所必须的环境,JRE=JVM+JAVA系统类库

JDK:JAVA开发工具包,除了包含JRE以外还包含开发JAVA程序所必须的命令工具JDK=JRE+编译、运行等工具

文件结构:

配置环境变量:

JAVA-HOME:E:\Java\jdk1.8.0_20

PATH:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

+

JAVA语言的运行过程:

JAVA经过javac.exe编译器编译成.class文件,在经过虚拟机加载运行,因为是虚拟机基础上运行的,所以只需要

在不同的操作系统上用不同的虚拟机就可以解释一样的代码。

+

JVM:

生命周期 :

启动JAVA程序时就产生了,任何一个有main方法的class都可以作为JVM的起点main方法是所有线程的开始,

线程分为守护线程和非守护线程,所有的非守护线程终止,那么JVM就终止了,

垃圾处理就是守护线程,当没有非守护线程守护时,守护线程就结束,JVM也终止了

JVM类加载:

Bootstrap Classloader

-JVM启动时初始化它,加载rt.jar中所有的class文件,无法被直接引用

Extendsion ClassLoader

-加载lib/ext目录中系统变量所指定的所有类库

Aplication ClassLoader

-用来加载用户路径上所指定的类库,包含指定的jar包以及目录,开发者可以直接使用

双亲委托模式,会主动向上一层的Classloader寻求加载,加载不了自己加载

过程:加载-验证-准备-解析-初始化-使用-卸载

+

内存分区:

栈:在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。

堆:堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由JAVA虚拟机的自动垃圾回收器来管理。

方法区 :方法区跟堆一样,被所有的线程共享。用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数

栈的存取速度比堆要快,仅次于寄存器,但缺点是,存在栈中的数据大小与生存期必须是确定的。

常量池:(常量池的位置目前是在堆中)避免频繁的创建和销毁对象

包装类的常量池技术:IntegerByteShortLongCharacter有一字节大小-128-127的正负常量池

String的字面量常量池:intern()方法,字面量或者运算结果放入到常量池,否则都为new出的对象

+

垃圾处理:GC清除方法区和堆,System.gc()

算法:标记算法,复制算法

当创建后应先在伊甸区存活,继续创建对象后会将还继续幸存的对象复制到幸存者区,当对象确实被长久使用,则继续将其转移

到有其他方式保存的老年代,持久代保存的多是不易改变的信息

+

JAVA1.5后更改

+泛型:

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 输出数组元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组
 
        System.out.println( "\n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组
 
        System.out.println( "\n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}
public class Box<T> {
   
  private T t;
 
  public void add(T t) {
    this.t = t;
  }
 
  public T get() {
    return t;
  }
 
  public static void main(String[] args) {
    Box<Integer> integerBox = new Box<Integer>();
    Box<String> stringBox = new Box<String>();
 
    integerBox.add(new Integer(10));
    stringBox.add(new String("菜鸟教程"));
 
    System.out.printf("整型值为 :%d\n\n", integerBox.get());
    System.out.printf("字符串为 :%s\n", stringBox.get());
  }
}

泛型中的通配符:可以解决当具体类型不确定的时候,这个通配符就是 ? ;当操作类型时,不需要使用类型的具体功能时,只使

用Object类中的功能。那么可以用 ? 通配符来表未知类型。

泛型限定:

上限:?extends E:表示这个对象的实例,可以接收E类型或者E的子类型对象。

下限:?super E:可以接收E类型或者E的父类型对象。

上限什么时候用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?因为取的时候,E类型既

可以接收E类对象,又可以接收E的子类型对象。下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型

接收,也可以用当前元素的父类型接收。

+Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性。

+增强for循环:

格式:// 增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器

for( 元素类型 变量名 : Collection集合 & 数组 ) {

}

+可变参数(...):用到函数的参数上,当要操作的同一个类型元素个数不确定的时候,可是用这个

方式,这个参数可以接受任意个数的同一类型的数据。

+静态导入:导入了类中的所有静态成员,简化静态成员的书写。

import static java.util.Collections.*; //导入了Collections类中的所有静态成员

+自动拆装箱:

基本---引用 Integer x = new Integer(x);

引用---基本 int num = x.intValue();

猜你喜欢

转载自blog.csdn.net/caokangnsd/article/details/82555798