Java笔记一

来源:互联网 发布:total tide软件下载 编辑:程序博客网 时间:2024/06/17 12:07

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是怎样形成的。

点击打开链接


0 0