Java从放弃到继续放弃

Java基础

Java和C++的区别

https://www.yuque.com/hollis666/rvd7xq/ugbv46
Java和C++都是面向对象的语言,但是Java是解释语言,C++是编译语言。
JVM使得Java是平台无关的,跨平台开发很方便。
Java是自动管理内存和垃圾回收的,C++需要手动回收。

面向过程和面向对象的区别

https://www.yuque.com/hollis666/rvd7xq/sy3eyr#II5Ef
面向过程是将问题一步一步的进行解决。
面向对象是将问题的步骤抽象,形成一个对象,直接使用对象去解决问题。

面向对象五大原则

https://www.yuque.com/hollis666/rvd7xq/sy3eyr#II5Ef
https://www.bilibili.com/video/BV1Wc411s7tT/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=48c4bea3923e67ebcd204cf8ceac86e1

  1. 单一职责原则:一个类负责一个职责。
  2. 依赖倒置原则:功能尽可能通过实现接口的方式实现。
  3. 开放封闭原则:尽量不对写好的功能进行修改,只做增加新功能。
  4. 接口隔离原则:接口的功能尽可能更加的解耦。
  5. liskov替换原则:子类不要去改动父类的方法,只在重写的方法上进行增加即可。
    其实五大原则的中心要义就是说,我们每个功能应该更加的解耦,对于业务类要通过实现接口的方式实现,子类重写父类的函数时要保留父类函数的功能,写过的功能要尽可能的保证不要再进行修改。

Java为什么不支持多继承

https://www.yuque.com/hollis666/rvd7xq/uegateiyswx40n33
C++支持多继承性,但是这样会产生菱形继承的问题。所以Java不支持多继承。
但是Java支持多实现,Java8之后,接口中可以实现带函数体的默认方法,默认方法直接继承不需要重写,对于实现了两个接口的类,如果两个接口中的默认方法的方法名相同,那么该类就必须重写这个方法。

String str=new String(“hollis”)创建了几个对象?

https://www.yuque.com/hollis666/rvd7xq/em12e4rgw6suv75o
一个或者两个

泛型有什么好处?

https://www.yuque.com/hollis666/rvd7xq/syhevb
方便:如果没有泛型对于每个类型的List都需要写一个接口。
安全:没有泛型的时候,对于类型的转换是在运行时检查的,如果错误就直接GC。有了泛型之后,在编译的时候检验就安全了很多。

类型擦除是什么?

https://www.yuque.com/hollis666/rvd7xq/qcn00m
就是泛型的不同表达,在编译的时候都只会编译成一份文件。
编译器编译泛型代码的时候会编译成普通java字节码。

并发编程

为什么需要多线程?

由于硬件的发展,CPU的核数增多,如果仍然使用单线程对CPU资源会造成浪费。同时,单线程也会出现阻塞的问题。所以,选择向多线程转变。
多线程的使用使得程序能够并行计算,提高计算速度。也能够异步执行,提供更快的响应速度。

什么是Java多线程并发不安全?

多线程并发不安全是指,由于多个线程并发执行可能导致执行过程中,多个线程抢占一个资源的时候导致的错误。
而Java多线程并发不安全的本质是由于线程本身不具有可见性、原子性、有序性
而Java对于不安全问题的解决方法是,提供了JMM(Java内存模型)来提供按需禁止缓存和编译优化的方法。
这些方法包括:

  • volatile、synchronized和final三个关键字
  • Happens-Before规则

正确利用这些JMM方法,就可以有效的解决上述的不安全问题。

减少多线程的上下文切换
常用的减少上下文切换的执行的方法有:

  • 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些方法来避免使用锁。如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
  • 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

线程池的主要作用

线程池的设计主要是为了管理线程,为了让用户不需要再关系线程的创建和销毁,只需要使用线程池中的线程即可。
同时线程池的出现也为性能的提升做出了很多贡献:

  1. 降低了资源的消耗:不会频繁的创建、销毁线程,线程池中的线程随取随用。
  2. 提高了相应速度:因为线程是已经创建好的线程,所以减少了线程创建的时间。
  3. 提高了线程的可管理性:线程是稀缺资源不能无限制的创建,使用线程池使得线程的数量是可控的。即=
  4. 提供了更强大的功能:线程池还提供了一些功能,比如定时执行、延迟执行、线程存活时间等。

线程池的实现

线程池的实现类是 ThreadPoolExecutor,它的继承性UML类图如下:

在这里插入图片描述
顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦,用户无需关心如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器中,由Executor框架完成线程的调配和任务的执行部分。

ExecutorSevice增加了一些能力:

  1. 扩充执行任务的能力,补充可以为一个或一批异步任务生成Future的方法
  2. 提供管控线程池的方法,比如停止线程池的运行。

AbstractExecutorService将执行任务的流程串联了起来,保证下层的实现只需关注一个执行任务的方法即可。

ThreadPoolExecutor将会一方面维护自身的生命周期,另一方面同时管理线程和任务,是两者良好的结合从而执行并行任务。

to be continue2024年6月9日10:20:02

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
大数据是一个广泛的领域,涉及到数据收集、存储、处理和分析等方面。想要入门大数据,你可以按照以下步骤进行: 1. 学习基础知识:了解大数据的基本概念、技术背景和应用场景。可以阅读相关书籍、网上教程或参加在线课程,掌握大数据的基本理论知识。 2. 学习数据处理工具:掌握常见的大数据处理工具,例如Hadoop、Spark等。可以通过安装和配置这些工具来学习它们的使用方法,并尝试使用它们处理一些简单的数据。 3. 学习编程语言:掌握至少一门编程语言,例如Python、Java等。编程语言在大数据处理中起到重要作用,可以使用它们来编写数据处理程序和脚本。 4. 实践项目:通过实践项目来巩固所学知识。可以选择一些简单的数据处理任务,例如数据清洗、数据分析等,逐步提高自己的技能。 5. 深入学习:如果对大数据领域有更深入的兴趣,可以学习更高级的技术,例如分布式计算、机器学习和人工智能等。这些知识可以帮助你在大数据领域取得更进一步的发展。 放弃与否取决于个人对大数据领域的兴趣和动力。大数据是一个快速发展的领域,对于持续学习和不断更新知识的人来说,提供了丰富的机会和挑战。如果你对数据分析和处理有浓厚的兴趣,并且愿意进行持续学习和实践,那么入门大数据是一个值得尝试的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值