CSDN软件工程师能力认证是由CSDN制定并推出的一个能力认证标准,宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备,为国家数字化战略贡献力量。
我们每天将都会精选CSDN站内技术文章供大家学习,帮助大家系统化学习IT技术。
JavaSE基础
1.对象实例化
(1)Class.forName(“类的全名称”);
(2)Person person = new Person();
2.类的重载:
类名相同,形参列表不同(类型,顺载序,个数),system.out.println();也是方法重
3.不定长参数,本质是一个数组形式,int…a
- 定义方法时不确定有几个入参时使用
- 一个方法中只能有一个,位于形参末尾
4.方法中使用全局变量 this
- 全局变量(成员变量/成员属性):编写在类中
- 局部变量:声明在方法或者代码块中
5.形参列表中的变量是局部变量
6.构造方法的作用:
使用构造方法创建对象并且可以为类中的属性赋值(实例化对象)
- 构造方法在创建的时候就给对象初始化; 一个对象建立构造方法只能运行一次;
- 一般方法是对象调用才执行,给对象添加对象具备的功能; 一般方法可以被对象多次调用;
注意:多态分类
运行时多态(重写时多态)
父类引用接收子类的对象
编译时多态
方法重载方法名相同形参列表不同
7.父类和子类中,静态代码块、代码块、构造方法、普通方法执行顺序
父类中的静态变量和静态代码块
子类中的静态变量和静态代码块
父类中的普通变量和代码块->构造方法
子类中的普通变量和代码块->构造方法
变量和代码块的执行与声明顺序有关,变量一般声明在代码块前
8.修饰符修饰范围
9.子类只能继承父类非private的方法
10.instanceof
instanceof是一个二元操作符,用法是:boolean result = a instanceof ClassA,即判断对象a是否是类Class A的实例,如果是的话,则返回true,否则返回false。向下转型,需要先向上转型,而且只能转化为本类对象
11.抽象方法不可以被private修饰
12.抽象类和接口的比较
|
抽象类 |
接口 |
构造方法 |
可以有 |
不可以有 |
方法 |
可以有抽象方法和普通方法 |
只能有抽象方法,但1.8版本之后可以有默认方法 |
实现 |
子类用extend来实现 |
用implments实现 |
修饰符 |
public、default、protected |
默认public |
变量 |
可以有常量也可以有变量 |
只能是静态常量默认有public static final修饰 |
main方法 |
可以有 |
不可以有 |
多继承 |
单继承 |
实现多个接口 |
静态方法 |
可以有 |
不可以 |
速度 |
比较快 |
比较慢 |
13.匿名内部类常用于实现接口或抽象类
14.基本类型的包装类
int – Interger char – character
在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数 据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。
15.Integer.parseInt()和 Integer.valueOf()
Integer.parseInt()返回值为基本数据类型
Integer.valueOf()返回值为包装类型
16.Object类中的方法:
equals(),finalize(),clone(),getClass()(返回运行时的类,有且仅有一份,可用 对象.getClass() 或者 forName.getClass(),)wait(),notify(),notifyAll(),hashCode(),toString().
17.String,StringBuffer,StringBulider的区别
String只读字符串,意味着其引用的字符串内容不能发生改变
StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
StringBuilder 是 Jdk1.5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,
因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比StringBuffer 要高。
18.BigDemail用于精确计算
19.集合只能存放抽象数据类型
20.两个对象相等,hashCode一定相同,但hashCode相同不一定是同一个对象
21.equals 方法被覆盖之后,hashCode也一定会被覆盖
22.ArrayList,Vector 使用数组实现,LinkedList使用的是双向链表
23.ArrayList常用方法:
set(),get(),size(); HashMap常用方法:put():添加对象:get():获得对象的值;
size():查看集合中的数据有多少个
迭代方式
- for循环
- foreach
- 迭代器(collection接口下的集合都可使用)
4.jdk1.8中出现了stream流
Map迭代 (1)将Map转化为Set集合,使用keySet
Set<String> keySet = mapkeySet();
(2)1.8新特性
map.forEach((k,v)->{
system.out.println(k+”=”+v);
});
24.解决ArrayList 线程不安全问题
(1)转化为线程安全的类
ArrayList = Collection.synchronizedList(arrayList);
(2)并发环境下可以使用CopyOnWriterList
25.解决HashMap线程不安全问题
(1)转化为线程安全类
map = Collection.synchronizedMap(map);
(2)并发环境下可以使用CurrentHashMap
26.堆和栈
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
{堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。
队列:先进先出,栈:先进后出
25.集合源码分析
(1)ArrayList
List接口可变数组非同步实现,每次扩容扩为原来的1.5倍,线程不安全
(2)Vector
API与ArrayList相同,基于数组实现,可扩容,有synchronize修饰,线程安全
(3)LinkedList
底层是双向链表,非同步,同时实现List和Deque,可以当队列使用,线程不安全
(4)ArrayDeque
使用数组实现的双端队列
(5)HashSet
底层使用哈希表实现(数组+链表),实际是由一个HashMap的实例支持的,允许使用NULL值
使用该方法时,需要重写equals和hashCode方法。
(6)LinkedHashSet
哈希表+双向链表实现
(7)HashMap
底层使用哈希表(散列链表/数组+链表)实现,数组中每一项是个单向链表,即数组和链表的结合体,可以存储NUll值,1.8之后采用
散列列表+红黑树的方式,线程不安全
(8)HashTable
底层使用数组实现,数组中每一项是个单链表,即数组和链表的结合体,key和value不能为NUll
26.ArrayList和LinkedList区别
ArrayList底层是用数组实现的顺序表,是随机存取类型,可自动扩增,并且在初始化时,数组的长度是0,只有在增加元素时,长度才会增加,默认是10,不能无限扩增,有上限,在查询操作的时候性能更好
LinkedList底层是用链表来实现的,是一个双向链表,注意这里不是双向循环链表,顺序存取类型。在源码中,似乎没有元素个数的限制。应该能无限增加下去,直到内存满了在进行删除,增加操作时性能更好。
27.Deque 中的LinkedList 和 ArrayDeque的区别
LinkedListDeque使用的是链表实现的双端队列
ArrayDeque 使用的是数组实现双端队列
28.catch 可以出现多次,首先捕获小异常,然后捕获大异常
29.final 、finally 、finalize
final 用于声明变量,方法,类,表示变量不可改变(引用不能改变,只可以改变),方法不能重写,类不可以被继承
finally 用于异常处理中,表示,必须要执行的代码块,除非java虚拟机停止工作,否则一定会执行
finalize() 是Object类中的一个方法,用于java虚拟机的垃圾回收
30.IO体系中存在的设计模式:
装饰模式 – 用于动态的给对象添加一些功能,类似于继承,但是比继承更加灵活
31.IO
BIO 传统IO,阻塞并同步 NIO,同步非阻塞 AIO 非同步非阻塞
32.windows 系统中使用””表示的路径分隔符,但是 java 中””””转义字符
sleep()执行后不会释放对象锁,wait()会释放对象锁,重新进入就绪状态需要notify()或者notifyAll方法
45.线程控制:加塞join()(插队)
睡眠sleep()没有放弃CPU的执行权
让步yield()放弃CPU的执行权
46.线程安全
指的是多线程访问同一个方法、对象或代码时不会产生不确定的结果
引起线程安全的原因:存在多条线程共同操作的共享数据
47.synchronized 锁对象的时候,可以使用任意的对象
48.volatile关键字
使用该关键字修饰变量 表示变量是多线程可见的。每一个线程在运行的时候自己的线程内存,线程内存中存放的是主内存的数据的拷贝。如果使用volatile关键字修饰变量,线程在使用变量的时候不是从线程内存中获取,而是从主内存中获得数据。
49.synchronized关键字
当synchronized修饰静态方法时,修饰的是当前类的class对象锁
当synchronized修饰实例方法时,修饰的时对象中的实例方法
50.并发和并行
并发:一个处理器同时处理多个任务
并行:多个处理器处理不同的任务
51.原子性问题解决方案
(1)使用同步代码块或同步方法
(2)使用原子性操作的类 java.util.concurrent.atomic 底层使用CAS实现 (CompareAndSwap)
52.Lock锁
实现类为ReentrantLock Lock lock = new ReentrantLock();
lock.lock();
53.Lock锁和synchronized的区别
Lock产生异常时不会自动释放锁 所以要在finally中释放锁(lock.unlock();)
synchronized修饰的锁产生异常时会自动释放
54.条件锁 Condition 需要结合Lock锁
54.线程池中的线程是由线程创建的,程序员只需要创建线程池就可以
55.线程池创建的四种方式
56.线程池的任务:Callable或者Runnable任务
57.四种线程池的底层:ThreaPoolExecutor
58.同步容器:synchronize修饰,产生性能影响
59.并发容器:jdk1.5提出,改善同步容器性能,专门为并发环境设计
(1)HashMap(线程不安全)、HashTable(线程安全) 可以用 ConcurrentHashMap代替
(2)ArrayList、vector 可以使用 CopyOnWriteArrayList
(3)set 可以使用CopyOnWriteArraySet
(4)Queue 可以使用 ConcurrentLinkedQueue(高性能队列) 或linedBlokingQueue(阻塞队列)
https://www.jianshu.com/p/ff872995db56
60.HashMap、HashTable、ConcurrentHashMap的区别
1.HashMap线程不安全,HashTable和ConcurrentHashMap线程安全,所以HashMap运行效率高
2.HashMap的Key和Value可以是null值,HashTable和ConcurrentHashMap不行
3.HashTable和ConcurrentHashMap之间的主要差别在于性能方法。ConcurrentHashMap采用””分段锁””,性能比HashTable要好
61.Java中的Callable和Runnable有什么区别
两者都用来代表线程中的任务,Runnable从1.0版本就有,Callable出现在1.5版本当中,主要区别是,Callable的call()方法可以有返回值和异常,Runnable的run()方法不行,Callable可以返回带有计算结果的Future对象
62.Volatile
volatile是一个特殊修饰符,可以保证下一个读取操作是在上一个写操作之后。
63.如何在两个线程间共享数据/h3>
1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。
2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,
例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款
64.为什么wait
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!