1. Java中的基本数据类型都有什么,每种类型所占的字节数
分成四个大类,共八种:byte 、short 、int 、long、float 、 double、boolean、char
- 整型 byte 、short 、int 、long
- 浮点型 float 、 double
- 字符型 char
- 布尔型 boolean
byte 1
short 2
int 4
long 8
float 4
double 8
boolean 1/4
char 2
注意
1. boolean类型
被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节
2. boolean数组
在Oracle的JVM中,编码为byte数组,每个boolean元素占用8位
=1字节
如果boolean是单独使用:boolean占4个字节。
如果boolean是以“boolean数组”的形式使用:boolean占1个字节。
2. final关键字可以修饰什么?用什么作用?
final可修饰类,方法,常量
- final修饰方法不能被重写
- final修饰类不能被继承
- final修饰属性为常量不能被修改
3. Java中基本数据类型对应的包装类是什么?为什么要用到包装类?
byte—Byte
short—Short
int—Integer
long—Long
float—Float
double—Double
boolean—Boolean
char—Character
- 包装类类型可以存放null
- 特定场合需要包装类,比如集合的泛型
- 包装类类型可以调用类中事先定义的方法
4. Java中常见的异常
-
NullPointerException:空指针异常,当操作一个 null 对象的方法或属性时会抛出这个异常。是一个很头疼的异常,因为它是运行时异常,不需要手动捕获,但运行时碰到这个异常会中断程序。
-
OutOfMemoryError:内存溢出异常,这不是程序能控制的,当需要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。
-
IOException:IO,即:Input、Output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。
比如读写文件是需要抛出异常:
public int read() throws IOException public void write(int b) throws IOException
-
FileNotFoundException:找不到文件异常,如果文件不存在就会抛出这种异常。
如定义输入输出文件流,文件不存在会报错:
public FileInputStream(File file) throws FileNotFoundException
public FileOutputStream(File file) throws FileNotFoundException
FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。 -
ClassNotFoundException:类找不到异常,Java开发中经常遇到的一种异常,这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。它是受检查异常,需要进行手工捕获。
public static <T> Class<T> getExistingClass(ClassLoader classLoader, String className) {
try { return (Class<T>) Class.forName(className, true, classLoader); } catch (ClassNotFoundException e) { return null; } }
-
ClassCastException:类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。
如将一个数字强制转换成字符串就会报这个异常:
Object x = new Integer(0);
System.out.println((String)x);
它是运行时异常,不需要手工捕获。 -
NoSuchMethodException: 没有这个方法异常,一般发生在反射调用方法的时候:
public Method getMethod(String name, Class<?>… parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); Method method = getMethod0(name, parameterTypes, true); if (method == null) { throw new NoSuchMethodException(getName() + “.” + name + argumentTypesToString(parameterTypes)); } return method; } 复制代码 它是受检查异常,需要手工捕获。
-
IndexOutOfBoundsException: 索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。
它是运行时异常,不需要手工捕获。
-
ArithmeticException: 算术异常,发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。
此异常虽然是运行时异常,可以手工捕获抛出自定义的异常,如:
public static Timestamp from(Instant instant) { try { Timestamp stamp = new Timestamp(instant.getEpochSecond() * MILLIS_PER_SECOND); stamp.nanos = instant.getNano(); return stamp; } catch (ArithmeticException ex) { throw new IllegalArgumentException(ex); } }
-
SQLException: SQL异常,发生在操作数据库时的异常。
如下面的获取数据库连接时:
public Connection getConnection() throws SQLException { if (getUser() == null) { return DriverManager.getConnection(url); } else { return DriverManager.getConnection(url, getUser(), getPassword()); } }
它是受检查异常,需要进行手工捕获。
5. String常用的API
方法名 | 说明 |
---|---|
public int length() | 返回此字符串的长度 |
public char charAt(int index) | 获取某个索引位置处的字符 |
public char[] toCharArray(): | 将当前字符串转换成字符数组返回 |
public String substring(int beginIndex, int endIndex) | 根据开始和结束索引进行截取,得到新的字符串(包前不包后) |
public String substring(int beginIndex) | 从传入的索引处截取,截取到末尾,得到新的字符串 |
public String replace(CharSequence target, | 使用新值,将字符串中的旧值替换,得到新的字符串 |
public String[] split(String regex) | 根据传入的规则切割字符串,得到字符串数组返回 |
public int indexOf(String str) | 返回此字符串中第一次出现指定子字符串的索引 |
6. 抽象类的特点?
- 没有方法体的方法为抽象方法
- 一个类如果有抽象方法,则这个类得是抽象类
- 如果一个类是抽象类,不一定有抽象方法
- 抽象类是父类可以强制要求其子类实现父类的所有抽象方法,定义了一组规则
- 子类未实现父类所有抽象方法则其也是抽象类 (只要子类没有把从父类继承的抽象方法全部实现(注意是全部实现),就必须也变成抽象类。)
- 抽象类不能直接通过new实例化
7. 抽象类和接口的区别
抽象类:abstract
- 抽象类不能被实例化
- 抽象类可以不含有抽象方法,但含有抽象方法的类必须是抽象类
- 抽象类的子类必须实现其抽象方法:如果一个类继承了抽象类,那么它必须强制实现抽象父类中所有的抽象方法,否则这个类也必须声明为抽象类
接口:interface
- 默认存放的是公开的抽象方法
- 属性来说,接口中存放的是静态常量
- 接口可以多重实现关键字 implements
- 1.8之后,接口中可以添加default和static
- 如果实现多个接口,接口中有相同名字default的方法则需要重写
8. 类与类的三种关系
- 继承:is a 一个类和另一个类是父子关系
- 依赖:use a 一个类是另一个类的方法的参数
- 关联:has a 一个类是另一个类的属性
9. CSS选择器都有哪些
id选择器,标签选择器,类选择器
10. 继承的关键字是什么,继承有什么特性?
-
继承的关键字 子类 extends 父类
-
继承的特性:
- 单一的,类之间父类只有一个
- 单向的,父类非私有的成员子类可以使用,子类的成员父类不能使用。
11. super关键字用法
- 出现在子类构造器中,实现调用父类构造方法,只能出现在第一行上,默认子类调用父类无参构造器。
- 出现在成员方法中,调用父类的方法,不用出现在第一行
12. final关键字用法
- final修饰方法不能被重写
- final修饰类不能被继承
- final修饰属性为常量不能被修改
13. 重写和重载的区别
-
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载 (Overloading)。
-
方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写 (Overriding)。
-
发生在父子关系上
(头大身子一样尾巴小:)子类访问权限不能比父类更严格,
返回值类型,方法名,参数列表都与父类一致,
不能抛出比父类更多的异常
-
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
14. 包装类的用途
- 包装类类型可以存放null
- 特定场合需要包装类,比如集合
- 包装类类型可以调用类中事先定义的方法
15. Java中static关键字的作用
- 静态成员变量,内存只有一份备份
- 静态成员可以直接类名调用
- 属性可不可以直接在静态方法中使用
16. Java中封装的作用和意义
-
作用: 属性私有化,公开get、set方法;
-
意义:
- 隐藏具体实现细节
- 提高数据安全性,不能随意为属性赋值
17. 构造器的作用和特点
构造方法(构造器)
-
特点:
- 没有返回类型
- 方法名和类名相同
- 在一个类中没有任何构造器时,系统默认给一个无参的构造方法;
- 当一个类中写了带参构造方法时,则系统默认无参构造器失效,需要无参构造器则显式声明
-
作用: 为属性赋值
18. String、StringBuffer、StringBuilder的区别
- String和StringBuffer的区别:
可变性: String对象是不可变的,一旦创建,就无法修改;而StringBuffer和StringBuilder都是可变的,可以进行增删改操作。
性能: 由于String是不可变的,每次对String进行操作都会创建一个新的String对象,因此在大量操作字符串的场景下,String的性能较低;而StringBuffer和StringBuilder的性能较高,因为它们可以在原有的对象上进行操作,避免了频繁创建新的对象。 - StringBuffer和StringBuilder的最大区别是线程安全性。
StringBuffer是线程安全的,即它的每个方法都被synchronized关键字修饰,可以保证多个线程同时调用StringBuffer的方法时不会出现数据不一致的问题。这是因为在多线程环境下,如果有多个线程同时修改同一个StringBuffer对象,可能会出现数据竞争的问题,导致结果出现错误。而synchronized关键字可以保证每次只有一个线程可以访问该对象的方法,避免了数据竞争的问题。 - StringBuilder不是线程安全的,即它的每个方法都没有被synchronized关键字修饰,可以提供更高的性能。但是在多线程环境下,如果有多个线程同时修改同一个StringBuilder对象,可能会出现数据竞争的问题,导致结果出现错误。
因此,如果在单线程环境下进行字符串操作,建议使用StringBuilder,因为它的性能更高。如果在多线程环境下进行字符串操作,建议使用StringBuffer,以保证数据的一致性。
19. this关键字的作用
- this:当前对象的引用
- this构造方法中调用本类中的其他的构造方法
- 如果this调用本类其他构造器,则只能出现在构造方法的第一行上
- 在成员方法中,this.方法调用其他方法不必在第一行上
20. 字节读写和字符读写的区别
字节读写中文可能会造成乱码,而字符读写中文则不会
21. 常见集合有哪些,都有什么特点?
-
List:元素是有序的,可以存放重复元素,可以存放多个null;
-
ArrayList、LinkedList、Vector的区别:
- ArrayList是基于动态数组的数据结构,连续存储,适用于频繁查询和修改数据,线程不安全
- LinkedList是基于链表的数据结构,非连续存储,适用于频繁插入、删除数据,线程安全
- Vector和ArrayList都属于可变数组,在增长数组时,Vector增长为原数组的一倍,而ArrayList只会增长为原来的一半,节约内存空间,是线程安全
Map:是键值对形式的,无序的,value可以重复,key值如果重复则后value覆盖前value;
Set:元素是无序的,不可存放重复数据;
22. == 和equals的区别
- "=="用于比较的是变量或对象在内存中存储的地址,如果地址相同,则返回true,否则返回false。
- "equals"用于比较两个对象是否在逻辑上相等。通常情况下,使用equals方法可以更准确地比较两个对象的内容是否相同。
23. 如何理解MySQL的LIMIT关键字,两个参数对应是什么作用
LIMIT关键字是MySQL独有的,第一个参数是起始的索引值(从0开始计算),第二个参数是一次取几条数据
24. 访问servlet的方式
- 地址栏直接打印——get
- 超链接访问——get
- form提交——默认是get但是可选post
25. 关于异常的处理机制
try 监视可能发生异常的语句块
catch处理异常的代码 多重catch粒度越大越往下放, 只会进到catch的某一个分支
finally块 不管是否有异常,异常是否被处理了,都要执行的代码
throw在方法体中手动抛异常
throws
声明该方法可能出现的异常
将方法中的异常抛给调用者,调用者再考虑解决异常还是向上抛