@ghimi
2022-05-14T05:50:32.000000Z
字数 3660
阅读 413
Java
封装/继承/多态
1、跨平台/可移植性
这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
2、安全性
Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。
3、面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!
Java则是完全的面向对象语言。
4、简单性
Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。
同时,由于语法基于C语言,因此学习起来完全不费力。
5、高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。
比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,
某些代码甚至接近C++的效率。因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
6、分布式
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
7、多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
8、健壮性
Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。
如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
HashSet是对HashMap的简单包装,对HashSet的函数调用都会转换成合适的HashMap方法
// HashSet是对HashMap的简单包装
// HashSet里面有一个HashMap
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
// 简单的方法转换
return map.put(e, PRESENT)==null;
}
我们都知道Java中内存是通过GC自动管理的,GC会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。
GC判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的有效引用 并不包括弱引用。也就是说,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。 WeakHashMap 内部是通过弱引用来管理entry的,弱引用的特性对应到 WeakHashMap 上意味着什么呢? WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。 WeakHashMap 的这个特点特别适用于需要缓存的场景。在缓存场景下,由于内存是有限的,不能缓存所有对象;对象缓存命中可以提高系统效率,但缓存MISS也不会造成错误,因为可以通过计算重新得到。
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
(parameters) -> expression
(parameters) ->{ statements; }
并发编程是一种多线程的编程方式,通过将CPU调度资源单位化为线程的方式从而实现最大化的利用计算机性能。
多线程编程带来的一个问题就是数据一致性问题,在Java内存模型中,多线程访问和操作相同内存的过程中如果不增加额外的控制逻辑,回导致部分一些线程的操作失效。
因此Java 内存模型中提供了一些工具来对此类场景进行额外的控制供开发者处理数据一致性问题。
volatile
关键字在 Java 内存模型中,多线程访问共享变量时会为变量基于每个线程创建一份副本。变量本身存放在主内存当中,当线程需要操作该变量时,会拷贝一份副本到线程的工作内存当中,由于每个线程都拥有一份变量的副本,这样就会导致线程A对变量var1的操作对于线程 B 不是即使可见的。为了解决这种内存可见性问题,Java 内存模型中引入 volatile 关键字,对于标记为 volatile 关键字的变量,JVM 会进行额外的操作处理,来提升该变量在多线程中的可见性。
volatile 关键字的另外一个效果是禁止 Java编译器的指令重排序。:
CAS 是 Java 提供的一种变量操作确认的的机制,在多线程编程机制中,由于并发带来的问题就是线程无法确认自己的操作是否生效。举例来说,当线程A将变量var1的值从0修改为1时,由于线程B也同时在对变量var1进行修改,这样线程A就无法确认自己的操作是否生效了。
CAS 通过操作前读取值解决了这个问题,通过在修改 var1的值之前确认 var1 的值是否是 0,这样就可以确认别的线程没有修改