JAVA基础培训总结 by 光远
通过参加本次JAVA基础培训,自己对之前所了解的一些知识有了一次比较系统的学习。回想整个学习过程,对以下印象比较深刻的知识点在课后做了个简单整理和总结。如有不对,请指正。
1 JAVA语言基础
1.1 传值与传引用
提到Java语言,在网上讨论较多的是:Java到底是传值还是传引用?
误区:JAVA对于原始类型(primitive type)传值,对于引用类型(reference type)传引用;
正解:JAVA参数传递都是传值的,传入参数都是“源”的一个复制品。
对于简单数据类型理解上基本没问题,对于对象传参的典型示例:
运行结果:
具体过程:
对象在传递给具体的方法时,会复制一个对象的引用给参数,也就是说,这个Object对象当前至少存在2个引用,引用指向的对象是相同的。
调用tricky方法前后的变化过程如下:
即只有方法的引用发生了改变,源的引用将不会变化。
1.2 对象的比较
“==”比较对象是否引用了同一个对象,或者比较简单类型变量值是否相等。
Object类的equals()方法用来比较是否一个对象(内存地址比较),在用equals比较具体对象时可以重写。
重写equals需要严格遵循java.lang.Object的规范:自反性、对称性、传递性、 一致性、非空性。改写的一般规则是:
l使用==操作符检查“实参是否为指向对象的一个引用”。
l使用instanceof操作符检查“实参是否为正确的类型”。
l把实参转换到正确的类型 。
l对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
改写一个类的equals方法后,两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。因此,当改写equals()的时候,必须要改写hashCode()。
1.3 集合类
Collection是最基本的集合接口,一个Collection代表一组Object。Collection中除Set不允许包含重复的元素外,其他的都可添加重复元素。
Collection的通用访问方式:
Iterator it = collection.iterator(); // 获得一个迭代子 while(it.hasNext()) { Object obj = it.next(); // 得到下一个元素 }
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque);LinkedList没有同步方法,可在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList实现了可变大小的数组,也是非同步的。Vector非常类似ArrayList,但是Vector是同步的。如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
还有一点需要注意,在迭代Collection和Map的时候,迭代器在调用next方法时,会检查列表是否被修改过,如果被修改 (add、remove等) 过将会抛出ConcurrentModificationException。
1.4 泛型
泛型除了基本的用法外,有几个误区:
误区1:
List<String> ls = new ArrayList<String>(); //1 List<Object> lo = ls; //2
假设这两行代码是正确的,那么下面的操作:
lo.add(new Object()); String str = ls.get(0);
将导致运行时错误,通过别名lo存取ls时,可以插入任意类型的对象,ls就不再仅仅支持String了。Java编译器消除了这种错误发生的可能性。
第2行将导致编译时刻错误。一般地说,如果Sub是Par的子类,G定义为某种泛型,那么G<Sub>不是G<Par>的子类。
误区2:
void method(List<String> ls) {…} void method(List<Long> ls) {…} void method (List<Object> lo){…} void method (List<?> l) {…}
以上三个方法放在一起并不能构成重载,相反还会出现编译错误。按照错误提示,可以了解到Java针对泛型采取的是erasure拭去法,拭去了参数,不论是List<String>,List<Object>还是List<?>,编译生成的都是同一段代码,只是在适当的地方加上了类型转换。
2 多线程
2.1 多线程与多进程
Java只有一个JVM进程。
进程相比线程而言比较独立,不共享资源和地址空间的;而线程是共享着相同的地址空间和资源,所以多线程之间的数据不安全。
2.2 对象锁与同步
Synchronized:这个关键字用于保护共享数据,每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。
volatile : volatile 变量可以被看作是一种 “程度较轻的 synchronized”, 但是不具备原子特性。由于线程变量缓存一致性,允许线程保存共享成员变量的私有拷贝,而且只有当线程进入或者离开同步代码块时,才能与共享变量的原始值对比,但是线程能够自动发现 volatile 变量保存的最新值(子线程始终能拿到主线程的最新值)。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
<!--[if !supportLists]-->ü <!--[endif]-->对变量的写操作不依赖于当前值。
<!--[if !supportLists]-->ü <!--[endif]-->该变量没有包含在具有其他变量的不变式中。
因此,这个变量可以用在一个控制开关的标志上,可以修饰一个变量始终保存多个线程读写后的最新值。
wait():此方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。此方法放弃当前对资源的占有权,等啊等啊,一直等到有人通知,才会运行后面的代码。
notify():此方法被调用后,将唤醒在等待该对象锁的线程;如果没有等待中的线程,则notify()不起作用。但是只有一个线程从wait状态中恢复,然后继续运行wait()后面的语句。
notifyAll()则唤醒所有在等待改对象锁的线程,通知所有的等待中的线程从wait()方法后的语句开始运行。
wait()和notify()、notifyAll()三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法,否则抛出IllegalMonitorStateException。当某个线程试图等待一个自己并不拥有的对象的监控器或者在自己拥有的同时去通知其他线程等待该对象的监控器时便会抛出该异常。
死锁:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,线程被无限期地阻塞,程序不可能正常终止。常见于线程加锁次序、占有并等待的情况。
java.util.concurrent包:
Atomic原子性:volatile仅仅只是解决了读最新的问题,如volatile int i, i++操作涉及到获取i值、修改i值、存储i值(i=i+1),这里的volatile只是解决了保存i值的问题,至于获取和修改i值,没有做到同步(如2个线程读到的i都是1,执行i++后结果仅仅是2,而不是3)。Atomic*中的变量是申明为volatile变量的,这样就保证的变量的写和读是一致的,然后Atomic提供了getAndIncrement方法,该方法对变量的++操作进行了封装,并提供了compareAndSet方法,来完成对单个变量的加锁和解锁操作。
ExecutorService :继承于Executor接口的接口,调用execute()方法执行线程任务。ExecutorService 提供了多个完整的异步任务执行框架,管理任务的排队和安排,提供了管理终止的方法,可以为一个或多个异步任务执行状况而生成 Future,获取线程返回值。其中,shutdown() 方法在终止前允许继续执行之前提交的任务,而 shutdownNow()方法阻止等待任务启动并试图停止当前正在执行的任务。
Executors:提供大多数 Executor 的常见类型和配置的工厂方法,以及使用它们的几种实用工具方法。如:newCachedThreadPool()--创建一个可根据需要创建新线程的无界线程池,可以进行自动线程回收,但是在以前构造的线程可用时将重用它们;newScheduledThreadPool()--创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行;newFixedThreadPool()创建固定大小线程池。关于线程池,比较常用的还有ThreadPoolExecutor,可灵活配置线程池的大小、调度策略以及拒绝策略。
concurrent包下还有较多线程安全的队列、并发Collection,都是比较实用的,。
3 开源工具包
Apache组织涉及到 Http服务器,编译工具,类库,开发架构,服务器端Java技术,J2EE容器,数据库工具,日志工具,XML解析等诸多领域。其下的Commons项目下包含了很多开源的工具,主要用于解决平时编程经常会遇到的问题,可有效减少重复劳动。
commons-io:主要在IO操作上提供了一系列的工具,包含了日常工作的静态工具类、输入流、输出流、文件过滤器、文件比较器、文件系统监控器。常见的工具类有FileUtils,对文件的读写、拷贝、删除等提供了很便利的方法。如:List<String> readLines(File file);void copyFile(File srcFile, File destFile);void writeStringToFile(File file, String data)。
commons-beanutils:常用的BeanUtils类提供bean的clone、bean之间属性拷贝、获取bean指定属性值等。如:void copyProperties(Object dest, Object orig),String getSimpleProperty(Object bean, String name)。在bean的拷贝使用中,需要注意:如果bean的属性中包含引用类型成员,拷贝之后的bean含有此成员的相同引用,即:拷贝后的bean可以修改拷贝前的bean的引用类型成员。
commons-configuration:用来帮助处理配置文件的,支持很多种存储方式,常见的有:Properties files 、XML documents、JNDI、JDBC Datasource、System properties等。
commons-dbcp:这个是用来配置数据库连接池,实际使用的较多。其BasicDataSource类中提供了连接池这个参数的设置、连接的建立和关闭等。
commons-net:此包封装了很多网络协议,可以各种协议进行编程通信。
其他子项目就不在此列举了,具体的使用可参阅apache官网指导信息。
4 感想
源码之下,了无秘密。多看开源框架,多看高手写的代码,多看优秀的代码,本身也是一种很好的学习方式。
发表评论
-
Thinking in Java 学习笔记——类型信息
2010-10-27 16:23 888因为毕业季,很多烦心的事,间断这么久都没有更新。本周学习进入 ... -
最近对Java学习兴致不断高涨
2010-08-31 09:35 829真的觉得挺意外的,对于Java大约也就之前学习过2、3个月, ... -
Thinking in Java 学习笔记 四
2010-08-27 20:44 777内部类,简单而言就是 ... -
Spring 学习笔记 一
2010-08-24 20:42 972Spring 学习笔记 Spring的疑问: ... -
Thinking in Java 学习笔记 三
2010-08-24 20:34 786对于类的清理,首先在于按照一定次序销毁成员变量,但是对于有些类 ... -
Thinking in Java 学习笔记 一
2010-08-23 08:17 686继承在面向对象中如此重要,以至于经常被高度强调,新手往往有这样 ... -
Thinking in Java 学习笔记 二
2010-08-22 14:33 787编译器对于编译时数值(如随机产生)只有在第一次使用的时候才 ... -
一个开始,希望能走到永远
2010-08-20 21:08 779怎么说呢,其实从很早一直有做笔记、写日记的习惯。逛 ...
相关推荐
【物业军事培训心得体会】 本次物业军事培训是一次深入学习物业管理理念和提升服务质量的重要机会。培训内容涵盖物业管理行业的历史发展、基本概念,特别是建筑物区分所有权的法律解析,以及物业管理服务意识的核心...
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
### Java集合类总结 在Java开发中,集合类(Containers)是极其重要的组成部分,它们作为开发者日常编程不可或缺的工具,不仅让代码变得更加简洁、高效,还能显著提升程序的功能性和灵活性。本文将对Java标准类库中...
1. 肯尼迪总统的讲话假设:这是一道逻辑推理题,与Java编程技术无关,但可以考察逻辑思维能力。肯尼迪的讲话假设美国石油公司只关心利润,不顾政府的指示。 2. 专利意识与企业行为:此题考察的是对企业专利工作的...
该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...
此外,描述中提到的“提取方式是百度网盘分享地址”,这并不是一个知识点,而是描述实验心得总结的获取方式,因此我们不会将其作为知识点进行阐述。 根据标题“matlab算法源码实验心得总结”,我们可以推断出与...
总结,开发聊天工具涉及到网络编程、多线程、数据交换格式、用户界面设计等多个核心领域,Java以其丰富的库和强大的跨平台特性,为实现这样的项目提供了坚实的基础。"天翔ZZ"作为一个实例,展示了如何用Java语言构建...
Java线程池是一种高效管理...总结来说,Java线程池通过合理的线程管理和任务调度,实现了对系统资源的有效利用,提升了程序的并发性能。理解并掌握线程池的设计思想和使用技巧,有助于编写出更高效、稳定的并发程序。
明确员工因故不能参加培训时的处理办法,包括请假制度、补训安排等,以保证培训计划的连续性和完整性。 附件1-4 提供了具体的表格和流程图,方便实际操作中跟踪培训进度、收集反馈、提出培训需求和申请外派培训等。...
本项目“zz.rar_JAVA俄罗斯方块”提供了一套完整的JAVA源代码,让开发者可以深入理解如何用JAVA语言实现这个经典游戏。本文将详细解析该项目中的关键知识点,帮助读者更好地理解和掌握JAVA编程技巧。 1. **JAVA基础...
总结来说,"fizzbuzz:Java FizzBuzz"是一个专注于Java FizzBuzz问题的项目,包含多种不同的实现方式,旨在帮助面试者、学习者和开发者提升编程技能,理解和比较不同的解决问题策略。通过研究这些实现,你可以...
【Linux学习心得】 Linux操作系统是计算机领域中一个重要的开源系统,由芬兰的Linus Torvalds于1991年10月首次发布0.02版本,直到1994年3月发布了1.0版本,标志着其成熟度的一个重要里程碑。Linux的发展受益于GPL...
北京ZZ集团房地产公司的员工培训制度是其人力资源管理的重要组成部分,旨在提升员工的专业技能、知识水平以及综合素质,以适应不断变化的房地产市场环境。该制度详细规定了培训的各个方面,包括总则、培训内容和形式...
第四章“受训者的权利与义务”阐明了员工在参加培训时应享有的权益,如接受培训的机会,以及对应的义务,如遵守培训纪律、积极参与等。 第五章“培训计划”详细讨论了如何制定和调整培训计划,以适应公司业务需求和...
例如,新员工培训管理办法强调了入职初期的引导和培训,岗位技能培训管理办法则针对不同层级的管理人员和基层员工设定了针对性的培训计划,而外派培训管理办法则规定了员工外出参加培训的选拔标准、程序及工资待遇。...
第四章“受训者的权利与义务”明确了员工参与培训的权利,如获取必要的学习资源、享受培训期间的薪资待遇,以及应尽的义务,如准时参加、积极参与、完成培训任务等。 第五章“培训计划”阐述了年度或季度的培训规划...
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
这一部分将明确员工在接受培训时享有的权利,如获取必要的学习资源、参与培训的时间保障等,同时也规定了员工应尽的义务,如按时参加培训、积极参与学习、完成培训任务等。 **第五章 培训计划** 这里会阐述如何制定...
"zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...