侧边栏壁纸
  • 累计撰写 47 篇文章
  • 累计创建 23 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Java基础知识纪要

elthon
2021-08-31 / 0 评论 / 0 点赞 / 285 阅读 / 5682 字

面向对象相关的概念

1、面向对象的基本特性:封装、继承、多态
封装把对象的属性或者方法包装到类中
不同的类之间可以通过继承实现方法或者属性的复用
多态,不同的类的相同方法有不同的对外表现

网上查到的:
继承: 让某个类型的对象获得另一个类型的对象的属性的方法。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
封装: 隐藏部分对象的属性和实现细节,对数据的访问只能通过外公开的接口。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
多态: 对于同一个行为,不同的子类对象具有不同的表现形式。多态存在的3个条件:1)继承;2)重写;3)父类引用指向子类对象。

Java API相关

1、HashMap相关的知识
ConcurrentHashMap、LinkedHashMap、HashMap、HashTable、TreeMap
HashTable、ConcurrentHashMap:线程安全的
LinkedHashMap、HashMap、TreeMap:线程不安全的
TreeMap:可以自定义排序的,默认排序:按照key的字典顺序来排序(升序)
LinkedHashMap: 链表Map,有序的HashMap,默认的HashMap,遍历或者插入元素,是无序的,不知道会放在什么位置。使用LinkedHashMap,会在内部委会一个LinkedList双向链表,来记录元素的位置。默认采用插入顺序来维持取出键值对的次序(accessorOrder= false),两种方式:1)插入顺序 2)访问顺序(场景:淘汰不常访问的数据,常访问的数据会插入到链表的尾部, 这样链表头部就是不常用的数据)

2、多线程
一个系统进程能创建多少个线程?
这个跟操作系统、操作系统位数有关系
线程的创建有几个点:1、虚拟内存大小 2、系统参数有关系
对于32位系统来说, 用户空间的虚拟内存地址最大3G, 对于64位操作系统来说,用户空间的虚拟内存地址最大128T
默认,一个线程占用的栈空间为8M(ulimit -s),算上其他的一些空间占用,一个线程要消耗大概10M左右的虚拟内存空间。
另外,系统参数设置了最大的线程数,最大的pid数(线程和进程都有这个数)。
所以,这个问题的答案需要根据具体情况来回答,不同的操作系统和系统参数,能创建的线程数量不一样。

wait方法和sleep方法

  • 都是暂停当前线程的执行
  • wait方法只能在同步块或方法中使用,sleep可以在任何方法中使用
  • wait会释放同步锁,sleep不会释放同步锁
  • sleep到点就恢复继续执行(不考虑线程优先级),wait需要让其他线程调用同一对象的notify/notifyall方法才会恢复

线程的 join() 方法是干啥用的?
用于等待当前线程终止。如果一个线程A执行了 threadB.join() 语句,其含义是:当前线程A等待 threadB 线程终止之后才从 threadB.join() 返回继续往下执行自己的代码。

编写多线程程序有几种实现方式?
java.lang.Thread注释中提到有两种方法创建线程:
1、直接创建Thread的子类,重写run方法
2、实现Runnable接口的run方法,然后把这个类实例传入到Thread对象中

       class PrimeThread extends Thread {
           long minPrime;
           PrimeThread(long minPrime) {
               this.minPrime = minPrime;
           }
  
           public void run() {
               // compute primes larger than minPrime
                . . .
           }
       }
       
       PrimeThread p = new PrimeThread(143);
       p.start();
   
       class PrimeRun implements Runnable {
           long minPrime;
           PrimeRun(long minPrime) {
               this.minPrime = minPrime;
           }
  
           public void run() {
               // compute primes larger than minPrime
                . . .
           }
       }
       PrimeRun p = new PrimeRun(143);
       new Thread(p).start();

Callable需要和ExecutorService配合使用,使用Feture来拿到Callbel的返回值。

网上资料
通常来说,可以认为有三种方式:1)继承 Thread 类;2)实现 Runnable 接口;3)实现 Callable 接口。
其中,Thread 其实也是实现了 Runable 接口。Runnable 和 Callable 的主要区别在于是否有返回值。

线程、协程
java虚拟机靠多线程来解决并发问题
协程是比线程更轻量级的解决并发问题的方案; 协程是程序语言在用户空间实现的多任务调度工作, 而线程和进程则是靠操作系统在内核空间和用户空间来实现多任务调度的,相比较而言的话,线程的切换以及资源占用都开销比较大。
单机能创建的协程数量可以达到百万级别, 线程的数量则大大小于这个数。

并发和并行的区别
image.png
实际上到对于多任务执行调度最后程序需要考虑的还是并发的问题,如何提高并发的能力,能最大效率的利用现有的资源。如果靠并行来解决就是用多核、多机器等方式。

Fork/Join并行框架
ThreadPoolExecutor线程池

3、equals、hashCode

  • equals去比较一定是相同类型的对象之间进行比较才有意义,不同类型的对象之间equals一定是返回false
  • hashCode是通过hash函数计算出来,hash函数存在碰撞的可能性,所以hashCode一样,并不代表两个对象相等

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。hashCode() 和 equals() 之间的关系如下:

当有 a.equals(b) == true 时,则 a.hashCode() == b.hashCode() 必然成立,

反过来,当 a.hashCode() == b.hashCode() 时,a.equals(b) 不一定为 true。

4、反射
反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为反射机制。

5、AOP
利用反射技术实现切面;静态和动态

2、static关键词
static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法!
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

7、数据类型
基本数据类型primitive type和reference Type
数据分为基本数据类型和引用数据类型。
基本数据类型:数据直接存储在栈中;
引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存里。

Mybatis

1、Mybatis #{}和${}两个符号的区别
#{}是会把含有变量的SQL语句转化为PreparedStatment, 这样有利于提高安全性(避免SQL注入),另外 #{},会把变量解释为表名和参数名时,会变成字符串。

select * from #{test} where id = #{id}

传入的test = "tablea", id = 2, 则变成了

select * from "tablea" where id = "2"

${},这不会对传入的变量进行处理
#{}是预编译处理, ${}是字符串替换

2、数据库翻页处理

  • 获取所有的数据,然后通过截取数组的长度来翻页;不可取,利用java程序来处理,效率低
  • 传入翻页参数,使用数据库的翻页语法

MySQL翻页:

select * from table limit curIdex, pageSize

Oracle翻页:

select * from (select rownum n, id from (select id from user) as u where n > 10) as t where t.n <= 20

3、Mybatis语法
xml中可以使用一些函数来处理SQL语句,比如foreach, trim 等

<!-- 公用的字段选择 -->
<sql id="queryUser">
select id, username, email, password
</sql>
<!-- select -->
<select id="selectUserById" resultMap="userResult">
<include refid="queryUser"/>
</select>

<delete id="deleteUserByIds" paramterType="string">
delete from user where id in 
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
0

评论区