Java是一门面向对象的编程语言,具备封装,继承,多态,抽象四大特性
封装: 提高类的易用性,减少编程过程中代码出错的风险
继承: 实现代码的复用
抽象: 能让程序的设计和实现分离
多态: 提高了程序的可扩展性
Java具有平台独立性和移植性
一次编写,到处运行.已编译的Java程序可以在任何带有JVM的平台上运行.
方式: 将代码编译成.class文件,再把class文件打成java包,这个jar包就可以在不同的平台运行了.
Java具有稳健型
Java上一个强类型语言:
检测潜在类型不匹配问题的功能;
要求显示的方法声明,不支持c风格的隐式说明;
有异常处理;
Java通过JVM(Java虚拟机)实现跨平台
JVM可以理解成一个软件,不同平台有不同版本.
编写的Java代码编译后生成.class文件(字节码文件).
JVM就是负责将字节码文件翻译成特定平台下的机器码.
不同平台下翻译生成的字节码上一样的,但是由JVM翻译成的机器码却不一样的.
JVM上运行Java字节码的虚拟机.
JVM有针对不同系统的特定实现(windos,linux,macOS)
目的是使用相同的字节码,他们都会给出相同的结果.
JVM并不是只有一种,只要满足JVM规范,每个人或组织都可以开发自己的专属JVM.
JDK
JDK是Java Development Kit(Java开发工具包) 缩写,它是功能齐全的Java 还有编译器和工具,可以创建和编译程序.
SDK(Software Development Kit)软件开发工具包.
JRE
Java运行时环境,它是运行已编译Java程序所需的所有内容集合(包括JVM,Java类库,Java命令和其他一些基础构件)
总结
JRE = JVM+Java核心库
JDK = jRE+Java工具+编译器+调试器
JVM可以理解的代码为字节码(扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机.
一定程序上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点.
因为字节码并不针对一种特定的机器,所以Java程序无序重新编译便可在多种不同操作系统的计算机上运行.
在.class->机器码这步,JVM类加载器首先加载字节码文件,然后通过解释器逐行解释.
但这种方式执行速度相对较慢,同时有些方法和代码块是需要被经常调用(热点代码)
我们引进JIT(just-in-time compilation,及时编译)编译器.
JIT完成第一次编译后,会将字节码对应的机器码保存下来,下次可以直接使用.
高级编程语言按照程序的执行方式分为两种:
Java和C++都是面向对象语言,都支持封装,继承和多态,但还是有一些方面不同
写程序时,需要为程序,类,变量,方法取名字就有了标识符.
简单来说,标识符就是一个名字
但对于有些标识符,Java语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是关键字.
符号在前先加减,符号在后后加减
移位操作中,被操作的数据被视为二进制数,移位就是向左或向右移动若干位的运算.
三种移位运算符
: 带符号右移,向右移若干位,高位补符号位,低位丢弃.
正数高位补0,负数高位补1.
: 无符号右移,忽略符号位,空位都以0补齐
移位操作服支持的类型只有int和long.
编译器对short,byte,char类型进行移位前,都会将其转换为int类型再操作.
移位超过所占有位数会先求余(%)再进行左移和右移操作
循环结构中,当循环条件不满足或者是循环次数达到要求时,循环正常结束,
但有时候需要中循环过程中,发生某种条件时,提前终止循环,就会用到下面几个关键词
局部变量存在与栈内存
静态方法上属于类的,在类加载的时候就会被分配内存,可以通过类名直接访问.
非静态成员属于实例对象,只有在对象实例化之后才存在,通过通过类实例对象去访问
所以,类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作.
Java有8种基本数据类型,分别为:
Java是面向对象语言,很多地方需要使用对象而不是基本数据类型.
比如在集合中,无法将int等类型放进去----因为集合要求元素是Object类型
为了让基本类型也有对象的特征,就出现了包装类型,并且为其添加了属性和方法,丰富了基本类型的操作.
Java包装类型的大部分都用到了缓存机制来提升性能
在类初始化时,提前创建好会频繁使用的包装类对象,当需要使用某个类的包装类对象时,如果该对象包装的值在缓存范围内,就返回缓存的对象,否则就创建新的对象并返回
注意: 所有整型包装类对象之间值的比较,全部使用equals方法比较
举例:
Integer A = 40;
Integer B = new Integer(40);
System.out.println(A == B)
第一行代码会发生装箱,也就说这行代码等价于Integer A = Integer.valueOf(40)
.
所以A直接使用的是缓存中的对象,而Integer B 会直接创建新的对象,
所以答案是false/
装箱: 将基本类型用它们对象的引用类型包装起来
拆箱: 将包装类型转换为基本数据类型
装箱起时就是调用了包装类的valueOf方法
而拆箱就是调用了xxxValue方法(xxx根据类型发生改变)
频繁的拆装箱会严重影响系统的性能,应该尽量避免不必要的拆装箱操作.
主要区别是解决问题的方式不同
New运算符.
New创建对象实例(在堆内存中),对象引用指向对象实例(引用一般放在栈或者堆内存中)
1个对象引用可以指向0/1个对象
一个对象可以有n个引用指向它.
对象相等比较的是内存中存放的内容是否相等
引用相等比较多说它们指向内存地址是否相等
封装,就是将客观事物抽象为逻辑实体,实体的属性和功能相结合,形成一个有机的整体。并对实体的属性和功能实现进行访问控制,向信任的实体开放,对不信任的实体隐藏。,通过开放的外部接口即可访问,无需知道功能如何实现。
也就是说,封装主要有以下目的:
可隐藏实体实现的细节。
提高安全性,设定访问控制,只允许具有特定权限的使用者调用。
简化编程,调用方无需知道功能是怎么实现的,即可调用。
目的:
目的:
一:复用代码,减少冗余代码,减少开发工作量
二:为多态实现打下基础,使类与类之间产生联系
目的:
一个外部接口可以被多个同类使用
不同对象调用同个方法,可以有不同实现
所以可以看出,多态的实现基础是基于继承
共同点
public static final
,不能背修改且必须有初始值.Java传递的只有值
执行方法时,会将方法的栈帧压入栈内存,但是栈帧中的变量不会相互影响.
Java基础
6. Java语言的特点
7. 面向对象四大特性
8. JVM,JDK,JRE
9. 详细说编译与解释并存
10. 标识符与关键字
11. final,finally,finalize区别
12. 成员变量与局部变量的区别
13. 重载和重写有什么区别
14. 深拷贝与浅拷贝
10.String,StringBuffer,StringBuilder区别,
15. == 和equals
16. java异常的了解
17.
18. 了解范型吗
19. 范型的使用方式
20. 了解反射吗
21. 动态代理
22. 了解注解吗
23. 注解的解析方法有哪几种
新特性
java8
集合
1.ArrayList与LinkedList区别,他们对于内存空间占用
2. ArrayList扩容机制
3. HashSet的实现原理
4. HashSet不允许重复的值,数据结构有什么区别.
5. Queue与Deque的区别
6. HashMap的put流程
7. HashMap的长度为什么说2的幂次方
8. HashMap在多线程操作会导致什么问题.如何解决呢
9. HashMap和HashTable有什么区别?
Java并发
1.并发编程三个必要因素
10. 如何保证多线程的运行安全
11. happens-before
12. 创建线程的几种方式
13. sleep和wait 有什么区别
14. 唤醒阻塞的线程
15. 说一下你对锁的理解
16. 说一下你对synchronize底层原理
17. 可重入原理是什么
18. 内存模型
19. Lock接口和synchronize对比同步有什么优势.
20. 乐观锁和悲观锁的理解
21. CAS是什么
22. CAS会产生什么问题?
23. 线程池是什么,我们为什么要用线程池.核心参数
24. 线程池的拒绝策略有哪些
25. 线程池有哪些状态
26. AQS底层数据结构
27. CLH入队的流程
并发集合
28. ConcurrentHashMap实现原理
29.lian biao
29. ConcurrentHashMap的put流程
30. get方法需要枷锁吗,为什么?key,value是否为空