java基础---基础面试题汇总

面试题汇总

JAVAEE部分

1. 线程与进程的区别?

进程:
一个应用程序 可以看成是一大段代码 是计算机资源调度的最小单位
线程:
计算机线程和进程中线程不是同一个,
计算机最大的线程数:核心数X线程数
进程中的线程是:理论上需要有多少个线程任务

进程与进程之间没有数据共享 线程与线程之间有数据共享

2.线程的创建方式

继承Thread

1.创建类 继承Thread
2.覆写run方法 完成功能
3.创建对象 调用start

实现Runnable接口

1.创建一个类 实现Runnable接口
2.覆写run方法 完成功能
3.创建实现类对象
4.将实现类的对象作为参数 创建一个线程
5.调用start方法

实现Callable接口 有返回值

3.线程的状态(大致)

征程流程:创建 --》就绪–》执行–》结束
|
–>阻塞(同步阻塞 等待阻塞 其他阻塞 )sleep

4.解决线程安全

1.同步 synchronized

同步代码块
监听对象:特点 唯一性
1.this
2.字节码
3.其他对象(匿名对象不能 普通对象要static修饰 String有常量池的)
同步方法:
默认监听对象是this

2.加锁 Lock

加锁的功能更强大
总结:
同步是由jvm来维护 加锁是代码级别 需要释放锁 效率要更高一些

5.底层基于数组(ArrayList)和基于链表容器(LinkedList)了的区别?

相同点
都能够对任意类型任意个数的数据进行管理(增加修改删除查找)
不同点
底层基于数组的方式:由于有索引可以直接定位到该数据 所以修改和查找较快 而增加和删除较慢 因为涉及到数据的复制
底层基于链表的方式 增加 较快

6.ArrayList 和 LinkedList的区别?

相同点
任意多个任意类型的数据 有序可重复
线程不安全
便利方式相同,for/foreach/迭代
区别
ArrayList 一种底层基于数组实现:查改快,增删慢
LinkedList 一种底层基于链表实现: 查改慢,增删快
数组: 具有索引 可以根据索引直接定位到数据的位置 查询快
链表: 查找需要遍历,查找慢
数组:增加涉及扩容和复制整个数组,增删除慢
链表:直接增加在头或尾 新增效率较快

7.HashSet与TreeSet的区别

相同点:
线程不安全,无序不重复
遍历方式相同:foreach/迭代器
不同点:
去重标准:
hashSet:
1.通过hashcode和equals方法共同决定
2.hashcode让存放的数据 散列均匀分分布,减少hash碰撞
3.equals 方法 当hashcode相同的时候 调用
TreeSet:
自然排序:如果放的是对象 对象对应的类应该实现comparable接口
定制排序:自定义一个比较器 覆写comparato方法 定义比较规则

8.List和Set的区别

相同点:
都是集合,继承了Collection接口
都可以存放任意类型,任意多个数据
不同点:
List 有序可重复
Set 无序不可重复,和map接口有关

9.HashMap底层

10.HashMap Hashtable ConcurrentHashMap区别

相同点:
1.都是map实现类,都是键值对
2.键都不能重复,可以存储任意类型任意多个数据
3.遍历要通过keySet和entrySet方法来进行遍历
不同点
HashMap线程不安全 可以以null作为key或value 效率高
Hashtable线程安全 不能以null作为key或value 效率较低 同步的方法
ConcurrentHashMap 线程安全 不能以null作为key或value 效率较高 同步的代码快

11.遍历当前目录下的所有以txt结尾的文件

public class FileTest {
	/*
	 * 设计一个方法  该方法用于找出一个文件夹中  以txt结尾的文件
	 * 1.拿到文件夹中所有的文件对象
	 * 2.判断文件对象是否时文件或者文件夹
	 * 3.如果时文件  此时判断文件后缀名是否是txt结尾
	 * 4.如果是  创建一个容器  将该文件对象放入容器中
	 * 
	 * */
	public static void main(String[] args) {
		File file = new File("D:/lvtest");
		List<File> files = getFiles(file, "txt");
		System.out.println(files);

	}
	static List<File> getFiles(File f,String ends){
		ArrayList<File> list = new ArrayList<File>();
		//首先判断参数文件对象是为空 并且不是一个文件对象
		if(f!=null&&f.isDirectory()){
			File[] files = f.listFiles();
			//遍历数组 判断每个元素是否为文件或者文件夹
			if(files.length!=0){
				for (File file : files) {
					//该文件对象是一个文件
					if(file.isFile()){
						//判断文件是否是以txt结尾
						String name = file.getName();
						if(name.endsWith(ends)){
							//将满足条件的文件装入容器中
							list.add(file);
						}
					}
				}
			}
		}
		return list;
	}
}

面向对象

1.什么是面向对象

是一种编程思想,在java中万物皆可是对象;
在java中主要通过类和对象来体现;
类:从不同维度去描述某一类事物 不会具体指代某个个体 相当于一个模板
对象:该分类中某一个具体的个体 相当于就是复制了一份模板 可以填写具体的数据信息
比如 人可以从肤色 国籍 身高。。。。去描述人类 类
具体的某个人 比如 Lucy 肤白 美国 180 就是对象

2.this static super final关键字

this

定义:当前的方法被谁调用 this就指向谁的地址
作用:
1.解决成员变量与局部变量的二义性
2.作为参数传递
3.作为返回值返回
4.调用构造方法 必须放在构造方法中的第一句
注意:不能static修饰的方法中使用this

static

定义:是一个修饰符 有static会被jvm优先加载
可以修饰:内部类 成员变量 普通方法
作用:
1.static修饰的字段,被该类中的所有对象共享
2.static修饰的方法,方便使用

super

定义:指向父类的地址 在子类中可以看成是父类的对象
作用:
1.可以调用父类的构造方法(只能在子类中的构造方法中使用 并且必须在第一句)
2.可以调用父类的普通方法(哪怕子类中有覆写的方法 还是会调用父类)
3.创建子类对象的时候会隐式的调用父类无参的构造方法 如果有显示的调用父类的构造方法 隐式的调用就不再存在了

final

定义:最终的 关键字 修饰符
作用:
成员变量:必须赋予初始值
局部变量:一旦赋值不能更改
普通方法:不能被覆写
外部类:不能被继承
注意:不能修饰:构造方法
使用情况: final 主要和static一起使用 对全局常量的修饰

3.说一说面向对象的三大特征

封装

定义:将一些属性隐藏起来 提高安全性 通过私有化字段 然后对外提供公共可访问的方法来实现
标准的javabean:
1.私有化字段(private修饰字段)
2.提供getter和setter方法
3.提供一个无参的构造方法

继承

定义:将一些共有属性抽取出来成为父类,然后其他继承该类 可以获取到共有的一些属性和方法
可以继承:成员变量 普通方法 不可继承:构造方法
特点:
1.单继承
2.多重继承
3.如果一个类没有显示的继承关系 那么隐式Object
作用:提高复用性

多态

定义:编译和运行时类型不一致的情况 称为多态
特点:
1.编译看左边 运行看右边 编译只看类型
2.如果由static修饰 运行的时候还是看编译的类型
作用:屏蔽了子类之间的实现差异

4.覆写toString和equals的意义

覆写toString

需要打印对象描述的时候,原方法不符合我们打印对象描叙的需求,覆写后可以准确打印对象的描述。

覆写equals

需要比较两个对象是否相等的时候,Object类中的equals方法不符合我们对于一个类对象比较的需求。

5.== 和 equals区别

相同
a 传统的理解一般都是数字值是否相等;
b 在程序中任何东西都是数据,都会比较是否相等[ 对象 ]
不同点
没有覆写equals之前的区别:
两个比较的都是引用数据类型变量的地址值
==可以进行基本数据类型变量值的比较,equals不行
覆写后的区别:
equals比较的是对象的属性值是否相等
==比较的是对象的地址值

6.单例模式

实现单例模式:
1.私有化构造方法
2.准备一个对象
3.对外提供一个公共静态的方法返回准备的对象
作用
1.控制资源的使用,通过线程同步来控制资源的并发访问
2.控制实例产生的数量,达到节约资源
3.作为同学媒介,数据共享
使用场景
1.只需要一个对象的时候
2.工具类多采用单例模式
3.jdbc连接

懒汉模式(被动、具有线程安全问题)

class LazyModel{
	//私有化构造方法
	private LazyModel(){}
	private static LazyModel instance;
	public static LazyModel getInstance(){
		if(instance==null){
		    instance = new LazyModel();
		}
		return instance;
	}
}

饿汉模式(主动)

class HungryModel{
	//私有化构造方法
	private HungryModel(){}
	//事先创建好对象
	private static HungryModel intansce;
    static{
		intansce = new HungryModel();
		//更多语句
	}
	//对外提供一个公共可访问的静态方法
	public static  HungryModel getIns(){
		return intansce;
	}
}

7.抽象类与接口的区别

相同点:
都只有覆写过抽象方法后才能实例化
都不能进行实例化,都支持多态
区别:
1.抽象类是本质一个类,接口是一个与类类似的一种接口
2.类是单继承,多重继承 接口可以被接口多继承,多重继承,接口只能被实现,可以多实现
3.类中有构造方法但不能实例,接口中没有构造方法
4.接口中的字段默认由public static final修饰 方法默认由public abstract修饰。java1.8之后才允许由普通方法
5.抽象类一般是作为模板类 接口是可以作为模板类也可以定义全局变量

8.String创建对象问题

关于这一部分的CSDN文章链接:
原文:https://blog.csdn.net/ChengHuanHuaning/article/details/97523846

1.String s1 = "a" +"b"+"c";   //1个对象
2. String s2 = "a";		    //1个对象
  String s3= s2 +"bc";   	//3个对象
3.String s4 = new String("你") + s2 + "b";  	  //5个对象
-----------------下面代码与上面代码没有联系-------------------------------
1.String s6 = "a";
2.String s7= "b" +"c" + s6;  	 //3个对象
3.String s8= s6 + "d" +"f" ;	 //4个对象
4.String s9= "ab" + "cd" + s6 + "b" +"c"   //5个对象

下面是这些编译过后的代码,来帮助理解

1.String s1 = "abc";
2.String s2 = "a";
  String s3 = s2 + "bc";
3.String s4 = new String("你") + s2 + "b";
-----------------下面代码与上面代码没有联系-------------------------------
1.String s6 = "a";
2.String s7 = "bc" + s6;
3.String s8 = s6 + "b" + "c";
4.String s9= "abcd" + s6 + "b" +"c"
--------------------- 

基础方面

1.java跨平台原理

通过在不同的平台上安装不同的jvm虚拟机,jvm虚拟机可以运行编译后的字节码文件。从而达到跨平台原理。

2. jdk jre jvm三者之间的关系?

jvm:运行字节码文件
jre:包含jvm以及一些核心类库
jdk:包含jre以及一些基础类库和一些工具 比如(java javac javadoc)

3.值传递和引用传递

基本数据类型在作为参数传递的时候 传递的是值本身
引用数据类型在作为参数传递的时候 传递的是引用地址 String除外

原创文章 25 获赞 70 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ChengHuanHuaning/article/details/103703837