基本总结


闲来无事把平常学习时遇到的不会的,难理解的,值得深入学习的,一些题目写了下来,好记性不如烂笔头(简单的就不写了,但是还得看看,死记硬背不是王道,重要的是理解)

1.如何不使用第三方变量,调换两个位置的值?(有两种写法,好好推敲一下)

int a = 0;    int b = 1;

第一种方法(运算符操作)
注意:使用这种方法,如果两个数很大,可能会超出类型范围,造成数据丢失精度。所以不常用

a = a + b;  //a = 1
b = a - b;  //b = 0
a = a - b;  //b = 1

第二种方法(利用位运算^)
注意: 异或运算不会产生进位,所以不会造成数据损失,并且异或运算是二进制之间的运算,效率也比较高,但是这种交换方式阅读性差(确实没看懂)
a = a ^ b;
b = a ^ b;  //b = a^b^b = a
a = a ^ b;  //a = a^b^a = b

是不是第二种看起来更简单也更好背(但是清楚原理吗?) 

2.Java实现字符串倒序输出的几种方法?(写简单的,好理解的,这几张方法亲测有效,理解最重要)

①使用StringBuilder或者StringBuffer类的内置reverse方法

public static String  reverse1 (String str1){
return new StringBuffer(str1).reverse().toString();
}

②利用数组,倒序输出

public static String reverse3(String s) {
    char[] array = s.toCharArray();
    String reverse = "";
    for (int i = array.length - 1; i >= 0; i--){
        reverse += array[i];
    }
  return reverse;
 }

③拼接字符串

public static String reverse2(String s) {
   int length = s.length();
   String reverse = "";
   for (int i = 0; i < length; i++){
        reverse = s.charAt(i) + reverse;
   }
     return reverse;
 }
④使用递归操作
 public static String reverse3(String originStr) {
    if(originStr == null || originStr.length() <= 1){
        return originStr;
    }
    return reverse(originStr.substring(1)) + originStr.charAt(0);
   }


3.单例模式的几种写法以及理解
https://www.cnblogs.com/Ycheng/p/7169381.html

4.super和this关键字(被问到过,记下来,贴网址,好好看就明白了)
在子类构造器中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过;
super:  https://blog.csdn.net/qq_36747738/article/details/71122150
属性:super属性直接在子类之中查找父类中的指定属性,不再查找子类本身属性;
方法:super方法直接在子类之中查找父类中的指定方法,不再查找子类本身方法;
构造:必须放在构造方法首行,不能与this关键字同时出现。
this:http://www.jb51.net/article/121103.htm
属性:this属性表示找到本类的属性,如果本类没有找到则继续查找父类;
方法:this方法表示找到本类的方法,如果本类没有找到则继续查找父类;
构造:必须放在构造方法的首行,不能与super关键字同时出现;
特殊:表示当前对象;

下面是你需要你好好理解的地方(可能有些多,有些乱,耐着心看看)

①调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
②super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
③super()和this()均需放在构造方法内第一行。
④尽管可以用this调用一个构造器,但却不能调用两个。
⑤this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
⑥this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。


5.抽象类和接口(老问题了,不止要知道区别,还要知道特性哦)
抽象类:
了解抽象类之前,先来了解一下抽象方法
①抽象方法是一种特殊的方法:它只有声明,而没有具体的实现;
②抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,但是抽象类中不止包含抽象方法哦!可以包含成员变量和普通的成员方法
注意:抽象类中含有无具体实现的方法,所以不能用抽象类创建对象(不能被实例化,实例化的工作由其子类来完成)
③抽象类是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情
④抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法)
 abstract不能与final并列修饰同一个类。(abstract需要子类去实现,而final表示不能被继承)
⑤如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
接口:
①接口中可以含有变量和方法,接口中的变量会被隐式地指定为public static final变量,而方法会被隐式地指定为public abstract方法(只能是public abstract方法,用其他关键字,比如private、protected、static、 final等修饰会报编译错误)
②接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法
③接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量
④一个非抽象类实现了某个接口就必须实现它所有的方法哦(抽象类可以不实现),一个类可以实现多个接口

下面说说区别(对比着我上面写的很容易看出来的)

①接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
②一个类只能继承一个抽象类,但能实现多个接口
③接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
④接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法

6.==和equals()方法的区别?(也是老问题了,但没有表面那么简单哦)
https://www.cnblogs.com/www123----/p/7857298.html

7.final关键字
①final修饰类:
当一个类被final所修饰时,表示该类是一个终态类,即不能被继承
②final修饰方法:
将方法锁定,防止任何继承类修改final方法的含义,确保该方法行为保持不变,且不会被覆盖
类中所有的private方法都隐式地指定为final的
③final修饰属性:
final变量就是常量,而且通常常量名要大写
对于基本类型,final修饰的数值是恒定不变;而final修饰对象引用,则引用恒定不变

8.try catch finally(看的头痛,里面全是套路)
https://blog.csdn.net/aaoxue/article/details/8535754

9.String对象的两种实例化方式的区别?
String str = new String("abc");//构造方法   先判断在字符串常量池中是否包含该字符串,若包含该字符串,则在堆中直接创建这个字符串对象并返回该对象引用;若不包含,则先在堆上创建,然后在字符串常量池中也创建,最后把返回堆上对象引用
String str1 = "abc";  //直接赋值     在常量池中创建该字符串;

10.Java的四种引用(用到的场景)以及Java创建对象的五种方式?(问到的几率应该不会太大,不过还得背一背)
四种引用:强引用、软引用、弱引用、虚引用
使用场景(也就是你对它们的理解):
①强引用:强引用是使用最普遍的引用,如果一个对象具有强引用,那垃圾回收器绝不会回收它,当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题
②软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存
③弱引用:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象
④虚引用:顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收

Java创建对象的五种方式:
①使用new关键字(调用无参构造函数)
②使用class类的newInstance方法(调用无参构造函数)
③使用构造函数类的 newInstance方法(调用参数化构造函数和私有构造函数)
④使用clone方法(创建了一个新的对象并且复制了之前对象的内容到这个新的对象中)
⑤使用反序列化(不会使用任何构造函数来创建对象)

11.重载与重写的含义以及区别?
https://blog.csdn.net/linzhaojie525/article/details/55213010

12.JDK里包含的组件?(不看不知道,一看吓一跳!)
javac – 编译器,将源程序转成字节码
jar – 打包工具,将相关的类文件打包成一个文件
javadoc – 文档生成器,从源码注释中提取文档
db – debugger,查错工具
java – 运行编译后的java程序(.class后缀的)
appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
Jconsole: Java进行系统调试和监控的工具

13.String和StringBuffer、StringBuilder
①StringBuffer、StringBuilder都继承自AbstractStringBuilder类,而AbstractStringBuilder和String都继承自Object这个类(Object类是所有类的超类)
②String类没有append()、delete()、insert()这三个成员方法,而StringBuffer和StringBuilder都有这些方法
 这能看出String类是字符串常量而StringBuffer、StringBuilder都是字符串变量
 StringBuffer和StringBuilder中的append、delete、insert这几个成员方法都是通过System类的arraycopy方法来实现的,即将原数组复制到目标数组
③String类是不可变的,即字符串常量,所以每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。而使用StringBuffer和StringBuilder类就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用
④StringBuffer类中的大部分成员方法都被synchronized关键字修饰,而StringBuilder类没有出现synchronized关键字

14.自动装箱与拆箱(被问到过,答的不是很好,写下来)
http://www.importnew.com/15712.html

15.如何实现对象克隆?
https://blog.csdn.net/w410589502/article/details/54985987

16.数组排序以及九九乘法表?
①使用Arrays.sort()方法(升序排序)
②冒泡排序:
for (int i = 0; i < arr.length - 1; i++) {
      for (int j = 0; j < arr.length -i - 1; j++) {
        if (a[j] > a[j + 1]) {
          int temp = a[j];
          a[j] = a[j + 1];
          a[j + 1] = temp;
        }
    }
}
九九乘法表:
for(int i=1;i<=9;i++){
    for(int j=1;j<=i;j++){
        System.out.print(j + " * " + i + " = " + i*j + ";   ");
    }
        System.out.println();
}

17.集合框架(牵扯到很多的知识)

https://www.jianshu.com/p/8b0a09f70b9c


学无止境啊...........................

多线程,并发及线程基础
数据类型转换的基本原则
垃圾回收(GC)
Java 集合框架
数组
字符串
GOF 设计模式
SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则
抽象类与接口
Java 基础,如 equals 和 hashcode
泛型与枚举
Java IO 与 NIO
常用网络协议
Java 中的数据结构和算法
正则表达式
JVM 底层
Java 最佳实践
JDBC
Date, Time 与 Calendar
Java 处理 XML
JUnit
编程





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值