JAVA小知识

来源:互联网 发布:文件恢复软件recovery 编辑:程序博客网 时间:2024/06/03 23:24

1.String,StringBuffer与StringBuilder的区别??
String 字符串常量,引用字符串的内容不能改变。
StringBuffer 字符串变量,线程安全
StringBuilder 字符串变量,单线程环境使用, 效率高,线程不安全,无synchronize
String 是不可变的对象,对他进行改变实际是生成了一个新的 String 对象,并指向新的对象。频繁更改内容的字符串,会对系统性能有影响。
大部分情况下,StringBuilder > StringBuffer > String
少量字符串拼接时,用+ ,否则用append方法
2.ArrayList、LinkedList、Vector三种集合的区别及其优缺点?
都是list接口的实现类。
Arraylist,linkedlist线程不安全,vector线程安全
ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。(vector也是基于数组的,请求双倍的空间,ArrayList请求50%)
2.ArrayList增删慢,查询快,通过移动数据,通过索引查的快
3.LinkedList增删快,查询慢,通过移动指针时间复杂度等考虑

3.HashTable,HashMap,TreeMap区别和用法
都是map接口的实现类,都是通过键值对来存储数据。
Hashmap,treemap线程不安全,HashTable线程安全。(最大不同)
前两者的数据结构是哈希表,后者是二叉树。
HashMap:1.方法是不同步的;2.存储的数据中空key只能只有一条,空value可以有多条。3.用迭代器遍历;4.数组默认大小16,且是2的指数;
Hashtable:1.方法是同步的;2.key和value都不允许为空;3.用枚举遍历;4.数组默认大小是11,每次增加old*2+1;

13.sleep()和wait()
前者是thread类的休眠方法,使线程暂停指定的时间,但锁对象仍保持。休眠时间到了就会自动回复线程。
后者是object类的方法,对象调用该方法会导致本线程放弃对象锁,线程进入等待池,只有调用notify()方法后,唤醒线程进入等锁池。
等待池里的线程等待被加锁,并被唤醒。
等锁池里的线程等待上一个线程走完加锁的方法。

58、线程的sleep()方法和yield()方法有什么区别?
答:
① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

14.final,finally,finalize区别
final:修饰类,属性,方法,表示不可更改
finally:try catch异常语句结构中的一部分,表示必须执行的部分,通常用于
关闭资源
finalize:object类的方法,垃圾回收器运行的时候执行它,用于回收对象
GC:垃圾回收,会自动检测对象是否超出作用域,进行自动回收内存。

15.java的垃圾回收机制GC
这是java的一个显著特点,不用像c++那样考虑内存管理。
它是作为一个低级别的线程运行。只有对象的引用才有作用域。
回收内存中死亡的或长时间不用的对象。理论上不会发生内存泄漏,但在实际上,可能会存在无用但可达的对象,如hibernate的一级缓存,不及时关闭或清空flush,就会导致内存泄漏。

JVM加载class文件的原理机制    类文件编译为.class文件,jvm的类装载由ClassLoader及其子类来    实现,在运行时查找和装入类文件的类。文件中有几个class,就会创建几个.class文件。

16.同步和异步
同步表示各个线程同时运行,并且这些线程会排队读取共享资源。效率较低。
线程同步的方法有:wait(),sleep(),notify(),
异步表示各个线程独自运行,彼此间没有关系。效率较高。

 synchronized 和 java.util.concurrent.locks.Lock 的异同  后者可以实现前者的所有功能,但是后者必须程序员手动释放锁 stop():不安全,会解除所有锁定 suspend():使目标线程停下,但会保持锁定,所以易发生死锁,

17.类class,抽象类abstract,接口interface
类:一个java文件只能有一个public类,可以有其他类,属性,方法
抽象类:有抽象方法的类,不能实例化。主要用于给子类继承用。
接口:只有抽象方法和static final成员变量的类。其表示定义了一个规范,标准。

26.线程及其基本状态
线程是执行程序的一个执行单位。程序=进程=多个线程
其基本状态:就绪,运行,挂起,结束。

29.简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以
操作数值型
b.逻辑操作不会产生短路

31.排序的方法
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排
序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
快速排序的伪代码。

33.什么是 java 序列化,如何实现 java 序列化?
对象流:将对象内容流化,由此可以对对象进行读写操作,或者传输于网络。
序列化:处理对象流的一种机制。除了可以实现对象的持久化还可以用于对象的深度克隆
实现序列化:将类实现 Serializable 接口,标记该对象是可序列化的。然后用输出流将其封装为对象输出流,写出。
反序列化:用输入流建立对象输入流,然后读取,
Java中的流:字节流和字符流。字节流继承于inputstream,ouputstream;字符流继承于reader,Writer。在io包里。
注意:一.I/O流的的对称性(输入和输出,字节和字符)二.两种设计模式(适配器模式和装潢模式)。Java中的流只有一个维度一个方向。
习题:1.写个统计一个字符串在一个文件里出现的次数。
2.列出一个目录里的所有文件(文件里可能还有文件)

7、int和Integer有什么区别?
答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

7.&和&&的区别?
&:按位与
&&:逻辑与(短路与),如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
补充:如果你熟悉JavaScript,那你可能更能感受到短路运算的强大,想成为JavaScript的高手就先从玩转短路运算开始吧。
8.解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
栈空间:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现 场保存使用栈。
堆空间:通过new关键字和构造器创建的对象
静态区:程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在这里。
栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内 存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
heap:堆,堆是栈的一个组成元素。
stack:栈,后进先出,push入栈,pop出栈
queue:队列,先进先出,put入队,pull出队

Eg: String str = new String(“hello”);
变量str放在栈上,用new创建出来的字符串对象放在堆上,而”hello”这个字面量放在静态区。
补充:较新版本的Java(从Java 6的某个更新开始)中使用了一项叫”逃逸分析”的技术,可以将一些局部对象放在栈上以提升对象的操作性能。

23、抽象类(abstract class)和接口(interface)有什么异同?
相同:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。继承抽象类和实现接口时,都要重写方法。
不同:
1.抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
2.抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
3.抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
4.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

26.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

29.如何实现对象克隆?
答:有两种方式:
  1). 实现Cloneable接口并重写Object类中的clone()方法;
  2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。这种更好,有错误,在编译时会出现异常。

40、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?

零散的知识:
redirect:转发,转发的是一个状态码,告诉浏览器去请求那个地址,并会附加上刚才请求的参数,因此session和request中的参数可以获取。

数组用length属性,集合用size()方法计算其长度,String有length()方法,而JavaScript中获取字符串长度用length属性。Set里的元素不可重复,用iterator()方法区分重复与否。String类是final的类型 ,jdk1.7后可以放在switch中,case必须跟常量表达式对象值相同,有相同的hash codeJava中只有值传递,没有引用传递。synchronized是对象锁,一次 只能有一个线程访问

跳出多重嵌套循环:在外层循环标记A,再break A
构造器不能被继承,因此不能被重写,但可以被重载。(重写发生在继承和接口上)
为什么构造器不能被继承?构造器不是类的成员函数,只能代表类本身,所以不能被继承。构造器是用来生成对象,不能既生成儿子,又生成父亲。
为什么构造方法不是成员函数?举例:在一个类中,写一个构造方法和构造方法名相同的成员函数,不发生冲突。说明构造函数不是一个成员函数。
如果两个对象相同(equals判断),则hashcode也一定相同。反之不一定
String 类是final类,不可以被继承。对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。
ERP:企业资源规划,就是一个公司管理的平台,有利于公司的发展建设。
为什么不能根据返回值判断重载:因为调用方法的时候就会发生冲突,方法的调用不在乎返回值。
Char型能存一个汉字:java是用Unicode编码的,一个char占2个字节。
补充:JVM内部是Unicode,数据转移到外部需要编码转换,用字符/节流类执行。
静态内部类和内部类:静态中无this,不依赖与外部类实例化;而内部类需要。
静态变量可以实现让多个对象共享内存。
静态方法只能访问静态成员,访问非静态的要先创建对象。
匿名内部类可以继承其他类和实现接口。
内部类对象可以访问外部类的所有成员。
创建对象时构造器的调用顺序:1.初始化静态成员,2.调用父类构造,3.初始化非静态成员,4.调用自身构造。
String类型–》基本数据类型:A.parseXXX(string):或者A.valueOf(String)
基本数据类型—》String类型:拼接 +”” 或者string.valueOf()
字符串的反转和替换:可以自己方法或者用String中的方法。Reverse()

获取年月日时分秒:yyyy-MM-dd:HH-mm-ss。Date类或calendar类
断言assert用与开发测试,保证程序的执行效率
提示:用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候就不再继续递归)。
Try里的return和finally:return先执行,finally里如果更改返回值的话,返回的就是更改后的值。
List,set继承自collection接口;arraylist,linkedlist,vector类实现list接口;sortset接口继承set接口;hashset,treeset类实现set接口。Sortmap接口继承自map接口;hashmap,treemap类实现map接口。
哈希存储hash和排序树tree:前者按时间复杂度为O(1)来存储,后者按元素构成排序树的方式达到排序和去重的效果。排序树如何比较元素??要求存放的对象必须先实现Comparable接口,在再重写compare方法,进行比较。也可以用Collections类的sort方法。
加锁,同步后的性能肯定会降低的。
Lock和synchronized都可以给线程加锁,但是前者有更精确的线程语义和更好的性能,而且不强制行要求一定要获得锁,但是他要手动释放lock,最好在finally中释放。后者可以自动释放。
Java函数式编程,动态编程。
事务保证数据的一致性和完整性。
用Java的套接字编程实现一个多线程的回显(echo)服务器。
基本数据类型之间的转换:整型的,浮点型的小转大,char可以转int,long,float,double整型的转浮点型的。(大转小损失进度)