社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
.java——编译——.class(字节码,可移植)——jvm执行
JDK:java development kit Java开发工具
JRE:Java runtime environment Java运行环境
PATH:操作系统的环境属性,指的是可执行命令的程序路径
CLASSPATH:.class的执行路径
str.getbyte["UTF8"],获取str的UTF8编码字节
new String(str.getbyte["UTF8"],“UTF8”);将编码字节以UTF8进行编码输出
1、注释、标识符、关键字
(1)注释://,/**/,/** */ @author
(2)数字字母下划线$组成,不能以数字开头,不能是关键字
2、数据类型
(1)基本数据类型
整型:byte、short、int、long
浮点型:float、double
字符型:char
布尔型:false、true
(2)引用数据类型
接口、类、数组
(3)默认为int、double
(4)大数转小数(强制转型)、小数转大数(自动转型)
(5)double中的精度丢失使用doubledecimal解决
(6)局部变量必须初始化,成员变量有默认
(7)获取Integer.MAX_VALUE/Integer.MIN_VALUE
3、运算符
<<:带符号左移(符号位不动)左移几位就是乘以2的几次方
>>:带符号右移(符号位不动)右移几位就是除以2的几次方
>>>:无符号右移动(符号位移动,负数时候用补码
4、程序结构
switch(整型(shortbyteint)charString),不支持long
5、方法
(1)方法重载:方法名称相同、参数个数或者类型不相同,无需关注返回值
(2)方法覆盖:方法名称、参数列表、返回值都相同
(3)方法递归:子方法的实现与原方法实现原理一致,自己则调用自己,但是递归要有出口
1、类与对象
类是对象的抽象蓝图,对象是类的具体实例
2、封装性、继承性、多态性
(1)封装性:对内可见,对外不可见。使用private封装、使用setter()、getter()进行修改
(2)继承性:方法重载、方法覆盖
(3)多态性:一个类可以实现多个接口、一个接口可以继承好多接口
3、构造方法
(1)如果没有写则系统默认一个无参构造,写了就没有默认的
(2)创建一个对象后第一个执行的方法
(3)构造方法支持重载,可以写多个,调用的时候根据参数的类型来选择调用哪一个
(4)使用this.构造方法必须在第一行
4、匿名对象
匿名对象:没有一个栈上的内存指向的堆空间,用完一次后直接被GC回收。
5、数组
(1)静态动态创建数组
(2)方法接收数组、方法修改数组、方法返回数组
(3)java.util.Arrays.sort(array):升序
Stystem.arraycopy(sour array,int begin,目标数组,int begin ,int end);
int [] array=java.util.Arrays.copyOfRange(array,0,array.length(拷贝长度,不是数组的下标))
(4)二维数组打印
public class test{
public static void main(String [] args) {
int [][] array=new int [][]{{1,2,3},{4,5,6}};
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
}
6、String类
7、this与super
8、引用传递
9、static关键字
10、代码块
11、抽象类、接口
12、Object类
13、匿名内部类、内类
14、异常
15、包的使用
16、新特性
17、反射
(1)反射:通过Class.forName(“包+类名”)找到该类,使用Object类型接收newInstance()出的实例化对象,再通过向下转型获取自己需要使用的对象,反射中不需要new关键字,降低程序耦合性。然后再调用类的构造方法、属性、普通方法等操作创建对象。后期的JavaEE中的开源框架就是根据反射得来的。java.lang.reflect
(2)反射三种用法
对象.getClass()
通过类.getClass()
Class.forName("类路径")
(3)反射使用
获取父类信息
getClass.getPackage
getClass.getName
获取构造方法
获取无参构造方法getConstruter()
获取有参构造方法getConstruter(类型.class)
获取普通方法
获取类中全部的public 方法getMethod()
获取类中指定的public 方法getMethod("方法名",方法类型)
Method中的invoke(object o,para)执行某个t对象所指定的方法
获取类属性
获取父类属性getFields()
获取本类属性getDeclaredFields()
调用settergetter,直接用获取的属性调用
(4)classLoad()类加载器:通过一个类的全限定名来获取描述该类的二进制字节流,该过程在jvm外部执行(外部执行模块:BootStarpExtclassLoadAppClassLoad自定义类加载器)
1、Collection接口
(1)List、Set都实现了Collection接口
(2)List:允许数据重复,Set:不允许数据重复
(3)List拥有get(),set()方法,可以通过get()访问list元素
(4)List三种实现:ArrayList()、Vector()、LinkedList()
(5)操作java简单类的时候List中的contains(Oject O)remove(Object 0)需要覆写父类中的equals(),toString()
(6)ArrayList、Vector、LinkedList联系与区别?
这三个都是List下常用子类
ArrayList与Vector都是基于数组实现、LinkedList()是基于链表实现
ArrayList、LinkedList线程不安全、性能高,Vector线程安全,性能较低
ArrayList扩容为原来的1.5倍,Vector扩容为原来2倍
ArrayList采用懒加载,第一次使用时才初始化一个为10的数组,Vector直接初始化一个为10的数组
ArrayList适用于大部分场合使用,LinkedList适用于在某一位置增删改查使用
/*
ArrayList()扩容源码
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//新的数组长度为原来的1.5倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
//Vector扩容
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
(7)Set接口没有对Collection进行扩充,没有get方法,只能使用toArray使用下标访问元素。常用子类HashSet、TreeSet
(8)HashSet无序不重复、TreeSet有序重复(覆写compareTo()实现排序,升序)
(9)面试题:
**Set不允许元素重复判断机制:TreeSet实现Comparable接口比较,HashSet通过(HashCode,equals同时比较)
**先通过HashCode找到对应元素位置,再用equal进行比较,只有两者都相同才可以算元素重复可以消除
**保存自定义类型时候使用List,保存系统文件使用Set(避免重复)
1、运行时区域:
(1)线程私有:程序计数器(唯一一个没有标记OOM的区域)、java方法栈(存放局部变量表、方法出口等)、本地方法栈
(2)线程共享:堆(存放实例)、方法区(存放已经加载过的类的信息)、运行时常量池(方法区的一部分,存放字面量(基本数据类型、常量等)与标识符(类的全限定名、方法的名称与描述符等)
2、GC
(1)如何判断对象的存活?
**java采用可达性分析法:对象有能够到达GCroots的路径(GCroots:引用类型、静态变量、常量)
**引入计数器:根据计数器的值判断是否存活,引用对象值加一,释放引用减一,直到值为0。--!不能避免内存泄漏,造成对象无法回收
(2)对象的自我拯救
若对象的类覆写了finalize()方法
没有调用过finalize(),直接调用可以自我拯救
调用过finalize(),不能进行拯救,标记为不在存活,可以进行GC
若对象的类没有覆写finalize()方法,直接标记为不在存活,可以进行GC
(3)GC回收算法
1、堆被分为新生代与老年代
2、新生代被分为Eden区、survivor-From、survivor-To,比例为(8-1-1:也就是在新生代中实际可以利用的内存空间是90%)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!