JavaSE基础
Java源文件的执行原理
基础语法:&& 与 & 的区别,|| 与 | 的区别
(exp1) & (exp2) : exp1,exp2 都要执行 exp1和exp2都为true,结果为true,否则为false (exp1) | (exp2) : exp1,exp2 都要执行 exp1和exp2中只要有一个为true,结果为true,否则为false (exp1) && (exp2) : 若exp1 表达式返回false, exp2不执行,直接返回结果false 两个条件必须同时满足,才为true (exp1) || (exp2) : 若exp1 表达式返回true, exp2不执行,直接返回结果true 两个条件有一个为true,值为true
基础的排序:冒泡排序、快速排序
面向对象
1.内存:
栈:基本数据类型变量名与值,引用数据类型的变量名 堆:引用数据类型的值(对象的值,数组的值)
2.基本概念
JavaBean :无参构造函数 + get set 方法 POJO :简单Java对象 - 这些对象 是要持久化到数据库中
3.类加载
字节码文件--类加载器--验证--准备--解析--初始化--使用--卸载
1.类加载器:分配内存、垃圾回收、static代码执行、static变量初始化(static int a = 0)
2.验证:语法验证
3.准备:堆栈 本地方法
4.解析:
5.初始化 static int a = 10
4.static关键字
执行顺序
-
父类静态变量
-
父类静态代码块
-
子类静态变量
-
子类静态代码块
-
父类普通变量
-
父类普通代码块
-
父类构造函数
-
子类普通变量
-
子类普通代码块
-
子类构造函数
5.单例模式的三种写法
1.饿汉模式
public class Bank{ private static Bank bank = new Bank(); private Bank(){} public static Bank getBankInstance(){ return bank; } }
2.懒汉模式
public class Bank{ private static Bank bank = null; private Bank(){} public static Bank getBankInstance(){ if(bank == null) bank = new Bank(); return bank; } }
3.枚举(多线程、安全)
public class Bank{ private Bank(){} public static enum BankEnum{ BANK;//类加载 public static final BankEnum BANK = new BankEnum(); private Bank bank = null; private BnakEnum(){ bank = new Bank();//为什么 } public Bank getInstance(){ return bank; } } public static void main(String[] args){ Bank bank = BankEnum.BANK.getInstance(); } }
6.集合框架有哪些?
ArrayList和LinkList区别:
1.数据结构
ArrayList:本质是数组,元素的物理地址是连续的
LinkList:本质是链表,元素的物理地址是不连续的
2.增删改查元素
查元素:
因为ArrayList元素的物理地址是连续的,所以可以直接通过下标获得元素,速度很快O(1)
LinkList是链式结构,元素的物理地址是不连续的,查询元素需要遍历链表O(n)
增元素:
ArrayList可能会因为扩容,导致元素复制与内存的浪费,不适合大量元素频繁的添加
LinkList是链式结构,添加元素只需要消耗一个内存节点即可,不会对其他元素产生影响
所以,ArrayList适合于频繁的取元素,LinkList适合于频繁的添加、删除元素
Vector:本质也是数组,与ArrayList一样,但是是线程安全的
7.为什么要重写hashcode方法与equals方法
总结:
先通过hashcode方法返回的值,直接定位元素应该存储的物理位置,位置上没有元素则存放,若有元素,再比较对象的equals方法,从而大大减少equals方法调用,提高比较效率。
(1)为什么要重写equalas方法(理解)
Java中的集合(Collection)有两类,一类是List,再有一类是Set。 前者集合内的元素可以重复;后者元素不可重复。
那么我们怎么判断两个元素是否重复呢? 这就是Object.equals方法了。
通常想查找一个集合中是否包含某个对象,就是逐一取出每个元素与要查找的元素进行比较,
当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息。,
如果一个集合中有很多元素譬如成千上万的元素,并且没有包含要查找的对象时,
则意味着你的程序需要从该集合中取出成千上万个元素进行逐一比较才能得到结论,
于是,有人就发明了一种【【哈希算法来提高从集合中查找元素的效率】】,这种方式
将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,
每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域.
(2)为什么要重写hashcode方法(理解)
hashCode方法返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,
先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;
如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,
不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次
8.Integer和int的区别
9、记五个运行时和非运行时异常名称
10、什么是解箱,什么是封箱?
11.常用的字符串
1.String
字符串常量,final char[],字符串的值不能发生改变,用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。
String s1 = "hello";//final char[] value = {'h','e','l','l','o'}; s1 = "java"; String s2 = new String("hello"); s1 += "run";//hellorun s1.concat("run");//hellorun 适用于字符串的值不经常发生改变的情况
2.StringBuilder
字符串变量(非线程安全)在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。
StringBuilder是线程不安全的,故速度快
StringBuilder builder1 = new StringBuilder("hello"); 底层的本质:char[] value = new char[16]; {'h','e','l','l','o','','','',......}; builder1.append("run");//{'h','e','l','l','o','r','u','n',......};适用于字符串内容经常发生改变的时候,单线程中使用
3.StringBuffer
字符串变量(线程安全),与StringBuilder类似,可变的字符串
StringBuffer是线程安全的,线程安全会加同步锁,所以StringBuffer速度慢
适用多线程下在字符缓冲区进行大量操作的情况
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。