1.Java中的基本类型包括byte,boolean,char,short,int,long,float,double,java.lang.String类是final类型,因此不能继承这个类,不能修改这个类。为了提高效率,节省空间,应该使用StringBuffer类
String与StringBuffer的区别
在Java中有3个类负责字符的操作
(1)Character是进行单个字符操作
(2)String对一串字符进行操作,不可变类(final类型,不能改变,不能被继承)
(3)StringBuffer对一串字符进行操作,可变
a.String
a.1 是对象不是原始类型
a.2 不可变对象,一旦被创建,就不能修改对象的值,对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去
重新创建一个新的对象,赋给已有的String对象
a.3 String是final类,不能被继承
b.StringBuffer
b.1 可变对象,对他修改时不会像String那样重新建立对象
b.2 只能通过构造函数来建立 note 不能通过赋值符号对StringBuffer进行赋值 StringBuffer sb = new StringBuffer();
sb = "welcome to here" 是错误的
对象被建立后(通过构造函数创建StringBuffer类型对象),在内存中就会分配内存空间,并初始化保存一个null,修改StringBuffer对象时是调用它的append方法
sb.append("hello");
b.3 字符串连接操作中StringBuffer的效率要比String高
String str = new String("welcome to");
str += "here";
jvm处理过程是通过建立一个StringBuffer,然后调用append(),最后将StringBuffer toString(),这样String的连接操作就比StringBuffer多出了一些附加操作,效率上要打折,《这是时间上》
《空间上》由于String对象是不可变对象,每次操作String都会重新建立新的对象来保存新的值,这样原来的对象就没用了,没有变量引用原来的对象,就要被垃圾回收,这是要影响性能
str += "here"
等同于
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
举个例子
看看以下代码:
将26个英文字母重复加了5000次,
1. String tempstr = "abcdefghijklmnopqrstuvwxyz";
2. int times = 5000;
3. long lstart1 = System.currentTimeMillis();
4. String str = "";
5. for (int i = 0; i < times; i++) {
6. str += tempstr;
7. }
8. long lend1 = System.currentTimeMillis();
9. long time = (lend1 - lstart1);
10. System.out.println(time);
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码
1. String tempstr = "abcdefghijklmnopqrstuvwxyz";
2. int times = 5000;
3. long lstart2 = System.currentTimeMillis();
4. StringBuffer sb = new StringBuffer();
5. for (int i = 0; i < times; i++) {
6. sb.append(tempstr);
7. }
8. long lend2 = System.currentTimeMillis();
9. long time2 = (lend2 - lstart2);
10. System.out.println(time2);
得到的结果为 16有时还是 0
所以结论很明显,StringBuffer的速度几乎是String上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。
所以上面直接利用"+"来连接String的代码可以基本等同于以下代码
1. String tempstr = "abcdefghijklmnopqrstuvwxyz";
2. int times = 5000;
3. long lstart2 = System.currentTimeMillis();
4. String str = "";
5. for (int i = 0; i < times; i++) {
6. StringBuffer sb = new StringBuffer(str);
7. sb.append(tempstr);
8. str = sb.toString();
9. }
10. long lend2 = System.currentTimeMillis();
11. long time2 = (lend2 - lstart2);
12. System.out.println(time2);
平均执行时间为46922左右,也就是46秒。
3. ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数目大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
4.Collection和Collections的区别
Collection是集合类的上级接口,继承它的接口主要有Set和List,Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
5.sleep()和wait()的区别
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给把执行机会给其他线程,但是监控状态依然保持,到时候会自动回复,调用sleep不会释放对象锁。
调用线程的sleep方法是线程暂时放弃CPU给其他线程使用,但是没有放弃对象锁
a.是Thread的方法
b.放弃CPU使用权,让其他线程执行
c.不会放弃监控状态,不会放弃对象锁
wait是Object类的方法,在线程中调用对象的wait()方法,对此对象调用wait方法导致本线程放弃对象锁,进入此对象的等待锁定池,只有针对此对象发出notify(或notifyAll)方法,本线程才能进入对象锁定池准备获得对象锁进入运行状态
对象等待池:放弃对象锁后进入对象等待池
对象锁定池:拥有对象锁,尚未获得CPU资源,进入对象的锁定池
6.final finally finalize
final
变量:常量,必须初始化,两种初始化方法:声明时初始化,构造方法初始化
方法:方法不能被覆盖(父类方法不能被子类覆盖)
类:不能被继承
finally
异常处理结构的一部分,表示总是执行
finalize
Object类的一个方法,在GC执行时调用被回收对象的finalize方法(Object类的方法,GC调用,被回收对象的finalize方法)可以覆盖此方法提供垃圾收集时的其他资源回收,如关闭文件
总结:如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高
2.int和Integer有什么区别
Java提供两种不同的类型:引用类型和原始类型,int是java的原始数据类型,Integer是java为int提供的封装类,Java为每个原始类型提供了封装类,原始类型封装类
boolean Boolean
char Character
byte Byte
short Short
int Int
long Long
float Float
double Double
引用类型和原始类型的行为完全不同,并且他们具有不同的语义,引用类型和原始类型具有不同的特征和用法,包括大小和速度问题,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值,对象引用实例变量的缺省值为null,原始了性实例变量的缺省值与它们的类型有关