Java面试中的一些小问题

来源:互联网 发布:ubuntu login password 编辑:程序博客网 时间:2024/05/16 08:03

Mysql与Oracle区别:

1.  Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高。
2. Oracle支持大并发,大访问量,是OLTP最好的工具。
3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
4.Oracle和Mysql操作上的一些区别:
①主键
Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
②单引号的处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
③翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80
④ 长字符串的处理
长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
⑤空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
⑥字符串的模糊比较
MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快。
⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较好的

Java中如何利用JDK编译和运行应用程序?

利用JDK提供的javac命令来编译源文件,利用java命令来运行java程序,为了更加方便的使用这俩个命令,我们可以把<JDK的安装目录>\bin配置到Path环境变量中。而CLASSPATH环境变量保存的是一些目录和jar文件的地址,这些路径是为Java程序在编译和运行的时候搜索类而用的。在java程序进行编译运行的时候,会通过jre/lib/rt.jar(先搜索)文件和环境变量中指定的路径进行类的搜索。

Java中JDK和JRE的区别是什么?它们的作用分别是什么?

JDK是Java的开发工具,它不仅提供了Java程序运行所需的JRE,还提供了一系列的编译,运行等工具,如javac,java,javaw等。JRE只是Java程序的运行环境,它最核心的内容就是JVM(Java虚拟机)及核心类库。

如何为Java程序动态的指定类的搜索路径?

JDK中的java和javac命令,提供了-cp和-classpath选项为Java程序动态地指定类搜索路径,它们的使用方法比较简单,只需要把相应的目录路径或jar文件路径跟在选项后面即可。

Java和C++在编译和运行上有什么区别?

c++源码编译以后,生成的是特定机器可以直接运行的文件,而Java源码经过编译后,生成的是中间的字节码文件,这些字节码文件是需要放在JVM中运行的,而JVM是有多个平台版本的。因此,Java是具有跨平台的,而C++没有。

Java中什么是JVM及其工作原理?

JVM是一种使用软件模拟出来的计算机,它用于执行Java程序,有一套非常严格的技术规范,是Java跨平台的依赖基础。Java虚拟机有自己想象中的硬件,如处理器,堆栈,寄存器等,还有相应的指令系统它允许Java程序就好像一台计算机允许c或c++程序一样。

Java程序为什么无须delete语句进行内存回收?

java的堆内存数据的释放功能是由垃圾回收器自动进行的,无需程序员显式的调用delete方法。该机制有效的避免了因为程序员忘记释放内存而造成内存溢出的错误,相对于C++等需要显示释放内存的语言,是一中巨大的改进。

Java的变量分哪俩种大的数据类型?

基本数据类型和引用数据类型。他们最大区别在于,引用数据类型存放的是数据所在的地址,而基本数据类型则是直接存放数据的值。

Java包含哪些基本数据类型及包装类?

基本数据包括:byte,int,short,long,float,double,boolean和char

包装类在java.lang包中:Byte,Integer,Short,Long,Double,Boolean,Character

Java的引用和C++的指针有什么区别?

Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别。

(1)类型:引用其值为地址的数据元素,Java封装了的地址,可以转换成字符串查看,长度也可以不必担心。C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。

(2)所占内存:引用声明时没有实体,不占空间。C++指针如果声明之后会用到才会赋值。如果用不到不会分配内存。

(3)类型转换:引用的类型转换,也可能不成功,运行时抛异常或者编译就不能通过。C++指针指示个内存地址,指向内存,对程序来说还都是一个地址,但可能所指的地址不是程序想要的。

(4)初始值:引用初始值为java关键字null。C++指针是int,如不初始化指针,那它的值就不是固定的了,这很危险。

(5)计算:引用不可以计算。C++指针是int,他可以计算,如++或--,所以经常用指针来代替数组下标。

(6)内存泄露:Java引用不会产生内存泄露。C++指针是容易产生内存泄露的,所以程序员要小心使用,及时回收。

(7)作为参数:Java的方法参数只是传值,引用作为参数使用时,会给函数内引用的值的COPY,所以在函数内交换俩个引用参数是没意义的,因为函数只交换参数的COPY值,但在函数内改变一个引用参数的属性是有意义的,因为引用参数的COPY所引用的对象时和引用参数是同一个对象。C++指针作为参数给函数使用,实际上就是它所指的地址在被函数操作,所以函数内使用指针参数的操作都将直接作用到指针所指向的地址(变量,对象,函数等)。

   总的来说,Java中的引用和C++的指针主要有以上的8点区别。本质上,它们俩这都是想通过一个叫做引用或者指针的东西,找到要操作的目标,方便在程序中操作。所不同的是Java的方法更安全,方便一些,但是失去了C++的灵活,也算是对指针的一种包装和改进。

Java中equas和==的区别是什么?

“==”运用在基本数据类型的时候,通过比较它们实际的值来判断是否相同;而用于比较引用数据类型的时候,则是比较俩个引用的地址是否相等,也就是是否指向一个对象。equals方法是Java.lang.Object的方法,也就是所有的java类都会有的方法。它可以被程序员覆盖重写,通过自定义的方式来判断俩个对象是否相等。对于字符串java.lang.String类来说,它的equals方法用来比较字符串的字符序列是否完全相等。

Java中说明private,protected,public和default的区别?

作用域

当前类

同一package

子孙类

其他package

public

protected

×

friendly

×

×

private

×

×

×

不写时默认为friendly

Java中int和Integer有什么区别?

int是8种基础数据类型的一种,它的字节长度为4,用于表示现实中的正负整型数字。由于它属于基础数据类型,它的创建不会在堆内存中开辟空间,一般是保存在桟内存中的,它可以用算术运算符进行加,减,乘,除等操作。在参数传递的时候,直接传递它的值。

Integer是int的包装类,它本质是一个类,它的创建会在堆内存中开辟一块新的空间。它的含义也是表示一个整型的数字,但是,算术运算符不能操作它。在参数传递的时候,传递的是它所代表的对象的一个引用。

Java中boolean和它的包装类的区别在哪里?

区别如下:

1.boolean是基础数据类型,而Boolean是一个类

2.boolean一般存在于桟空间中,而Boolean对象存在堆空间中

3.boolean有true和false俩种值,Boolean除了true和false外,还有null

4.Java5.0之前啊,不能把Boolean用于条件语句,需要转换为boolean以后才能使用

Java中的实型与整型的相互转换

因为实型比整型要多出小数部分,从整型转为实型时不会有精度丢失,但是由实型转为整型时则会丢失小数部分的数据。

类型的转换必须遵守一个原则,就是由低位向高位转换,以变量中的类型字节长度最大的为类型目标

Java char能否存储汉字?

对于英文字母,它们所处的范围是0~127之间,与ASCII码相同,这是因为Unicode兼容ASCII码char是可以存储汉字的,每个中文字符都有对应的Unicode编码。

Java中如何使用转义转义字符?

\a 响铃  \b 退格  \r 表示接受键盘输入,相当于按下回车。  \f 换页  \n 表示换行。

\t  水平制表符,相当于Table键  \b 退格键,相当于BackSpace  \’  单引号

\’’ 双引号  \\ 表示一个斜跨  \? 问号字符  \0 空字符  \ ddd  任意字符  三位八进制  \xhh 任意字符 二位十六进制  \v   垂直制表

Java的转义字符应用比较广泛。例如,表示Windows操作系统下的文件路径时候,就需要用俩个斜线来表示一个斜线,例如下面的代码:String path="c:\\windows\\hello"

Java中,使用反斜线\来表示转义,它在紧跟在它后面的字符一起组成了转义的字符,从而达到转义的字符。

Java中字符串字面量是否自动生成一个String对象?

   在开发过程中,经常会需要直接写出一个字符串变量,也就是双引号包括的字符数据,这样一种字面量写法的字符串,是否已经创建了一个String对象呢?如果没有,那么数据存放在哪里呢?如果有,并没有new语句啊,是怎么创建的呢?

看下面代码:

String str1=“abc”;//创建abc字符串对象

String atr2=newString("abc");//用new语句,创建abc字符串对象

   以上代码中,用俩种方式创建了字符串变量str1和str2,它们有什么区别呢?其实,Java虚拟机(JVM)在执行这段代码的时候,遇到双引号操作符,它会自动创建一个String对象。该String对象所代表的就是abc,然后再返回该对象的一个引用。

   对于str1字符串来说,它的创建过程同上所说。在创建该对象之前,JVM会在String对象池中去搜索该字符对象是否已经被创建,如果已经被创建,则直接返回一个引用,否则先创建在返回引用。

   而str2字符串变量,它的创建过程就要多一个步骤。除了类似于str1字符串对象创建过程以外,它还会额外的创建一个新的String对象,也就是new关键字的作用,并且返回一个引用给str2.

  尽管str1和str2的值是相同的,但是他们的引用是不同的,也就是说一下代码的返回值为false。

str1=str2;//结果为false

Java 字符串对象池的作用是什么?

 Java5.0开始,Java虚拟机在启动的时候回实例化9个对象池。这9个对象池分别用来存储8中基本类型的包装类对象和String对象,主要是为了效率问题。

大家应该知道,创建String对象有俩种办法,代码如下:

String str1="hello";

String str2=newString("hello");

这俩种创建String对象的方法有什么区别吗?区别就在于第一种方法在对象池中取对象,第二种方法直接生成新的对象。

当在程序中直接用双引号引起来一个字符串时,Java虚拟机(JVM)就到String的对象池中就去检查是否有一个值相同的对象。如果有,就取现成的对象;如果没有则在对象池中创建,并返回其引用。因此,可以发现下面的代码输出true:

String str1="hello";

String str2="hello";

System.out.printn(str1==str2);//true

这说明str1和str2指向同一个对象,因为它们都是在对象池中取到的,而下面的代码输出为false

String str1="hello";

String str2=newString("hello");

System.out.printn(str1==str2);//false

   因为在任何情况下,只要new一个String对象都是创建了新的对象。其他的基本类型包装类的对象池与此类似,工作原理是一样的。对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能,那么自定义的类是否也可以使用对象池呢?当然可以,我这里就不写代码了~

Java 如何理解数组在Java中作为一个类?

 java的数组本质是一个类,该类还保存了数据类型的信息。该类通过成员变量的形式类保存数据,并且通过[]符号,使用下标来访问这些数据。在处理基本数据类型(如int)时,数组保存的是变量的值,如果我们未提供初始值,数组会把这些变量的初始值为0;而处理引用类型时(如String),数组保存的是数据的引用,如果我们没有初始化,数组会把变量的初始值为null。

Java 数组中newObject[5]语句是否创建了5个对象?

答案为否。其实是创建了一个数组实例,长度为5,每个数组元素的值均为null,并没有创建5个Object对象。如果需要创建5个Object对象,则需要为每个数组元素分别指定或用符号{}。

Java 如何拷贝数组的数据?

我们在操作Java数组的时候,其实是通过一个引用来操作数组的,如果使用简单的=操作符进行赋值的话,只是复制了引用,并没有把数组的数据复制一份.

使用System.arraycopy()方法或者创建一个新的数组实例,然后把数据一个个装进去,不能用=赋值。

Java中迭代器是什么?

 迭代器(Iterator)模式,又叫做游标模式,它的含义是,提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。迭代器,提供一种访问一个集合对象各个元素的途径,同时又不需要暴露该对象的内部细节。java通过提供Iterator和Iterable俩个接口来实现集合类的可迭代性,迭代器主要的用法是:首先用hasNext()作为循环条件,再用next()方法得到每一个元素,最后在进行相关的操作。

Java中Vector与ArrayList的区别?

Vector与ArrayList都是List接口的实现类,它们都代表数组形式的数据结构。但是,它们的实现和使用场景却有所区别。

它们二者的实现非常相似,都是用一个对象数组来存储元素的。但是,Vector的大多数成员方法都会加上synchronized关键字,也就是说Vector线程是安全的。

由于Vector操作成员的方法必须保证同步,因此它的执行效率没有ArrayList高。所以,一般情况下,只有在必须保证同步的地方才会使用Vector,而大多数情况下,使用ArrayList更适合一些。

  它们俩者的作用比较类似,一般通过add()方法来添加元素;remove()方法删除元素,size()方法得到集合元素的数量等。

示例代码如下:

[java] view plain copy

print?

  1. public class Test4 {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Vector<String>v=new Vector<>();  
  5.         v.add("hello");  
  6.         v.remove("hello");  
  7.         System.out.println(v.size());  
  8.         ArrayList<String>a=new ArrayList<>();  
  9.         a.add("hello");  
  10.         a.remove("hello");  
  11.         System.out.println(a.size());  
  12.           
  13.     }  
  14. }  

运行结果为:

[java] view plain copy

print?

  1. 0  
  2. 0  

总结: Vector是线程安全的,因为它操作元素的方法都是同步方法,而ArrayList不是。开发过程中应该根据需要进行选择,如果需要保证线程安全的地方则需要使用Vector,而不必要的时候则无需使用Vector们因为ArrayList效率会更高一些。

Java 中HashMap和HashTable的区别?

对于Map接口来说,它有俩种比较重要的实现类HashMapHashTable,它们保存元素的时候,都是无序的。但是,它们也有一定的区别,适用于不同的情况。

  HashTable相对于HashMap更早提出,应用也非常广泛,HashMap后来提出是为了代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能我们觉得HashTable很好用,为什么不用呢?这里简单分析一下它们的区别:

1.HashTable的方法时同步的,HashMap不能同步,所以在多线程场合要使用HashTable,这个区别就像Vector与ArrayList一样

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key与value都可以)。

3.HashTab有一个contains()方法,功能和containsValue()功能一样。

4.HashTable使用Enumeration遍历,而HashMap使用Iterator进行遍历

5.HashTable中hash数组默认大小是11,增加的方式是:old*2+1,HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap会重新计算hash值。

Java中什么是序列化?

 序列化本质上就是把对象内存中的数据按照一定规则,变成一系列的字节数据,然后在把这些字节数据写入到流中。而反序列化的过程相反,先读取字节数据,然后在重新组装成Java对象。

所有需要进行序列化的类,都必须实现Serializable接口,必要时还需要提供静态的常量serialVersionUID

 

 

原创粉丝点击