Java杂记

java进制转换:

  • java的整型封装类Integer和Long提供toString(int i,int radix)静态方法,可以将一个任意进制的整数转换为其他进制的整数。
  • 使用Integer或Long的toBinaryString方法将整数转换为二进制。
  • 使用Integer或Long的toOctalString方法将整数转换为八进制。
  • 使用Integer或Long的toHexString方法将整数转换为十六进制。
  • 使用Integer或Long的toString(int i)方法可以将其他进制的整数转换为十进制的整数的字符串表示

String类可以继承吗

String类是被final修饰的,所以不可以被继承;

为什么要用final修饰String呢?

1、Security: the system can hand out sensitive bits of read-only information without worrying that they will be altered

2、Performance: immutable data is very useful in making things thread-safe.

String 相关问题

1、“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等

2、String、StringBuffer和StringBuilder:

  • 都是final类,都不允许被继承
  • String的长度时不可变的,其它两个的长度是可变的。String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,性能就会降低。
  • StringBuffer是线程安全的,StringBuilder是线程不安全的

使用基本原则:如果只是操作少量数据,使用String;如果单线程操作大量数据,选用StringBuilder;如果多线程操作大量数据,选用StringBuffer。

3、如何使用空格分割字符串:

String[] strArray = aString.split("\\s+");

4、String c = new String(“java”);这个语句背后的发生过程:

  • 1)在heap上为String对象申请内存
  • 2)尝试从常量池中获取“java”字符串,如果常量池中不存在,则在常量池中新建“java”字符串,并返回
  • 3)调用构造方法,初始化String对象

java中String对象使用char数组存储字符串,变量c指向Java堆的String对象,且该对象的char数组指向常量池的”java”字符串。

String a = "hello ";
String b = "world";
String c = a + b; //字符串变量的连接动作,在编译阶段会被转化成StringBuilder的append操作,变量c最终指向Java堆上新建String对象
String d = "hello world";//变量d指向常量池的”hello world”字符串,所以 c != d。

浅谈java String内幕(上)

String.intern()原理

synchronized与ReentrantLock

ReentrantLock在加锁和提供内存可见性上的功能与内置锁相同。但是,ReentrantLock还有一些其他更灵活的加锁功能,如可定时锁,轮询锁,可中断锁,公平锁和非公平锁,实现非块结构的加锁。其中,定时锁与轮询锁由tryLock()方法实现。可中断锁由lockInterruptibly()方法实现,公平锁与非公平锁可由ReentrantLock的构造函数实现。

在高并发环境中,ReentrantLock的性能优于内置锁。

既然ReentrantLock锁这么好,那为什么java还不弃用内置锁呢?

原因是:内置锁为许多开发人员所熟悉,并且简洁紧凑。ReentrantLock则有一定的危险性,如果在finally块中忘记调用unlock()方法,则会产生一些潜在的危险。仅当内置锁无法满足需求时,才可以考虑使用ReentrantLock。