21、String类
- 在Java中,String对象既可以显式创建也可以隐式创建;
- String类对象的两种实例化方式:
String s = "abc";
String s = new String("abc");
- 也可以用串联方式生成,如:
String s = "new" + "string";
这种情况只生成了一个对象,因为编译器在编译期就能够得到s的值为"newstring",不需要等到程序运行期间。 - String内容的比较
"=="比较两个对象是否引用同一实例,例:
也可以用串联方式生成,如:String s = "new" + "string";这种情况只生成了一个对象,因为编译器在编译期就能够得到s的值为"newstring",不需要等到程序运行期间。 String内容的比较 "=="比较两个对象是否引用同一实例,例:
5.String是类,s1、s2和s3是对象,对象名保存在栈内存中,"Hello"保存在堆内存中;
6.任何情况下使用"new"关键字一定会开辟一个新的堆内存空间;
7.s1与s2栈内存不同,但指向相同堆内存;
8.栈内存像int型数据,里面保存的是数值,每一个栈内存只能保存一块堆内存的物理地址数值;
9.字符串常量往往是String类的匿名对象;
10.字符串一旦声明将不可改变,改变的只是字符串的引用,并且会产生大量字符串垃圾,因此应尽量避免不断修改字符串内容。
22、反射机制
- 根据对象找到类
Class<?> cls = date.getClass(); Class<?> cls = java.util.Date.class; Class<?> cls = Class.forName("java.util.Date");
2.采用反射机制的工厂模式,无需使用new关键字即可访问java对象的属性、方法、构造方法等,可以降低耦合,反射最重要的用途就是开发各种通用框架。
Book book = Factory.getInstance("Computer"); book = (Book) Class.forName(className).newInstance();
23、JDK中常见的包
1.java.lang中包含一些Java语言的核心类,包括String、Math、Integer、System和Thread等,提供常用功能。还有一个子包java.lang.reflect,用于反射机制;
2.java.awt包含构成抽象窗口工具集的多个类,用于构建和管理图形用户界面(GUI);
3.java.applet包含applet运行所需要的一些类;
4.java.net包含执行与网络相关的操作的类;
5.java.io包含能提供多种输入/输出功能的类;
6.java.util包含一些实用工具类,如定义系统特性,与日期日历相关的方法。
24、处理错误的方法的特点
- 无需打乱程序的结构,如果没有任何错误产生,程序的运行不受任何影响;
- 不依靠方法的返回值来报告错误是否产生;
- 采用集中的方式来处理错误,能够根据错误种类的不同进行对应的错误处理操作;
25、Java常见异常
- 算数异常(Arithmetic Exception):当运算时出现除以0这样的运算时就会出现;
- 空指针异常(Null Pointer Exception):没有给对象开辟空间却使用该对象;
- 文件未找到异常(FileNotFound Exception);
- 数组下标越界异常(ArrayIndexOutOfBounds Exception);
5.内存不足异常(OutOfMemory Exception)。
6.修改不能修改的类集时:UnsupportedOperationException;
7.一个对象与另一个对象不兼容时:ClassCastException;
26、Java异常处理
Java通过面向对象的方式来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为异常的抛出。运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一过程称为异常的捕获。
27、throws关键字
使用throws关键字声明的方法表示此方法不处理异常,而由系统自动将所捕获的异常信息“抛给”上级调用方法。
28、throw关键字
throw关键字可以直接抛出异常,抛出时直接抛出异常类的实例化对象即可。throw出现在方法体中,一旦它抛出一个异常,则程序会在throw语句后立即终止,后面的语句没有机会执行,然后在包含它的所有try块中(可能在上层调用方法中)从里向外寻找含有与其异常类型匹配的catch块,然后加以处理。
29、Java的类集框架
Java的类集框架可以使程序处理对象的方法标准化,类集接口是构造类集框架的基础,使用迭代方法访问类集可以使对类集的操作更高效;
在计算机世界里,处理繁琐问题的常用方法就是将其封装,只向外提供可调用的方法视图。Java类集框架就是对这一方法的一种官方实现一套动态数组的操作类。本质上,Java类集框架就是Java对数据结构的一个大体上的封装。
30、单值保存的最大父接口-Collection
Collection是构造类集框架的基础,是单值数据操作的最大父接口,它声明了所有类集都将拥有的核心方法。
31、Collection接口具体实现类
AbstractCollection、AbstractList、AbstractSequentialList、LinkedList、ArrayList、AbstractSet、HashSet、TreeSet;除了Collection接口之外,还有几个从以前的版本遗留下来的类,如:Vector、Stack和HashTable等均被重新设计成支持类集的形式。
32、允许重复的子接口-List
一个List可以包含重复的元素;
List接口中最为常用的两个子类:ArrayList(性能较高,属于异步处理)、Vector(性能较低,属于同步处理);
33、ArrayList
ArrayList类继承AbstractList抽象类并实现List接口。ArrayList支持可随需要而增长的动态数组。本质上,ArrayList是对象引用的一个变长数组。
34、LinkedList
LinkedList类继承AbstractSequentialList类并实现List接口。LinkedList提供了一个链表的数据结构。
35、旧的子类-Vector
Vector实现了动态数组,这与ArrayList相似,但Vector是同步的,并且包含了许多不属于类集框架的从以前版本遗留下来的方法。
所有的Vector都有一个原始的容量,在这个原始的容量达到以后,下一次再试图向Vector中存储对象时,Vector会自动为那个对象分配空间,同时为别的对象增加额外的空间。通过分配超过需要的内存,Vector减少了可能产生分配的次数。这种次数的减少很重要,因为分配内存是很花时间的。在每一次的再分配中,分配的额外空间总数由在创建Vector时指定的增量来确定,如果没有指定,则每个分配周期Vector的大小增加一倍。
36、不允许重复的子接口-Set
Set接口不像List接口那样对Collection接口进行了大量的扩充,而是完整地继承了Collection接口。
Set接口定义了一个集合,并添加了类集中元素不允许重复的特性。
两个常用子类:HashSet、TreeSet。
37、HashSet
HashSet继承AbstractSet抽象类并实现了Set接口。它创建了一个类集,使用散列表进行存储,而散列表则通过散列法的机制来存储信息。HashSet中的数据不重复,且没有顺序。
在散列中,一个关键字的信息内容被用来确定唯一的一个值,称为hashCode,而hashCode被用来当作与关键字相连的数据的存储下标。关键字到hashCode的转换是自动执行的–看不到hashCode本身,程序代码也不能直接索引散列表。
散列法的优点在于即使对大的集合,它也允许一些基本操作,如add()、contains()、remove()和size()等方法的运行时间保持不变。
构造方法:
HashSet(); HashSet(Colection c); HashSet(int capacity); HashSet(int capacity, float fillRatio);
填充比介于0.0到1.0之间,决定HashSet向上调整大小之前,有多少空间被充满,默认0.75。
HashSet无法确定其元素的排列顺序,如果需要顺序存储,TreeSet更适用。
38、TreeSet
TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储。访问和检索很快。在存储了大量的、需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。
39、SortedSet接口
SortedSet接口继承了Set接口并实现了按升序排列的集合的特性。
40、类集的输出
- 迭代器(Iterator)是一种抽象的设计概念,提供了一种方法允许依序访问某个容器所含的各个元素,而无需暴露该容器的内部结构。
- 单向输出迭代Iterator,例:
Iterator<string> iterator = al.iterator(); while(iterator.hsaNext()) { Object element = iterator.next(); System.out.println(element); }
3.双向迭代ListIterator扩展了Iterator,允许双向遍历列表,并且可以修改单元。对于执行List的类集,也可以通过调用ListIterator来获得迭代方法。列表迭代方法提供了前向或后向访问类集的能力,并且可以修改元素,否则ListIterator如同Iterator功能一样。
4.for-each不仅可用于数组的输出,也可用于集合的输出。
for(String s : all) { System.out.println(s); }