java中的数据类型(本人博客):
1.java中的变量必须由下划线("_")、$符号、字母(大小写均可)开头;
2.变量唯一性:大小写是不一样的,比如A和a是两个不一样的变量。即使是不同类型的变量,也不能使用一样的变量名。
java的字符类型采用的是Unicode编码方案,每个Unicode码占用16个比特位。
数组:
数组是最简单的复合数据类型,是一系列数据的集合;
声明数组时,不一定要分配内存;
数组的元素可以是值(基本数据类型)、对象或其他数组;
一个数组中的所有值都必须是相同的类型。
继承和实现的区别
继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们相同的部分都放到父类中,让他们都继承这个类。
实现:如果多个类处理的目标都是一样的,但是处理的方法不同,那么就可以定义一个接口,让他们实现这个接口,各自通过自己的处理方法来处理那个目标。
也可以理解为继承是通过部分相同的功能,产生不同的结果。而实现则是通过不同的方法来实现同一个结果。
继承和实现的区别:
1、数量不同:java只支持接口的多继承,不支持“继承”的多继承,继承在java中具有单根性,子类只能继承一个父类。总结就是:单继承,多实现。
2、修饰不同:继承:extends;实现:iimplements
3、属性不同:在接口中只能定义全局变量和无实现的方法。而在继承中可以定义属性方法,变量,常量等。
4、调用不同:当接口被类实现时,在类中一定要实现接口中的抽象方法;而继承想调用哪个方法就调用哪个方法。
java中的关键字:
java中的关键字:
48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。
2)2个保留字(现在没用以后可能用到作为关键字):goto、const。
3)3个特殊直接量:true、false、null。
10. java中的构造方法(constructor构造器):
构造方法是在类中,方法名与类名必须相同,没有返回值(注意是压根没有返回值,不是返回值是void),一般使用public修饰,也可以不加修饰符,构造方法可以省略。
当子类继承父类时,子类中定义的构造方法在使用的过程中会自动调用父类的构造方法,因此,父类中最好要写一下构造方法,因为可能会存在super()构造方法找不到的情况,构造方法必须和类名相同,这也是java中类的加载机制。且super()和this()一定要放在构造方法内的第一行,说句题外话,类中的普通方法也是可以和类名同名的,这时可以用有无返回类型区分普通方法和构造方法,构造方法表示初始化,无参的构造方法在新建实例对象的时候就会执行,一个类中可以定义多个构造方法,也可以带多个参数。构造方法不能被继承,因此不能被重写,但可以被重载。构造方法用于创建类的实例对象,构造方法名应与类名相同,没有返回类型。java语言规定构造方法只能通过new自动调用。
java中的原子性:
原子操作是在多线程环境下的一个概念,它是针对访问共享变量的操作而言的,指该操作是不可再分的。不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。
原子操作的"不可分割"包括以下两层含义:
1.访问(读、写)某个共享变量的操作从执行线程以外的任何线程来看,该操作要么已经执行结束要么尚未发生,其他线程不会"看到"该操作执行了部分的中间效果。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。比如 a = 1;
2.访问同一组共享变量的原子操作是不能够被交错的。
普通类(class)、抽象类(abstract class)、接口(interface)
见博客:
java编译:
java编译后生成 class文件,那.class文件包含的信息包括三个部分:
包含的信息 | 具体信息 | 备注 |
类信息 | 包括类的名字、修饰符(public或private)、父类、接口以及注解(annotation)。 | 每一个编译后的class文件只包括一个类的信息,如果在java源文件中定义了多个类,在编译后会分成多个独立的class文件。 |
类变量信息 | 包括每个变量的名字、修饰符、类型和注解(annotation) | |
类方法信息 | 包括每个方法的名字、修饰符、参数的类型和返回值的类型、方法的注解(annotation),还包括编译后的、字节码形式的方法代码。 | |
每个编译后的class文件: 1.不包括包名(package)和引用(import),所有的非原始类型引用都以全包名形式出现,这称作内部名称或本质名称; 2.包括一个常量池,这个常量池是一个数组,包括数字、字符和类型的常量; 3.不包括代码注释。 |
这些信息通过java提供的Class类能够获取,并通过反射类使用。也是动态编译和java逆向工程的基础。
java中的call by参数传递指令的作用:
在Java中有两种参数传递方式:
1、按值传递(传递数值,call by value):不会改变传递的实际数值的大小。
2、按引用传递(传递对象的引用,即数据的地址,call by reference):不会改变传递的实际参数的参考地址,但可以改变传递的数据参数内容。
java 中 IO 流分类
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。
BIO、NIO、AIO 的区别
Files的常用方法都有哪些?
Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。
hashMap:参考本人文章
关于java中的List与Map_m0_51660523的博客-CSDN博客MapMap集合概述和特点概述:将键映射到值的对象一个映射不能包含重复的键每个键最多只能映射到一个值Map接口和Collection接口的不同Map是双列的,Collection是单列的Map的键唯一,Collection的子体系Set是唯一的Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效Map集合的功能概述a:添加功能V put(K key,V value):添加元素。这个其实还有另一个功能?替换如果键是第一次存储,就直接存储元素,https://blog.csdn.net/m0_51660523/article/details/120596475 重载(Overload)和重写(Override)的区别
重写(Override) | 重载(Overload) | |
实现多态的方式 | 运行时的多态性 | 编译时的多态性 |
发生位置 | 发生在子类与父类之间 | 发生在一个类中 |
修饰符 | 大于等于父类(里氏代换原则),比父类被重写方法更好访问 | 可以修改(怎么修改?) |
返回值 | 必须有相同的返回值类型,返回值小于等于父类 | 没有特殊的要求,与方法返回值和访问修饰符无关,因此重载的方法不能根据返回类型进行区分 |
参数列表 | 相同 | 不同(参数类型不同、个数不同、顺序不同) |
方法名 | 必须相同 | 必须相同 |
抛出的异常 | 不能比父类被重写方法声明更多的异常(里氏代换原则),小于等于父类 | |
备注 | 访问修饰符;如果父类方法访问修饰符为private则子类中就不是重写。 |
因为private的方法无法被重写,所以在子类中无法定义方法名和参数列表都相同的父类private方法。(×)
原因:是可以定义的,可以写属于自己的方法
22、char 型变量中能不能存贮一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
final,finalize()和finally{}的区别
这三者其实压根就不是一回事,只是长得像,仅此而已。
final:修饰符
用于修饰(声明)变量,方法和类。
修饰变量(属性):表示属性不可变,该变量为常量,常量必须初始化,且值在初始化后不能被再次赋值。引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不变的。
修饰方法:该方法不可覆盖或重写,但是该方法是可以重载的;
修饰类:该类为最终类,不可被继承。
注意:final不可以修饰抽象类和接口以及其中的方法,因为抽象类本身就是要被继承的,里面的方法也是可能会进行重写的,所以不可以用final修饰。接口本身就是需要被实现的,所以同理不能用final修饰。
finally{}:关键字
与 try和catch一起用于异常的处理,异常处理语句结构的一部分,finally{}一定会被执行,在此处我们通常用于资源关闭操作。
finalize():方法
是在对象被回收之前调用的方法,给对象自己最后一个复活的机会.但是该方法由Finalizer线程调用,但调用时机无法保证。finalize是Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法,提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。finalize方法(JDK已经弃用)
简述++i和i++的区别
int i=0;
System.out.print("++i先自加1再赋值得到结果是=");
System.out.println(++i);
//控制台打印:++i先自加1再赋值得到结果是=1
int i=0;
System.out.print("i++先赋值,然后再自加1得到结果=");
System.out.println(i++);
//控制台打印:i++先赋值,然后再自加1得到结果=0
深拷贝和浅拷贝的区别
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的对象都复制了一遍。
如下图,对对象C进行拷贝(个人理解,如有错误请指正):
equals方法:
equals 重写要彻底
只要有属性、方法,就用equals重写,equals是用来比较2个对象的,判断两个对象是否相同,相同就返回ture,不相同就返回false。
hashcode()方法
返回的是哈希码
哈希吗(hashcode)
clone 深克隆和浅克隆
匿名内部类:
匿名内部类:在类的内部重新定义了一个新的类,被称为内部类。
内部类的分类:静态内部类:类似于静态变量(前面有static)
实例内部类:类似于实例变量(没有static)
局部内部类:类似于局部变量(局部变量)匿名内部类是局部内部类的一种,因为没有名字。
doSome()方法中的局部内部类Inner,在doOther()中不能用
匿名内部类:接口下面的实现类不用写了,new一个接口就可以了,加一个大括号(对接口的实现)
不建议使用匿名内部类,因为一个类没有名字,无法重复使用。代码太乱,可读性太差。
IDEA快捷键 ALT+回车 纠错
以下代码输出什么:
public class Test03 {
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}
如果不明就里很容易认为两个输出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,所以下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的内部类,其代码如下所示:
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
简单的说,如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。
Math.round(11.5) 等于12,Math.round(-11.5)等于-11。四舍五入的原理是在参数上加0.5然后进行下取整。
用最有效率的方法计算2乘以8?
适应位运算, 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
class StringEqualTest {
public static void main(String[] args) {
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program" + "ming";
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s1.intern());
}
}
补充:String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
数据类型的转换:
- 如何将字符串转换为基本数据类型?反之呢?
- 调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;
- 一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串
Collection和Collections的区别
答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
SQL调优:
serializable接口的作用和原理:
一般情况下,我们在定义实体类时会继承Serializable接口。并且会定义serialversionUID(如果我们没有自己声明一个serialVersionUID变量,接口会默认生成一个serialVersionUID)
package com.gosuncn.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialversionUID = 1L;
private Integer id;
private String name;
private Integer age;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
'}';
}
}
Serializable接口是一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
作用:Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。接口里面什么内容都没有,我们可以将它理解成一个标识接口。通知jvm,我不对这个类做序列化了,jvm会自动对其序列化(序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。)把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化
serialversionUID作用
serialVersionUID是用来辅助对象的序列化与反序列化的,原则上序列化后的数据当中的serialVersionUID与当前类当中的serialVersionUID一致,那么该对象才能被反序列化成功。这个serialVersionUID的详细的工作机制是:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者是类型发生了变化,那么在反序列化时就会发生crash,并且报出错误
下面代码输出的结果是
public class Test01 {
public static void print(){
System.out.println("ABCD");
}
public static void main(String[] args){
try{
((Test01)null).print();
}catch (NullPointerException e){
System.out.println("NullPointerException");
}
}
}
ABCD
无法正常编译
都不输出
NullPointerException
11.类a继承类b并重写b类的protected方法func时,a中func方法的访问修饰符可以是
12.关于以下程序,说法正确的是(会输出,equals)
public class Equals {
public static void main(String[] args) {
String s1 = "abc" +"def";
String s2 = new String(s1);
if (s1==s2)
System.out.println("hello==");
if (s1.equals(s2))
System.out.println("hello.equals");
}
}
13.列算法的时间复杂度是O(n)
public int fun(int n){
if(n<2){
return1;
}return n*fun(n-2);
}
14.下面代码输出的结果是
public class Judge {
public static void main(String[] args) {
Boolean result = false? false : true==false?true:false;
System.out.println(""+result+"");
}
}
15.下面java concurent包下的4个类中差别最大的一个是
ReentrantLock、Future、Semphore、CountDownLatch
17.java中关于finally块中的代码描述正确的是
如果try块后没有catch块时,finally块中的代码才会执行
异常发生时才会执行
finally也可以在return后执行
异常没有发生时可以执行
19.java类中,下面对method1方法的覆写写法中,语法正确且使用形如method(1,2)调用子类的method1方法时,能返回1的是哪些?
关于java中的JDBC:
JDBC事务可以保证操作的完整性和一致性;
JDBC事务由Connection发起和控制;
JDBC事务由容器控制事务;
JDBC事务属于java事务的一种;
java派生类中的覆盖方法所抛出的异常必须和基类中被覆盖的方法所抛出的异常一致。
存取周期是指存储器进行连续启动两次独立的存储器操作(例如连续两次读操作)所需间隔的最小时间。
图的BFS生成的树高 <= DFS生成树的树高是?
在总线上,同一时刻只能有一个主设备和一个从设备控制总线传输操作。
关于java中的消息队列:
消息队列可以用于削峰填谷,主要解决瞬时写压力大于应用服务能力导致信息丢失、系统崩溃等问题?
RocketMQ不支持顺序消息?
Kafka、RabbitMQ、RocketMQ均支持原生支持延迟消息?
Kafka可以试下消息全局有序消费?
@SuppressWarnings("deprecation")的功能:当在可序列化的类上缺少serialVersionUID定义的警告。
在构建派生类对象,构造函数的执行顺序:基类构造函数,派生类对象成员构造函数,派生类本身的构造函数。
transient关键字
关于java的transient关键字修饰的成员变量,该对象序列化之后,transient修饰的值丢失,即在序列化结果中不会出现transient修饰的值。该关键字主要作用就是让某些被transient关键字修饰的成员属性变量不被序列化。
java中的预留字:
const、goto关键字是java中的预留字,现阶段在java中不能被使用,可能在java的某个版本中被提上正位,因此这些保留字不能作为java变量命名使用: