Java面试宝典-java基础03
21、Java属于什么语言?
Java属于高级语言的一种,高级语言是一种与具体硬件和操作系统无关的编程语言,它更接近于自然语言和数学语言,具有更高的可读性和可维护性。
高级语言的特点包括:
- 高级语言具有更强的可读性和可维护性,因为它的语法结构和自然语言更为接近,可以更容易地被人类理解。
- 高级语言具有更高的抽象能力,可以更容易地表达复杂的算法和逻辑结构,同时也更容易被程序员理解和维护。
- 高级语言的指令系统通常更为复杂,需要编译器将高级语言代码转换为机器码,因此高级语言的代码通常比较大。
- 高级语言可以提供更多的功能和特性,例如变量、函数、循环、条件语句、数组、对象等,使得程序编写更加方便和灵活。
- 高级语言可以更好地支持面向对象编程(OOP)的特性,例如封装、继承、多态等,这使得程序更加模块化和可扩展。
高级语言是一种与具体硬件和操作系统无关的编程语言,它更接近于自然语言和数学语言,具有更高的可读性和可维护性。虽然它的指令系统复杂,但因为它提供了更多的功能和特性,使得程序编写更加方便和灵活。
22、JAVA中有8种基本数据类型,各自占用多少字节呢?
以int和Integer为例,对比一下基本数据类型和封装数据类型。
- int类型,直接定义一个变量名赋值即可,是Integer需要使用new关键字创建对象;
- 基本类型和Integer类型混合使用时,Java会自动通过拆箱和装箱实现类型转换;
- Integer的默认值是null,而int的默认值是0;
- Integer存储在堆内存,int类型是直接存储在栈空间;
- Integer作为一个对象类型,封装了一些方法和属性;
23、数据类型之间的如何转换?
在Java中,允许进行数值转换,有些情况会丢失一部分精度。
强制类型转换的一般表示形式为:
double d = 13.7;
int i = (int)d;
System.out.println(i);//13
强制类型转换通过(int)进行double强转int,通过截取小数部分将浮点值转换为整形,会丢失一部分精度。
实线表示无信息丢失的转换。
虚线表示有精度丢失的转换。
24、Java中的数据类型提升
byte a = 10;
byte b = 20;
int sum = a + b; // byte类型会被提升为int类型,所以结果也是int类型
int i = 100;
double avg = i / 2; // int类型会自动提升为double类型,结果也是double类型
Java中的提升是指自动将低精度类型转换为高精度类型的过程。在Java中,当运算符两侧的操作数类型不同时,系统会进行自动类型转换,将低精度类型提升到高精度类型,以避免数据丢失或计算错误。
Java中的基本数据类型按照精度分为以下几类:byte、short、int、long、float和double。
其中,byte和short是最低精度的类型,double是最高精度的类型。
在进行运算时,如果操作数的类型不一致,则系统会自动将较低精度的类型提升为较高精度的类型,以保证运算结果的正确性。
例如,int a = 11; float b = 1.7f; double c = a + b; 在这个例子中,a会被自动提升为float类型,然后与b相加得到一个float类型的结果,最后再自动提升为double类型并赋值给c。
注意,这里的“提升”通常是隐式的,编译器会自动处理,无需程序员手动干预。
25、Object类有哪些常用方法?
Object类是Javajava.lang包下的核心类,Object类是所有类的父类,何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类。
(1)clone()
实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
(2)getClass()
final方法,返回Class类型的对象,反射来获取对象。
double d = 10.2;
int i = (int)d;
System.out.println(i);//10(3)toString()
toString()方法返回一个字符串。
toString()无处不在,只要对象与一个字符串通过操作符 + 拼接,Java编译器就会自动地调用toString方法来获得这个对象的字符串描述。还有我们最常用的System.out.println(name)方法,println会自动的调用name.toString(),并打印返回的字符串。
(4)finalize()
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
(5)equals()
判断内容是否相等,注意,这里比较的不是内存地址。
java语言规范要求equals方法具有下面的特性:
- 自反性:对于任何非空引用x,x.equals(x)应该返回true;
- 对称性:对于任何引用x,和y,当且仅当,y.equals(x)返回true,x.equals(y)也应该返回true;
- 传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true;
- 一致性:如果x,y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果;
- 对于任意非空引用x,x.equals(null)返回false;
(6)hashCode()
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。
当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。
(7)wait()
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者
被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生: - 其他线程调用了该对象的notify方法;
- 其他线程调用了该对象的notifyAll方法;
- 其他线程调用了interrupt中断该线程;
- 时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
(8)notify()
该方法唤醒在该对象上等待的某个线程。
(9)notifyAll()
该方法唤醒在该对象上等待的所有线程。
26、equals和hashcode的关系
如果equals为true,hashcode一定相等;
如果equals为false,hashcode不一定不相等;
如果hashcode值相等,equals不一定相等;
如果hashcode值不等,equals一定不等;
重写equals方法时,一定要重写hashcode方法
27、String str="i"与 String str=new String(“i”)一样吗?
String str1 = "i"; // 在常量池中
String str2 = new String("i"); // 在堆上
当使用 String str=“i” 时,字符串 “i” 会被存储在字符串常量池中。如果已经存在相同的字符串,则不会创建新的对象,而是返回对该字符串
的引用。
当使用 String str=new String(“i”) 时,会在堆内存中创建一个新的 String 对象,即使字符串常量池中已经存在 “i” 这个字符串。换句话说,
每次使用 new 关键字都会创建一个新的对象,而不管字符串常量池中是否已经存在该字符串。
由于 new String(“i”) 会在堆内存中创建新的对象,这可能会导致内存使用的增加,并且在某些情况下可能会降低性能(例如,当大量创建相
同的字符串对象时)。另一方面,使用字符串常量池中的字符串可以减少内存使用并提高性能。
String str="i"是更推荐的写法,因为它可以减少内存使用并提高性能。
28、String s = “1111”;s = s + “2222”;这两行代码执行后,原始的 String 对象中的内容到底变了没有?
这两行代码执行后,原始的 String 对象中的内容没有变。
在 Java 中,String 是不可变的,这意味着一旦创建了一个 String 对象,就不能改变它的内容。
当你使用 “+” 运算符连接两个字符串时,实际上是创建了一个新的 String 对象,然后将两个字符串的内容复制到新的对象中。
所以,原始的 String 对象(1111")并没有被修改,而是创建了一个新的 String 对(“11112222”),并将变量 s 指向这个新的对象。
29、如何将字符串反转?
使用StringBuilder的reverse()方法。
public static void main(String[] args) {
String originalString = "Hello, World!";
StringBuilder sb = new StringBuilder(originalString);
String reversedString = sb.reverse().toString();
System.out.println(reversedString); // 输出: "!dlroW ,olleH"
}
30、String 类的常用方法都有那些?
(1)常见String类的获取功能
length:获取字符串长度;
charAt(int index):获取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;
substring(int start):从指定位置开始截取字符串,默认到末尾;
substring(int start,int end):从指定位置开始到指定位置结束截取字符串;
(2)常见String类的判断功能
equals(Object obj): 比较字符串的内容是否相同,区分大小写;
contains(String str): 判断字符串中是否包含传递进来的字符串;
startsWith(String str): 判断字符串是否以传递进来的字符串开头;
endsWith(String str): 判断字符串是否以传递进来的字符串结尾;
isEmpty(): 判断字符串的内容是否为空串"";
(3)常见String类的转换功能
byte[] getBytes(): 把字符串转换为字节数组;
char[] toCharArray(): 把字符串转换为字符数组;
String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串;
toLowerCase(): 把字符串转成小写;
toUpperCase(): 把字符串转成大写;
concat(String str): 把字符串拼接;
(4)常见String类的其他常用功能
replace(char old,char new) 将指定字符进行互换
replace(String old,String new) 将指定字符串进行互换
trim() 去除两端空格
int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。