Java基础

方法

基本基于《java从入门到精通》和《java编程思想》2本书整理而成。突出java与C++区别。

内容

记录自己遗漏或者不熟的知识点,已经熟悉的不再重复记录。
印象中java与C++主要区别:
1、 java无指针,无需手动分配释放内存,采用垃圾回收机制。
2、 java完全面向对象,因此基本数据类型int等都有对应的类如Integer等。因此什么都得new。
3、 java对象,实际上是一个对象的引用。导致对象赋值时,传的是内存地址。
4、 java有接口,无多重继承

第一章 初识java
Java是由于一个软件工程师对于C++不满意,而开发出来的。

第二章 熟悉eclipse开发工具

第三章 Java语言基础
1、 byte类型,代表1个字节。
2、 long类型,结尾必须加L。Float类型,结尾必须加F,否则系统当做double类型。
long x = 54321L;
float y = 12.521F;
3、char类型,java使用unicode编码。
4、常量是final,而C++是const。
final boolean z = true;
5、java与C++区别:byte类型。Char类型默认2字节。Boolean。final修饰变量与C++的const类似,final修饰类(该类不能被继承)或者类的方法(该方法不能被override)。
6、新版jdk提供了enum类型,类似C++用法。使用enummap或enumset更加高效。

第四章 流程控制
1、没有单独的foreach语句(不同于C#)。
int arr[] = {1, 2, 3};
for(int x : arr)
{
}

第五章 数组
1、初始化数组,要new。(这点和C#类似,初始化都有new)
int arr[] = new arr[10];
3、 Arrays类提供了对数组的常见操作,由于java完全面向对象。
4、Java中的数组与对象一样,也是一种引用。

第六章 字符串
1、String在java中是类(不同于C++中是基本数据类型,由于java完全面向对象)。但是声明和初始化“很像”基本数据类型。
字符串比较用equals()方法,比较的是内存位置。但int等可以用比较。
基本数据类型比较用和!=。
复杂数据类型(类)比较equals和
都是比较引用。
但String、Integer、Date等数据类型重写了equals,比较的是内容。

2、StringBuilder类
可以操作字符串的增删等。频繁增加字符串,单线程下建议用StringBuilder,快。
StringBuilder类多线程不安全,StringBuffer类是多线程安全。

第七章 类和对象
1、例7.13,这个例子举的很贴切。static成员变量:本类或其他类的对象共享。
2、Book book = new Book(); //简单而言,book是Book类的一个对象。严格而言,book是包含Book对象的一个引用,存放的是一个对象的内存地址。下面这个例子:

第一个结果是false,第二个结果是true。
需要指出的是,对象c1,c3指向同一个内存(因为将c1 对象的引用赋给c3,类似C#),而C++中对象c3应该是有单独内存空间的(默认浅拷贝,java由于无指针,也就不存在深/浅拷贝)。

3、对象销毁
对象超出作用范围 或者 被置为null时,会被垃圾回收。
4、 与C++区别:
Java中类本身有访问权限: public、package(本包可见)。 Java类中的方法有四种权限:private、package(本包可见)、protected、public。 Java的extends默认以public方式继承父类。
Java中无需显示声明override,默认override。

第八章 接口、继承与多态
1,java不支持多重继承,但有时候又需要多重继承,java类可以继承多个接口。
类似C++中的抽象类(包含纯虚函数的类)。
extends继承类,implements实现接口。
2,super关键字,调用父类的方法、变量等。
3,abstract关键字,抽象类(不能被实例化),抽象方法(必须要子类重写的方法)。
4,抽象类与接口区别:
java实现类似C++中多重继承功能可以用接口。
个人理解接口抽象的更彻底,不存在方法的实现;抽象类中可以有默认的方法实现(对于一些非抽象方法)。

第九章 类的高级特性
1,内部类(了解吧,用的不多):一个类定义在外部类的内部。
包含成员内部类,匿名内部类等。
成员内部类:类似外部类的一个成员,可以无缝访问外部类的属性、方法。
2、使用场景:了解即可,谨慎使用。变相实现了多重继承。
说明:内部类和外部类的关系:内部类(除去用static修饰的)可以直接使用其外部类的成员变量以及成员函数,达到一个继承的效果,再加上自身继承基类。来达到一个多重继承的效果.如下代码。
例一:
public class OuterClass {
//内部类
class InnerClass extends CommonClass{

    public void enhanceMethod1(){
         System.out.println("before");
         super.method1();//调用父类commonClass的函数
         method();//调用外部类outerClass的函数
         System.out.println("after");
    };
}

/***********************************************************************/
public void method(){
System.out.println(“method函数”);
}
}
例二:
// MultiInterfaces.java
// two ways tha a clas can implement multiple interface.
interface A{}
interface B{}
class X implements A, B {}
class Y implements A {
B makeB(){
// Amonymous inner class
return new B() {};
}
}

2,反射:通过反射,运行时可以获取类的方法(构造函数、成员方法)和属性(成员变量)等信息。了解即可。
其实是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个对象进行获取。例如Class c = Class.forName(“XXX”);

第十章 集合类/容器
1, 再次总结 数组、集合类的区别 :数组定长,集合类变长。数组存基本数据类型,集合类存对象引用。
2,
List、Set、Map区别:List特点:元素有放入顺序,元素可重复 。Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉。list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。Map是键值对。
ArrayList、LinkedList区别:ArrayList基于动态数组,查询效率高,增删效率低。LinkedList基于链表的数据结构,查询效率低,增删效率高。
HashSet、TreeSet区别:HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet。在我们需要排序的功能时,我们才使用TreeSet。此外,还有LinkedHashSet,记录插入的顺序,复杂度O(1)。
HashMap、TreeMap区别:通常用HashMap,效率更高。如果需要元素存在顺序,则使用TreeMap。
3,遍历集合类一般用iterator迭代器,知道这么个概念。
4、java.util.concurrent包提供了线程安全容器。包括CopyOnWriteArrayList, CopyOnWriteArraySet, blockingqueue接口(线程安全队列接口,有多种实现,用于生产者-消费者模式), ConcurrentHashmap。ConCurrentSkipListMap 和 ConCurrentSkipListSet (这两种分别实现有序的map和set)。此外,enumset和enummap(为enum设计的set和map的特殊实现)。
5、当hashset或hashmap中的key放入的是对象时(基本数据类型和String类型已默认重写,无需再做一遍),需要考虑重写equals和hashcode函数的问题,以保证key唯一性。Treeset或treemap的key放入对象时,通过重写compare接口中排序函数,实现自定义排序。

第十一章 异常处理
1、try…catch语句块不要太大,把较长的语句实现成一个函数
Public void showINfo() throws Exception{…}
2、 可以继承Exception类自定义异常
3、可以使用printStackTrace来获取方法调用的堆栈
4、主线程无法捕获子线程中的异常,需要在子线程中单独try catch。

第十二章 输入/输出
1, java io,即输入输出,主要包括文件IO和网络IO。
2, InputStream(字节输入流)、Reader(字符输入流)。FileInputStream/FileOutputStream类对字节/字节数组的读写。FileReader/FileWriter类对字符,如汉字的读写。
3、java 新IO,java.nio包
新IO流是通过内存映射文件来进行操作的(即将文件或一段文件区域映射到内存中),通过访问内存就像访问文件一样,效果就是使得输出/输出操作更快。
新IO中有两个核心:Channel(通道)和 Buffer(缓冲)。Buffer类似容器,可以存放多种数据类型,包括bytebuffer、charbuffer等。Channel可同时读写数据,但均需先通过Buffer,java包括了FileChannel和SocketChannel(个人理解类似select的IO多路复用)等。当有2个通道,其中一个通道是FileChannel的时候,通道之间是可以传输数据的!通过FileChannel的两个方法transferFrom和transferTo(零拷贝技术,效率更高)。
此外,提供了Charset用于编解码。提供了FileLock做文件锁。

第十三、十四章 Swing程序设计
所有Swing的部分我都不看,不是目前的主流技术了。

第十五章 多线程/并发
1、 Java线程创建2中方式,貌似实现runnable接口更加好一些。
2、 java线程池
分为ThreadPoolExecutor(立即执行)和ScheduledThreadPoolExecutor(延时定时或周期性任务)。
Executors工具类提供了FixedThreadPool、SingleThreadExecutor、CachedThreadPool等。本质是在ThreadPoolExecutor基础上封装了一层。使用原则是满足常规使用,但如果遇到需要满足高性能使用场景,最好还是定制ThreadPoolExecutor参数。
3、 线程同步
Lock与synchronized关键字(lock性能好于synchronized关键字。但是java编程思想的建议是常规使用synchronized关键字即可,特殊需要高性能场合考虑lock。)
信号量sephomore,使用类似C++。
CountDownLatch和CyclicBarrier,个人理解这2者类似C++中条件变量的弱化版本,例子:赛马比赛,5个跑道上马都准备好才统一开始跑。
原子操作:java.util.concurrent.atomic。提供了对基本类型Integer、boolean,数组和对象的原子操作,本质是乐观锁的实现。

第十六章 网络通信
无。

第十七章 JDBC操作数据库
无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值