学习Java编程:明确需求、分析思路、确定步骤与代码实现指南
学习Java,需要明确自己的需求,知道自己想做什么;分析你的想法并知道你想做什么。确定每个想法部分的步骤以及使用哪些方法和对象。最后用代码实现,并将思想体现在具体的Java语言中。

1.Java的8种基本数据类型及其大小是什么?
Java决定了每个基本类型所占用的存储空间的大小。与大多数其他语言一样,它们的大小不会随着机器硬件架构的变化而变化。这种存储空间的不变性是 Java 程序比用大多数其他语言编写的程序更可移植的原因之一。
2.Java基本类型和引用类型有什么区别?
基本类型存储原始值,引用类型存储引用值(引用值是指对象在堆中的位置/地址)
3. 什么是自动装箱和拆箱?
自动装箱是Java编译器在基本数据类型和相应的对象包装类型之间完成的转换。
例如:将int转换为Integer、double转换为Double等。否则自动拆箱。
基本类型:boolean、char、byte、short、int、long、float、double
封装类型:布尔型、字符型、字节型、短整型、整数型、长整型、浮点型、双精度型
装箱:将基本类型与其对应的引用类型包装起来;
拆箱:将装箱类型转换为基本数据类型;
4. 字节和字符有什么区别?
字节是存储容量的基本单位。
字符是指数字、字母、汉字以及其他语言中的各种符号。
1字节=8个二进制单元;一个字符由一个或多个字节二进制单元组成。
5. 面向对象和面向过程的区别
简短回答:
1、面向对象具有封装性、继承性、多态性等特点,易于维护、复用和扩展。
2.面向过程的性能高于面向对象。因为调用类时实例化开销较高,所以比较消耗资源。常用于微控制器、嵌入式系统等。
3、最典型的例子是。雕版印刷是面向过程的,而活字印刷是面向对象的。
详细介绍
面向过程:面向过程比面向对象具有更高的性能。由于类调用需要实例化,成本比较高,而且消耗资源,所以当性能是最重要的考虑因素时,比如单片机、嵌入式开发、Linux/Unix等,一般采用面向过程的开发。然而,面向过程并不像面向对象那样易于维护、重用和扩展。
面向对象:面向对象易于维护、易于重用、易于扩展。由于面向对象具有封装性、继承性、多态性等特点,可以设计出低耦合的系统,使系统更加灵活,更易于维护。然而,面向对象的性能低于过程式。
例子:
面向对象就像活字印刷,面向过程就像木版印刷。当以流程为导向时,你需要从头到尾考虑每一个细节。打个比方,要刻画学,时时学,可以说,如果是木版印刷,就必须把一个又一个环节连接起来,“学”完后,必须刻“呃”,而“呃”后必须刻“时”。一旦你想改成“时时学习学习”,我会很高兴。那么原来的雕刻就必须报废并重新更改。
面向对象将每个单词视为一个对象,类似于活字印刷。如果要加字,只需再刻一个“我”即可,其他写好的字不用改。在这里我扩展以下概念:
1.如果要更改,只需更改要更改的单词即可。这是可维护的;
2.这些话用完也不是没有用的。它们可以在后续印刷中重复使用。这是可重复使用的;
3、如果要给这首诗加词,只需刻下,加上即可。这是可扩展的;
6.JDK和JRE有什么区别?
JDK:Java Development Kit的缩写,Java开发工具包,提供Java开发环境和运行环境。
JRE:Java Runtime Environment的缩写,Java运行时环境,提供Java运行所需的环境。具体来说,JDK实际上包括JRE、Javac、编译Java源代码的编译器以及许多用于调试和分析Java程序的工具。
简单来说:如果需要运行Java程序,只需要安装JRE即可。如果需要编写Java程序,则需要安装JDK。
JDK(Java Development Kit),Java语言的软件开发工具包。
两个主要组成部分:
javac-compiler,将源程序转换为字节码
java-运行编译好的java程序(.class后缀)
JRE(Java 运行时环境)
包括Java虚拟机(JVM)、Java核心类库和支持文件
如果您只需要运行Java程序,请下载并安装JRE
如果要开发Java软件,需要下载JDK
JRE 附带 JDK
7. 重载和重写有什么区别?
方法重载和重写都是实现多态的方法。区别在于前者实现了编译时多态,而后者实现了运行时多态。
重载发生在类中。如果同名方法的参数列表不同(类型、数量和顺序不同),则视为重载。重载对返回类型没有特殊要求。
重写发生在子类和父类之间。重写要求子类的重写方法与父类的重写方法具有相同的返回类型。它比父类的重写方法具有更好的访问范围,并且无法比 父类的重写方法声明更多的异常(里氏替换原则)。
方法重载规则:
方法重写规则:
8. String、StringBuffer和StringBuilder有什么区别?
简单回答
1.String是不可变的,而StringBuffer和StringBuilder都是可变的。
2、String是不可变的,可以看做常量,因此是线程安全的; StringBuffer使用的是同步锁,因此是线程安全的; StringBuilder 没有锁定,因此它不是线程安全的。
3、使用String操作少量数据;使用StringBuilder在单线程字符串缓冲区中操作大量数据;使用StringBuffer来操作多线程字符串缓冲区中的大量数据。
1. 可变性
简单来说:String类使用final关键字修饰字符数组来保存字符串,privatefinalcharvalue[],因此String对象是不可变的。 StringBuilder 和 StringBuffer 都继承自 AbstractStringBuilder 类。在AbstractStringBuilder中,也使用字符数组来保存字符串char[]value,但没有用final关键字修饰,因此两个对象都是变量。
StringBuilder和StringBuffer的构造方法都是通过调用父类AbstractStringBuilder的构造方法来实现的。大家可以自行查看源码。
AbstractStringBuilder.java
2. 线程安全
String中的对象是不可变的,可以理解为常量,线程安全。 AbstractStringBuilder是StringBuilder和StringBuffer的共同父类。它定义了字符串的一些基本操作,例如expandCapacity、append、insert、indexOf等公共方法。 StringBuffer给方法加了同步锁或者给调用方法加了同步锁,所以是线程安全的。 StringBuilder不会给方法添加同步锁,因此它不是线程安全的。
3.性能
每次改变String类型时,都会生成一个新的String对象,并且指针指向新的String对象。 StringBuffer 每次都对 StringBuffer 对象本身进行操作,而不是生成新对象并更改对象引用。同等情况下,使用StringBuilder相比使用StringBuffer只能实现10%到15%左右的性能提升,但会面临多线程不安全的风险。
三者的使用总结:
9.反射Class.forName和classLoader有什么区别
第一:Class.forName("className");
其实这个方法传递的就是:Class.forName(className,true,
ClassLoader.getCallerClassLoader()) 方法
第二:ClassLoader.laodClass("className");
其实这个方法调度的是:ClassLoader.loadClass(name,false)方法
第三:差异
可见Class.forName不仅将类的.class文件加载到jvm中,而且还解释了类并执行类中的静态块。
类加载器只做一件事,就是将.class 文件加载到jvm 中。 static中的内容不会被执行。 static块只会在newInstance中执行。
10.反射使用场景
代理模式、JDBC链接数据库、Spring
11.反射有什么缺点?如何优化?
缺点:Java反射需要解析内存中的字节码和对象,包括一些动态类型,因此JVM无法优化这些代码。因此,反射操作的效率比那些非反射操作低很多!
有哪些方法可以提高反射性能?
setAccessible(true)可以防止安全检查(这个比较耗时)和缓存,将需要经常访问的元数据信息放到内存中。 class.forName 太耗时了。 GetMethods() 等方法应尽可能少用。尝试调用getMethod。 (name) 指定减少遍历次数的方法名称
12、静态代理模式和动态代理模式的区别
静态:代理类由程序员创建。需要代理的对象是在程序运行之前指定的。
动态:在程序运行时利用反射机制动态创建。 (IncallingHandler的应用)
13.为什么String是不可变的?
String类使用final关键字修饰字符数组来保存字符串,privatefinalcharvalue[],因此String对象是不可变的。 StringBuilder 和 StringBuffer 都继承自 AbstractStringBuilder 类。在AbstractStringBuilder中,也使用字符数组来保存字符串char[]value,但没有用final关键字修饰,因此两个对象都是变量。
14.抽象类和接口有什么区别?
实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。
构造函数:抽象类可以有构造函数;接口不能。
实现数量:一个类可以实现多个接口;但只能继承一个抽象类【Java只支持单继承】。
访问修饰符:接口中的方法默认被public修饰;抽象类中的抽象方法可以用 Public 和 Protected 修饰。如果抽象方法修饰符为Private,会报错:Test类型中的抽象方法方法名只能设置可见性修饰符,public或protected之一。
除了static和final变量之外,接口中不能有其他变量,但抽象类中则不一定。
设计层面:抽象是类的抽象和模板设计,接口是行为的抽象和行为的规范。
抽象类可以为某些方法提供默认实现,从而避免重复实现它们,提高代码的可重用性。这就是抽象类的优点。
15.常见的异常类型有哪些?
NullPointerException 空指针异常
ClassNotFoundException 指定的类不存在
NumberFormatException 字符串转数字异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 数据类型转换异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法没有异常
IOException IO异常
SocketException 套接字异常
16.什么是Java序列化?什么时候需要序列化?
Java序列化就是将各种对象的状态保存在内存中,并将保存的对象状态读出。
以下情况需要Java序列化:
当你想将内存中的对象状态保存到文件或数据库时;
当你想使用套接字通过网络传输对象时;
当你想通过RMI(远程方法调用)传输对象时。
17.普通类和抽象类有什么区别?
普通类不能包含抽象方法,而抽象类可以包含抽象方法。
抽象类不能被实例化,即不能使用new调用构造函数方法来创建对象。普通类可以直接实例化。
如果一个类继承自抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则子类也必须定义为抽象类。
18、抽象类可以用final修饰吗?
不,定义一个抽象类允许其他类继承它。如果定义为final,则类不能被继承,会互相冲突,所以final不能修改抽象类。
19.String类有哪些常用方法?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
Replace():字符串替换。
Trim():删除字符串两端的空格。
split():分割字符串,返回分割后的字符串数组。
getBytes():返回字符串的字节类型数组。
length():返回字符串长度。
toLowerCase():将字符串转换为小写字母。
toUpperCase():将字符串转换为大写字符。
substring():截取字符串。
equals():字符串比较。
20.抽象类必须有抽象方法吗?
不,抽象类不一定必须有抽象方法;但包含抽象方法的类一定是抽象类。
21. String str="i" 和 String str=new String("i") 一样吗?
不同是因为内存分配方式不同。 String str="i",Java虚拟机会将其分配到常量池中。如果常量池中有“i”,则返回“i”的地址。如果没有,则创建“i”,然后返回“i”。地址;而 String str=new String("i") 将被分配到堆内存中的新空间。
22.String是基本数据类型吗?
String不属于基本类型。基本类型有8种:byte、boolean、char、short、int、float、long、double,其中String属于对象。
23、Java中final的作用是什么?
被final修饰的类称为final类,这个类不能被继承。
最终修改的方法不能被覆盖。
由final修饰的变量称为常量。常量必须初始化。初始化后,该值无法修改。
24.什么是数学。 round(-1.5) 等于 Java 中的吗?
等于-1。 round() 是四舍五入,请注意负数 5 是四舍五入,例如:Math.round(1.5) 值为 2,Math.round(-1.5) 值为 -1。
25. == 和 equals 有什么区别?
==解读:
==的效果对于基本类型和引用类型是不同的,如下:
基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;代码示例:
代码解读:因为x和y指向同一个引用,所以==也为true,并且重写了new String()方法来开辟内存空间,所以==的结果为false,而equals总是比较值,所以结果都是真的。
等于解释:
equals本质上就是==,只不过String和Integer重写了equals方法,将其变成了值比较。看看下面的代码就明白了。
首先,让我们看看默认情况下使用 equals 来比较具有相同值的对象。代码如下:
输出结果出乎我们的意料,是假的?到底是怎么回事?看完equals源码你就知道了。源码如下:
事实证明,equals本质上就是==。那么问题来了,为什么两个值相同的String对象会返回true呢?代码如下:
同样,当我们进入String的equals方法时,我们就找到了答案。代码如下:
原来String重写了Object的equals方法,将引用比较改为值比较。
总结:对于基本类型来说,==是值比较,对于引用类型来说,是引用比较;而equals默认是引用比较,但是很多类都重新发明了equals方法,比如String、Integer等将其变成了Value比较,所以一般情况下equals比较的是值是否相等。
26.hashCode和等于
hashCode()的作用是获取哈希码,也称为散列码;它实际上返回一个 int 整数。这个哈希码的目的是确定对象在哈希表中的索引位置。 hashCode()定义在JDK的Object.java中,这意味着Java中的任何类都包含hashCode()函数。
哈希表存储键值对,其特点是可以根据“键”快速检索出对应的“值”。这使用了哈希码! (可以快速找到您需要的对象)
当你向HashSet添加一个对象时,HashSet会首先计算该对象的hashcode值,以确定该对象添加到的位置。它还会将其与已添加的其他对象的哈希码值进行比较。如果没有匹配的哈希码,HashSet 将假定该对象不重复。出现。但是如果找到具有相同 hashcode 值的对象,则会调用 equals() 方法来检查具有相等 hashcode 值的对象是否真的相同。如果两者相同,HashSet不会让join操作成功。如果不同,它将被重新散列到另一个位置。 (摘自我的Java启蒙书籍《Head First java》第二版)。这样我们就大大减少了equals的数量,从而大大提高了执行速度。
1. 如果两个对象相等,则hashcode也必须相同。
2. 如果两个对象相等,则对两个对象调用 equals 方法将返回 true。
3. 两个对象的hashcode值相同,并且它们不一定相等。
4. 因此,如果equals方法被重写了,那么hashCode方法也必须被重写。
5. hashCode()的默认行为是为堆上的对象生成唯一值。如果不重写hashCode(),该类的两个对象无论如何都不会相等(即使两个对象指向相同的数据)
概括:
首先打好Java基础非常重要。工欲善其事,必先利其器。做任何事情,首先要准备好这个基础,然后才可以进行各种尝试。在实验过程中,你可以逐渐建立起信心。
今天的分享到此结束,还请大家多多包涵和指导!