刷题-java

1. 在 JAVA 编程中, Java 编译器会将 Java 程序转换为(字节码)

解释:

  • 编译器将Java源代码编译成字节码class文件
  • 类加载到JVM里面后,执行引擎把字节码转为可执行代码
  • 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行

2. 执行语句“int a= ’ 2 ’ ”后,a的值是(50 )

a是int类型,单引号是字符型 记住0是48 A是65

常用ASCII码值:空格为32;数字0为48;“A”为65;“a”值为97

3. 面向对象的五大基本原则: 
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 
开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。 
Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。 
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。 
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口

4. 

常量池:存放字符串常量和基本类型常量(public static final)。 常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。

5. 接口中的变量默认是public static final 的,方法默认是public abstract 的

6. 

  • 为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包。Java中的包一般均包含相关的类,java是跨平台的,所以java中的包和操作系统没有任何关系,java的包是用来组织文件的一种虚拟文件系统。A错

  • import语句并没有将对应的java源文件拷贝到此处仅仅是引入,告诉编译器有使用外部文件,编译的时候要去读取这个外部文件。B错

  • Java提供的包机制与IDE没有关系。C错

  • 定义在同一个包(package)内的类可以不经过import而直接相互使用。

7. 

  • 对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们

  • 成员内部类位于外部类内部,可以直接调用外部类的所有方法(静态方法和非静态方法)

8.

效率:StringString(大姐,出生于JDK1.0时代) 不可变字符序列     <StringBuffer(二姐,出生于JDK1.0时代)  线程安全的可变字符序列   <StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列   。Java中的String是一个类,而并非基本数据类型。string是值传入,不是引用传入。 StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大区别。但在线程安全性方面,StringBuffer允许多线程进行字符操作。 这是因为在源代码中StringBuffer的很多方法都被关键字 synchronized  修饰了,而StringBuilder没有。StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。另外,JVM运行程序主要的时间耗费是在创建对象和回收对象上9.抽象类可权转交给视图(视图由HTML生成);

11. hashCode()方法和equals()方法

hashCode()方法和e

以被抽象类继承,也可以被非抽象类继承

10.MVC是一种在web应用中常用的架构,下列说法正确的是(ABC)

A. 模型通常代表应用程序中的数据以及用于操纵数据的业务逻辑;

B. 视图是其对应的模型的可视化呈现,视图 将模型渲染成适合于交互的形式(通常为用户界面元素);

C. 控制器是用户与系统之间的纽带,它接受用户输入,并指示模型和视图基于用户输入执行操作(处理数据、展示数据);

D. MVC模式在web应用中的常见实践是:模型接受来自于用户的GET或POST请求数据并决定如何处理,模型将用户数据转交给控制器,控制器将控制

quals()方法的作用其实是一样的,在Java里都是用来对比两个对象是否相等一致。

那么equals()既然已实现比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

那么hashCode()既然效率这么高为什么还要equals()呢 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,

所以我们可以得出:

1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。

2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

所有对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

12. 记住就行 接口 只能用 public 和 abstract 修饰

13. 重载是在同一个类中,有多个方法名相同,参数列表不同(参数个数不同,参数类型不同),与方法的返回值无关,与权限修饰符无关

14.

能被java.exe成功运行的java class文件必须有main()方法;

在JDK5之后,J2SDK 改名为 Java SE DK(简称依然是JDK) ,它是java开发编程的工具,提供了编译功能和运行环境等,包含jdk和jre。但它不是java编程开发的平台。Java API 是Java应用程序编程接口,它和JDK不是一回事

appletviewer(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器,就是用来解释执行java  applet应用程序的,简单理解就是没有main函数的继承applet类的 java 类。类似于WEB上开发的java类,不需要写main函数。

15. java程序的种类

  1. Application:Java应用程序,是可以由Java解释器直接运行的程序。
  2. Applet:即Java小应用程序,是可随网页下载到客户端由浏览器解释执行的Java程序。
  3. Servlet:Java服务器端小程序,由Web服务器(容器)中配置运行的Java程序。

16. 变量初始化

  1. 类变量(静态变量)在类加载过程的准备阶段会进行一次赋值,一般是空值或constantValue属性值,同时在初始化阶段会调用类构造器再进行一次赋值。
  2. 而实例变量在创建对象时会调用实例构造器进行一次赋值。因此无论是类变量还是实例变量,在使用前都是非空的。
  3. 而局部变量没有初始化过程,在使用前必须赋值。

17.    构造方法

  1. 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;
  2. 构造方法不是类的成员方法;
  3. 构造方法不能被继承。

18.

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化

19. 构造方法

  1. 构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
  2. 一个源文件中有多个类时,构造函数不一定与公共类同名,因为每个类都可以有构造函数。

20. 

  • Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。

  • Java的char类型,通常以UTF-16 Big Endian的方式保存一个字符。

21. 字符串的引用传递

String str = "hello";     
foo(str); // str 也没有被改变
System.out.println(str);


static void foo(String text) {
     text= "windows";        
}

输出还是hello,传递的是对象的地址,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变

22.迭代器

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。   Java中的Iterator功能比较简单,并且只能单向移动:   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。   (2) 使用next()获得序列中的下一个元素。   (3) 使用hasNext()检查序列中是否还有元素。   (4) 使用remove()将迭代器新返回的元素删除。   Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

22. 

  1. intValue()是把Integer对象类型变成int的基础数据类型; 
  2. parseInt()是把String 变成int的基础数据类型; 
  3. Valueof()是把String 转化成Integer对象类型;

23.

  • 堆区:只存放类对象,线程共享;
  • 方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
  • 栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;

24.Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

25.下面列出了Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型(Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。)。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

适用场景:
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择ArrayList。而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。

26.ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
27. Comparable接口和Comparator接口

  • Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象
  • Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

28. &和&&

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。 

29. 静态变量和实例变量的区别?

  • 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
  • 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

30 . 

java中源文件的后缀为.java,经过javac.exe编译后生成字节码文件,后缀为.class,再经过java.exe编译为可执行文件,后缀为.exe。

31. 类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错。

32. 

finally一定会执行的,有两种情况:

  • finally中有return语句,当try执行到return时会执行finally中的代码,其中有return 就直接返回了
  • finally中不含return语句,那么当执行到return时,它会被保存等待finally执行完毕后返回,这个时候无论finally内部如何改变这个值,都不会影响返回结果

33. 构造函数不能被继承,只能被调用

34.

  • servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁。​​​​​
  • 而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet,CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中

35. 网络通信

IP地址是用一个点来分成四段的,在计算机内部IP地址是用四个字节来表示的,一个字节代表一段,每一个字节代表的数最大只能到达255。

TCP和UDP位于同一层,都是建立在IP层的基础之上。由于两台电脑之间有不同的IP地址,因此两台电脑就可以区分开来,也就可以互相通话了。通话一般有两种通话方式:第一种是TCP,第二种是UDP。TCP是可靠的连接,TCP就像打电话,需要先打通对方电话,等待对方有回应后才会跟对方继续说话,也就是一定要确认可以发信息以后才会把信息发出去。TCP上传任何东西都是可靠的,只要两台机器上建立起了连接,在本机上发送的数据就一定能传到对方的机器上,UDP就好比发电报,发出去就完事了,对方有没有接收到它都不管,所以UDP是不可靠的。TCP传送数据虽然可靠,但传送得比较慢,UDP传送数据不可靠,但是传送得快

一般的网络编程都称为Socket编程,Socket的英文意思是“插座”

 两台电脑都安装上一个插座,然后使用一根线的两端插到两台电脑的插座上,这样两台电脑就建立好了连接。这个插座就是Socket。

  因为互相之间都能互相通信,我说你是我的Server只是从逻辑意义上来讲,我应该把东西先发到你那里去,然后由你来处理,转发。所以你叫Server。但从技术意义上来讲,只有TCP才会分Server和Client。对于UDP来说,从严格意义上来讲,并没有所谓的Server和Client。TCP的Server的插座就叫ServerSocket,Client的插座就叫Socket。

  两台计算机互相连接,那么首先必须得知道它们的IP地址,但是只提供IP地址是不够的,还必须要有连接的端口号,也就是要连接到哪个应用程序上。

  端口号是用来区分一台机器上不同的应用程序的。端口号在计算机内部是占2个字节。一台机器上最多有65536个端口号。一个应用程序可以占用多个端口号。端口号如果被一个应用程序占用了,那么其他的应用程序就无法再使用这个端口号了。记住一点,我们编写的程序要占用端口号的话占用1024以上的端口号,1024以下的端口号不要去占用,因为系统有可能会随时征用。端口号本身又分为TCP端口和UDP端口,TCP的8888端口和UDP的8888端口是完全不同的两个端口。TCP端口和UDP端口都有65536个。

36. sleep和wait的区别有:

  • 这两个方法来自不同的类分别是Thread和Object
  • 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法 wait,
  • notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
  • sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

猜你喜欢

转载自blog.csdn.net/qq_38635681/article/details/88547809