2019.7.29

四、基本数据类型与运算

1、基本数据类型
1)原始数据类型在传递参数时时按值传递,而封装类型是按引用传递;对象用于实例变量的默认值是null,而原始数据类型默认值与其类型有关。在Java语言中null不是是一个合法的Object实例,编译器并没有为其分配内存;仅表示引用
2)在Java中String是引用类型,不是基本数据类型;int是Java原始类型,而Integer是Java为int提供的封装类

2、不可变类
1)不可变类是指当创建了这个类的实例后不允许修改其值,只能读不可改
2)创建不可变类原则
类中的所有成员变量被private修饰
类中没有写或者修改成员变量的方法,只提供构造函数,一次生成
确保类中的方法不会被子类覆盖
如果一个类成员变量不是不可变量,在成员变量初始化或者使用get方法获取该成员变量时需要通过clone方法来确保不可变性
3)不可变类具有使用简单、线程安全、节省内存等优点;但是不可变类的对象会因值不同而创建新对象,从而产生不可预料的事情

3、值传递与参数传递

1)值传递:在方法调用中,实参把它的值传递给形参,形参只是用实参的值初始化一个临时的储存单元,因此虽然形参和实参有相同的值,却有不同的存储单元,因此对新参的改变不会影响实参
2)引用传递:在方法调用中传递的是对象(可以看作对象的地址),这时形参与实参的对象指向同一存储单元,对形参的改变会影响实参

4、Matn类中round、ceil、floor
round:+0.5向下取整 返回类型int
ceil:向上取整 返回类型double
floor向下取整 返回类型 double

5、在Java中默认使用Unicode编码,每个字符占两个字节,String里英文字符占1个字符 中文占2个字符

五、字符串与数组
1、字符串null与“”不同,null是引用 “”是空字符串
1.1new String(“abc”)创建了一个或两个对象

2、==,equals、hashCode(P104页)
==:比较两个基本数据类型或两个引用变量是否相等
Equals:比较值内容或比较两对象是否相等
hashCode:用于鉴定两个对象是否相等 如果没有重写hashCode方法,任何对象的hashCode()方法都是不相等的
在hashmap中用equals和hashCode来判别key是否重复

3、Sring 、StringBuffer、StringBuilder、StringTokenizer
1)String :不可变类,共享场合利用;用String来保存一个经常被修改的字符串时,在字符串修改时会比StringBuffer多很多附加操作,生成无用对象,会影响程序性能
2)StringBuffer:可变类;只能通过构造函数来初始化;是线程安全的
3)StringBuilder:运行效率最高,不是线程安全的;单线程操作大量数据时优先使用StringBuilder;多线程操作大量数据使用StingBuffer
4)StringTokenizer:字符串分割的工具类

4、Java中数组是对象;
数组:指具有相同数据类型的数据的集合,具有固定长度并在内存中占用连续的空间;在Java中数组有自己的属性(eg:length)和也可调用一些方法(eg:clone())

六、异常处理
1、finally块语句的执行
1)任何语句都会在return前执行,所以return语句前finally语句一定会执行,如果finally语句里包含return语句 会覆盖别处的return语句;
2)对于基本类型,在finally语句中对改变return的值对返回值没有影响,但是对引用类型的数据有影响
3)Finally语句不执行的两种情况:当程序进入try语句块之前就出现异常时,会直接结束,不会执行finally语句块;当程序在try块中强制退出时也不执行finally块中的代码

2、异常处理的原理
1)异常是指程序运行时所发生的非正常情况或错误,当程序违反了语义规则时,JVM会将出现的错误表示为一个异常并抛出
2)检查异常:发生在编译阶段;使用情况:异常的发生不会导致程序出错,处理后继续执行后续操作
3)运行时异常:异常逐层向上抛;编译器没有强制对其捕获并处理
4)先捕获子类,再捕获基类;尽早抛出异常并处理;

七、输入输出流

1、Java中IO流的实现机制
1)字节流:以字节为单位包含连个抽象类:InputStream和OutSteam ;输入输出时不会用到缓存;
2)字符流:以字符为单位,包含两个抽象类:Read和Write:用到了缓存;
3)JavaIO类中用到了装饰者设计模式
4)流的作用主要为了改善程序性能且使用方便

2、管理文件和目录
1)File类实现文件管理和操作
2)File:根据指定路径创建一个File对象
3)createNewFile():若文件或目录存在,则返回false,否则创建文件或文件夹
4)delete():删除文件或文件夹
5)isFile():判断对象是否为文件
6)isDrectory():判断对象是否是文件夹
7)list Files():若对象代表目录,则返回目录中所有文件的File对象
8)mkdir():根据对象指定路径创建目录
9)Exits():判断对象对应文件是否存在

3、Java序列化
1)序列化(Serialization):序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作引发的问题;序列化可以将对象写在流里进行传输,或者保存到文件、数据库;
2)实现序列化:所有类都必须实现Serializetion接口;
3)序列化特点:如果一个类能被序列化,则其子类也能被序列化;由于static代表类的成员,transient代表对象的临时数据,被声明为这两种类型的数据成员不能被序列化
4)使用情况:需要进行网络来发送对象或者对象的状态需要被持久化到数据库或文件中时;序列化能实现深复制,即可复制引用的对象
5)serivalVersionUID:判定类的兼容性。自定义serivalVersionUID优点:提高程序运行效率;提高程序在不同平台的兼容性;增强格格版本的兼容性
6)外部序列化

八、Java平台和内存管理

1、Java语言是一种具有动态性的解释性语言,类只有被加载到JVM中才能运行
2、类加载步骤:装载;链接(检查、准备、解析);初始化
3、GC:
(1)GC:垃圾回收
(2)垃圾回收器任务:分配内存、确保被引用对象的内存不会被错误的回收及回收不再被引用的内存空间

4、Java内存泄漏
(1)内存泄漏是指一个不再被程序使用的变量或变量还在内存中占用存储空间
(2)垃圾回收标准:第一,给对象赋予了空值null,以后再也没有使用过;第二,给对象赋予了新值,重新分配了内存空间
(3)内存泄露的情况:一是在内存中申请的空间为被释放;二是对象已不再被使用但仍然在内存中保留;Java内存泄漏主要是第二种情况
(4)内存泄漏的原因:
1)静态集合类 例如hashMap Vector 其生命周期与程序一致,对象在程序结束前不被释放,引起内存泄漏
2)各种连接 例如数据库连接,网络连接以及IO连接等
3)监听器 在释放对象时往往没有相应的删除监听器
4)变量不合理的作用域
5)单例模式可能会造成内存泄漏

5、Java中堆和栈的区别
(1)堆和栈都是用来存放数据的地方
(2)栈内存主要用于存放基本数据类型和引用变量
(3)堆内存主要用于存放运行时创建的变量 线程会共享堆内存
(4)堆主要是存放对象的,栈主要是用来执行程序的

九、容器*
1.Java Collections框架
(1)Java Collections框架中包含了大量集合接口和这些接口的实现类和操作他们的算法(例如排序、查找、反转、替换、复制、取最小元素、取最大元素等);主要提共了List(列表),Queue(队列),Set(集合),Stack(栈),Map(映射表。用于存放键值对)
(2)Set :表示数学上的集合概念,集合元素不能重复 实现类:hashSet和TreeSet(有序)
(3)List: 有序,顺序存储操作对象;可以保存重复的对象;Linked List、ArrayList和Vactor都实现了List的接口
(4)Map:提供了一个从键映射到值的数据结构;是一个接口 不能实例化Map的对象但能可以实例化实现Map接口的类的对象

3、迭代器:是一个对象,遍历并选择序列中的对象
(1)注意事项:
①使用容器的iteractor()方法返回一个Iteractor对象,通过Iteractor的next()方法返回第一个元素
②使用Iteractor的hasNext()方法判断容器是否还有元素
③可以通过remove()方法删除迭代器返回的元素
(2)使用iteractor()遇到ConcurrentModificationException异常:原因是在遍历Iteractor同时又对容器做增加或删除操作引起的或者由于多线程操作导致
(3)在JDK1.5版本引入了线程安全的容器如ConcurrentHashMap、CopyOnWriteArrayList等,可以使用线程安全的容器来代替非线程安全的容器
(4)在使用迭代器遍历容器时对容器操作放在synchronized代码块中

4、ArrayList、 Vector、 LinkedList的区别
(1)均为可伸缩数组,可动态改变长度的数组
(2)ArratList 和Vector都是基于Object [] array来实现的,具有数组特性;插入数据效率较慢;
(3)ArrayList动态扩充容量默认为原来的1.5倍;而Vector扩充为2倍
(4)ArrayList与Vector的最大区别时同步的使用,没有一个ArrayList的方法时同步的,所以ArrayList不是线程安全的,而Vector时线程安全的,可以用于多线程情况
(5)LinkedList采用双向列表实现,所以插入效率高,时非线程安全的容器

5、HashMap、HashTable、TreeTable、WeaHashMap (*****)
(1)HashMap是一个最常用的Map,通过键的HashCode值存储数据,根据键直接获取它的值,访问速度较快
(2)HashMap与HashTable的区别
①HashMap是HashTable的轻量级实现(非线程安全的实现),HashMap允许空键值(最多允许一条),而HashTable不允许
②HashMap把HashTable的contains方法去掉了,改成containsvalue和containsKey
③HashTable是线程安全的,而HashMap不支持线程的同步,不是线程安全的
④HashTable采用Enumeration,而HashMap是Iterator
⑤HashMap和HashTable采用的hash/rehash算法几乎一样,性能不会有太大差异
⑥HashTable中,hash数组默认大小为11,增加方式是old*2+1 ,而HashMap中hash数组大小是16.一定是2的倍数
⑦hash的使用不同,HashTable直接使用对象的hashCode
(3)TreeMap实现了SortMap接口,能够把它保存的记录根据键排序
(4)LinkedHashMap值HashMap的一个子类,可以实现顺序排列
(5)WeakHashMap采用弱引用, 而HashMap采用强引用

(6)在HashTable的上下文中,同步意味着一个时间点只能有一个线程可以修改hash表,任何线程在执行HashTable的更新前都需要获取对象锁,其他线程则等待锁的释放
(7)实现HashMap的同步:HashMap可以通过Map m= Collections.synchronizedMap( new HashMap())来达到同步的效果

6、在使用自定义的类作为HashMap的key时,如果没有重写hashCode()和equals()方法时,默认使用Object类的hashCode()方法和equals()方法;为了实现在向HashMap中添加键值对时,可以根据对象的内容来判断两个对象是否相等需要重写hashCode()和equals()方法
7、Collection是一个集合接口。提供了对集合对象进行基本操作的通用接口方法;
Collections是针对集合的一个包装类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值