java基础题系列(1 - 10)

说在前面:

马上就要到秋招了,也从网上获取了一些java的基础面试题(总共有100多道),为了保持状态,每天回顾10道左右,如果result有不对的地方,希望各位大佬可以指正,谢谢。

20200706 by 1z

  1. 请你说说java和php的区别
1:java是半编译语言,php是脚本语言

2:java使用封装继承,最小的单位是类,php作为脚本,最小单位就是语句,用两者输出hello world就知道了,
所以java语法比较严格,而php很灵活

3:java是自动内存分配回收,php是一次创建一次销毁,
相同点:两者都不用考虑内存泄漏问题,
不同点:java可以常驻内存,多线程;php无法常驻内存,也没有线程的概念

4:java分三个方向      
J2ME,嵌入式设备,安卓就是目前最大的J2ME平台,不过其使用的不是JVM,而是谷歌自己开发的虚拟机      
J2SE,桌面编程,基本没落,需要JVM支持      
J2EE,web方向的编程,

5:java已经是一门很成熟的语言,或者说其语言的进一步提升已经不可能了,曾经看到一篇文章,讲编程语言的进化,其中提到,java语言的进化树太全了,使得其没有发展的空间php是在web繁荣之后兴起的语言,所以语言成熟度没有java高,2006年推出的php5.0才略微完善了面向对象的机制

ps: 网上白嫖的 这种理论题仁者见仁智者见智吧...
  1. 请你谈谈java中是如何支持正则表达式操作的
Java中的String类提供了支持正则表达式操作的方法,
包括:matches()replaceAll()replaceFirst()split()。

此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作,
  1. 请你简单描述一下正则表达式及其用途
在处理字符串时,经常会有 查找符合 某些 复杂规则的字符串的需要,正则表达式就是用于 描述这些规则的工具
  1. java和javaScript的区别
1.就像老婆和老婆饼的区别,雷锋和雷峰塔的区别一样

2.相同点
* 它们的语法和c语言很相似
* 它们都是面向对象的
* javascript在设计的时候参考了java的命名规则

3.不同点
* javascript是动态类型的语言,java是静态类型的语言(运行期确定数据类型)
	静态:编译时确定数据类型,发现类型错误等错误
	动态:运行时确定数据类型,发现类型错误等错误
	
* JavaScript是弱类型的,java是强类型的
	强类型:不容忍数据类型隐形转换
	弱类型:容忍数据类型隐形转换
	
* javascript是基于原型的 java是基于类的
  1. 在java中如何跳出当前的多重嵌套循环
* 使用break + flag
* 可以使用throw new Exception("xxx") 跳出循环
* 直接return
* 使用break + 标号label
	public class OutLoopWithLabel{
	public static void main(String args[]) {
		ok: // 设定跳出当前循环的一个标号 注意ok后面是冒号:
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j <= 10; j++) {
				System.out.println("i=" + i + ",j=" + j);
				if (j == 5)
					break ok; // 设定跳出当前循环的一个标号
			}
		}
	}
}

-----------------------------------------------
public class BreakLabel {
	public static void main(String[] args) {
		boolean flag = false;
		for(int i = 0;i < 10 && !flag;i++) {
			for(int j = 0;j <= 10;j++) {
				System.out.println("i=" + i + ",j=" + j);
				if(j == 5) {
					flag = true;
					break;
				}
			}
		}
	}
}
--------------------------------------------------------
throw
--------------------------------------------------------
return 
  1. 请你讲讲& 和 && 的区别
对于 两侧不是boolean值而言:
&&无效,& 表示进行位运算(与运算),&00’
tip: 计算某二进制数的最低位1的数量 可以使用 x & (x - 1)进行计算
剑指offer原题: 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n != 0){
            count++;
            n = n & (n - 1);
        }
        return count;
    }
}

对于两侧是boolean值而言:
&&& 都可以表示为逻辑与(and),当两侧为true的时候,结果为true,否则只有一方为false,结果为false

同时 && 具有短路的功能 只要第一个表达值为false 就不会进行计算下一个

tip: if(str != null && !str.equals(""))表达式
当str == null的时候
&& 不会抛出 NullPointerException
& 会抛出 NullPointerException




  1. int 和Integer有哪些区别?
* Integer是int的包装类;int是基本数据类型;
* Integer变量必须实例化后才能使用;int变量不需要;
* Integer实际是对象的引用,指向此new的Integer对象(new在堆上);int是直接存储数据值(基本数据值存储在栈区的局部变量表内部)* Integer的默认值是null;int的默认值是0
------------------------------------
* 拓展点
1. Integer的常量池技术(简单而言 建立Integer值在 -128-127之间的时候就会直接使用池内数据)【源码可查】
public static Integer valueOf(int i) {
         assert IntegerCache.high >= 127;
         if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
         return new Integer(i);
     }
     
2. Integer和int的自动拆装箱机制(https://blog.csdn.net/wufaliang003/article/details/82347077)

# 装箱源码
int val = 10;
Integer i = Integer.valueof(10);

# 拆箱源码
Integer integerVal = 100;
int val = integerVal.intValue();


  1. 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,请你讲讲如何输出一个某种编码的字符串
/**
	 *  1、public String(byte[] bytes, Charset charset) :
	 * 使用指定的字符集解码指定的字节数组来构造新的字符串。

      2、public byte[] getBytes(Charset charset):
      使用给定的字符集将该字符串编码为一个字节序列,并将结果存储到一个新的字节数组中。
	 * */
	//以下代码实现了将字符编码为iso8859-1的字符串 => 输出为gbk编码的字符串
	public static String translate(String str) throws IOException{
		return new String(str.getBytes("ISO-8859-1"), "GBK");
	}
  1. 请你说明以下String和StringBuffer的区别(再加一个StringBuilder)
String: 不可变的字符序列

StringBuilder: (jdk 1.5)可变的字符序列,效率高,但是线程不安全

StringBuffer: 可变字符序列,效率低,但是线程安全(效率低的原因 内部有很多重量锁操作 synchronized------------------------------------------------
String 底层是一个finalchar[] 数组,在每次对String的操作都会生成新的String对象,造成内存的浪费
private final char value[]

补充内容: String内部的缓冲池: 
https://blog.csdn.net/TTTZZZTTTZZZ/article/details/84892985?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
------------------------------------------------
StringBuilder和StringBuffer继承了AbstractStringBuilder,底层是一个char[](没有final!!!)
    
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 
StringBuilder 的方法不是线程安全的(不能同步访问)

由于 StringBuilder 相较于 StringBuffer 有速度优势,
所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,
则必须使用 StringBuffer 类。
--------------------------------------------------------

  1. 请你说明一下int和Integer的区别(重复题 )
* Integer是int的包装类;int是基本数据类型;
* Integer变量必须实例化后才能使用;int变量不需要;
* Integer实际是对象的引用,指向此new的Integer对象(new在堆上);int是直接存储数据值(基本数据值存储在栈区的局部变量表内部)* Integer的默认值是null;int的默认值是0
------------------------------------
* 拓展点
1. Integer的常量池技术(简单而言 建立Integer值在 -128-127之间的时候就会直接使用池内数据)【源码可查】
public static Integer valueOf(int i) {
         assert IntegerCache.high >= 127;
         if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
         return new Integer(i);
     }
     
2. Integer和int的自动拆装箱机制(https://blog.csdn.net/wufaliang003/article/details/82347077)

# 装箱源码
int val = 10;
Integer i = Integer.valueof(10);

# 拆箱源码
Integer integerVal = 100;
int val = integerVal.intValue();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值