1.
String、StringBuilder、StringBuffer
都是final类,都不允许被继承。
String是长度不可变的,StringBuffer、StringBuilder长度是可变的。
StringBuffer是线程安全的,StringBuilder不是线程安全的。
StringBuilder是5.0新增的。此类提供一个与StringBuffer兼容的API,但不保证同步。此类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的情况。
大多数实现中,它比StringBuffer要快。两者的方法基本相同。
如果要操作少量的数据,用String。单线程操作大量数据,用StringBuilder;多线程操作大量数据,用StringBuffer。
2.
HashMap和HashTable的区别
都实现了Map接口,主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎可以等价于HashTable,除了HashMap是非synchronized,并且可以接受null(HashMap可以接受为null的键值(key)和值(value),Hashtable不行)。
HashMap是非synchronized,而HashTable是synchorized。这意味着Hashtable是线程安全的,多个线程可以共享一个HashTable。而如果没有正确同步的话,多个线程是不能共享HashMap的。
HashMap的迭代器是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。
由于HashTable是线程安全的也是synchronized,所以在单线程环境下比HashMap要慢。如果不需要同步,只需要单一线程,那么使用HashMap性能好过HashTable。
synchronized意味着一个仅有一个线程能够更改HashTable。就是说任何线程要更新HashTable时要首先获得同步锁,其他线程要等到同步锁被释放之后才能再次获得同步锁更新HashTable。
Fail-safe和iterator迭代器相关。
3.
Java中的ThreadLocal类允许我们创建智能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。
创建ThreadLocal变量:private ThreadLocal myThreadLocal = new ThreadLocal();我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过ThreadLocal的set()方法设置的值。即使两个不同的线程在同一个ThreadLocal对象上设置了不同的值,它们仍然无法访问到对方的值。
myThreadLocal.set("A thread local value");
String threadLocalValue = (String)myThreadLocal.get();
4.
Maven安装JAR包的命令是:
mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar
5.
1.把Student.class文件加载到内存,在栈内存为stu开辟空间,开始压栈
1.1在堆内存中 为Student对象申请空间
1.2该堆内存中 有个指向方法区的地址,里面包含了Student类中的方法
2.准备调用setName(String sName)方法,把setName()压栈,调用结束后,出栈
3.准备调用getName()方法,把getName()压栈,调用结束后,出栈
4.准备调用SayHi(String sName)方法,把SayHi(String sName)压栈,调用结束后,出栈
5.结束main()的调用,main()出栈
6.Java中锁的原理
内置锁:Java中的每个对象都可以用作一个同步锁,这个锁就是内置锁,或者监视锁,通过同步方法或者代码块获得内置锁,也就是运用synchronized关键字
显示锁:jdk提供的高级锁,比如Lock,Condition等,主要用于内置锁不方便实现的功能。
锁的一些特性:
可重入:java线程是基于每线程计算锁的,在同一线程中,可以再次进入该同步方法,而不会造成死锁。进入一次,计数器加1,退出后减1.
公平/非公平
在公平的情况下,所有需要获得锁的线程,都有相同的几率获得锁。反之,某些线程可以优先获得锁。
7.
//软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它。如果内存空间不足,就会回收这些对象的内存。 String str = new String("abc"); SoftReference<String> softReference = new SoftReference<String>(str);//软引用 //弱引用:与软引用的区别,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了 //只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存 WeakReference<String> weakReference = new WeakReference<String>(str); String abc = weakReference.get(); //让str再次变为强引用 //虚引用:如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收 //与软引用和弱引用的一个区别在于,虚引用必须和引用队列联合使用。
8.
HashMap Infinite Loop是怎样形成的。
本文深入探讨了Java中的String、StringBuilder、StringBuffer的区别,HashMap与HashTable的区别,以及ThreadLocal类的使用。同时,解释了Java内存分配过程,锁的原理及不同类型的锁特性。此外,介绍了软引用、弱引用和虚引用的概念。最后,提供了Maven安装JAR包的命令。

被折叠的 条评论
为什么被折叠?



