Java基础知识面试

jdk垃圾回收机制?

随着程序的运行,内存中的实例对象、变量等占据的内存越来越多,如果不及时进行回收,会降低程序运行效率,甚至引发系统异常。

垃圾回收指方法区和堆 ,回收的对象为那些不存在任何引用的对象。

本地方法栈、程序计数器、虚拟机栈。他们的生命周期是和线程同步的,随着线程的销毁,他们占用的内存会自动释放。

String、StringBuilder、StringBuffer 的区别?

Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它 们可以储存和操作字符串。其中 String 是只读字符串,也就意味着 String 引用的 字符串内容是不能被改变的。而 StringBuffer/StringBuilder 类表示的字符串对象 可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方 法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被 synchronized 修饰,因此它的效率也比 StringBuffer 要高。

String常用api

length()  字符串的长度

charAt(index) 指定索引位置上的字符

indexOf(字符) 检索字符串,返回第一次出现的位置

lastIndexOf(字符)  返回最后一次出现的位置

contains(字符) 是否包含该字符

starWith(字符) 是否已指定字符开头

endswith(字符) 是否已指定字符结尾

subString(index) 截取字符串

                                一个index 从指定位置截取,含头

                                两个index,含头不含尾

replace(字符,字符) 字符串替换

tolowercase()转小写

touppercase() 转大写

trim() 去除首尾空格

valueof(数据类型) 数据类型转化

split()分割字符串,字符串转为数组

== 和 equals 的区别

== 比较的是地址值

equals : 重写前比较的是地址值

                默认重写后,比较的是属性值

list,set,map的区别

list接口

                有序 可重复,父接口connection

                实现类ArrayList 底层维护的是数组查询快 增删改慢 

                 实现类LinkedList 底层维护的是链表 增删快 查询慢    

                实现类Vector 底层维护的是数组 与 ArrayList相同  

                 Vector线程安全,但是因为每个方法都加上了synchronized,

                所以在效率上小于ArrayList
set接口

                无序 不可重复 可以存null值只能存一个,父接口connection

                HashSet实现类  底层用了hash表算法 底层也是一个数组

                LinkedHashSet  继承了HashSet 底层也是哈希表数据结构 又保持数据的先后添加顺序

                又加了链表结构 效率低  如果要求一个集合即要求元素不重复又要求保证顺序才用它
              (有序)

                 TreeSet  实现类 底层采用的是红黑树算法 在TreeSet集合中只能存储相同类型对象的

                 引用(值不能为空)

                 Tree最重要的就是它的两种排序方式:自然排序和客户端排序

                 自然排序实现了Comparable接口

                 客户端排序就是实现这个接口提供的具体排序方式 

  map接口

                 无序 Map是一个键值对进行映射的集合 map支持多级映射 map中键是唯一的 值可以不

                 唯一

                 HashMap 利用哈希表完成 有key有value 允许有null值 (有序)

                 TreeMap是一个有序的k-v集合 通过红黑树实现的 继承了AbstractMap所以他是

                一个集合

                实现了Cloneable接口 可以被克隆 实现了Serializable接口 支持序列化 key不可以为空,

                值(value)可以

                 HashTable 实现map接口实现一个k-v映射的哈希表 任何非空的对象都可做k或v 线程安

                 全

什么情况下用+运算符进行字符串连接比调用?

任何字符串拼接都可以用+,编译时将"+"转换成StringBuilder,但运行效率和资源消耗方面存在很大的区别。+ 效率低,性能差

StringBuffer/StringBuilder 对象的 append 方法连接字符串性能更好?

jdk1.4之后出现的StringBuilder类

StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是

线程安全的。因此,StringBuilder的效率会更高。

重载和重写的区别?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性, 而后者实现的是运行时的多态性。

重载发生在一个类中,同名的方法如果有不同 的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;

重写是子类不满父类方法重写父类方法 满足ocp原则
两同 方法名参数列表相同
两小 子类返回值类型小于等于父类 子类异常抛出类型小于等于父类
一大 子类方法修饰符大于等于父类

简述class文件的加载

JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的。

类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器

final关键字的用法

(1)修饰类:表示该类不能被继承;

(2)修饰方法:表示方法不能被重写;

(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

什么是线程池?

线程池顾名思义就是事先创建若干个可执行的 线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完 毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

线程的几种基本状态

就绪、运行、阻塞(三态)

创建、就绪、运行、阻塞、终止(五态)

如何判断程序是否有线程安全问题?

1.是否是多线程程序

2.是否有共享数据

3.是否有多条语句使用共享数据

说一说你遇到的设计模式

设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联和组合关系的充分理解。

创建性模式:

单例模式、工厂模式、建造者模式、等等

结构型模式:

适配器模式、桥接模式、装饰模式、享元模式,代理模式等等

行为型模式:

迭代器模式、观察者模式、策略模式、职责链模式、等等。

常见的异常

算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException

权限访问异常:IllegalAccessException

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值