1.API 的使用
APi是我们写代码的帮助文档,后续要接触很多第三方的技术,她们都会给我们提供Api,我们就必须会读懂,JDK也给我们提供了帮助文档。
(1)看包,如果是java.lang下的类,写代码的时候我们不用引入包
1.Math 类
(2)看这个指定的类是具体类,抽象类,接口,并且关注开始的版本号
2,Scanner
3,内部类
(1)类内部的类就是内部类。
位置:把一个类定义到另一个类中,那么内部的类就是内部类
创建内部类的语法:
外部类.内部类 变量名 = new 外部类对象.内部类对象。outer.Inner in = new outer().new Inner();
内部类的外部类的方法如果想要访问内部类的方法,必须创建内部类的对象,根据内部类的对象来访问。
(2)内部类被private来修饰,需要封装去实现
快捷键
command/alt+shift+o快速导入包
command/alt+shift+f 对代码进行格式化
command + d 删除当前行
command + shift +x 将选中部分的字母大写
command + shift +y 将选中部分的字母小写
在preferences->keys里面可以找到
Error 程序不能解决的错误,例如内存溢出
Exception 程序可以处理的,分为编译器异常和运行时异常。除了RuntimeException其他都是编译器的异常。
运行时异常解决方法:
1.自行处理
try{
}catch(){
}
//多个异常,多个处理catch
try{
}catch(){
}catch(){
}
自定义异常
在实际的项目中,我们需要跟业务相关的异常,javaAPI中是没有的,所以我们要自定义。自定义的异常只要继承javaAPi中的异常类即可,通常情况下我们会自定义运行时异常,所以我们自定义异常就去继承RuntimeException.
2.向上抛出
如果被调用的方法发生了运行时的异常,那么如果被调用的方法不去处理(不try.catch)jvm默认就会把这个运行时的异常处理抛到上一层,上一层函数可以对这个异常来处理,如果上一层函数依然没办法处理那就不处理,就会接着向上抛出,总有一层方法会处理它。
同一个包下类的访问
当前类在编译的时候它所关联的类也会被编译。
在同一个包下的两个类可以直接访问。
访问权限的修饰符
在类上如果同public 来修饰,那么这个类可以被任何类所访问。类如果是默认修饰在本类中可以访问,在同一个包下的类可以访问,其余都不可以访问。
Object类
打印对象的时候底层输出的其实调用的是toString()方法.
hashCode 将对象内存地址转换成十进制,不同对象是根据hashCode来区分的。
finalize() 用于虚拟机的垃圾回收,不需要我们手动调用,由jvm来调用.
String 类
String s1 = new String("abc");
String s2 = "abc";
有什么区别?
前者创建了两个对象,后者创建了一个对象。
==: 比较基本类型,比较值是否相等。
比较引用类型,比较地址值是否相同。
Equals()
比较引用类型默认比较的是地址是否相同,对于一般的引用类型都会重写该方法。一个类具体比较的是什么我们就得分析源码。s1和s2的地址是不同的,但是值是相同的。
共享内存区(常量,非new出来的),堆区(new出来的),栈区
字符串和任何基本数据类型相加都会转换成字符串
indexOf如果在一个字符串中查找指定的字符串没有找到就返回-1
可变字符串 StringBuffer
StringBuffer:字符串缓冲区,可变字符串
StringBuffer和String区别?
String 一旦被创建后,值不能改变,如果参与了操作,引用发生了变化,不是在原有的字符串上操作,而是新产生了一个字符串。
StringBuffer是线程安全的,效率稍低。使用Stringbuffer只产生一个字符串 ,多线程使用。
StringBuilder
java1.5之后有的StringBuilder,是线程不安全的,但是效率要比StringBuffer高,存储速度快,单线程使用。
Random
获取随机数
System
InputStream,OutputStream
可以获取系统的信息等等...
包装类
java 语言是一个面向对象的语言,但是java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。对应关系如下:
byte -- Byte boolean -- Boolean short -- Short char -- Character int -- Integer long -- Long float -- Float double -- Double
可以转换为二进制,16进制,以及8进制
自动装箱和拆箱的原理
JDK1.5之后拥有的新特性
装箱:把int类型转换成Integer.........new Integer(int).
拆箱:把integer 转换成int.........intValue();
装箱和拆箱是不需要我们主动调用的,是JVM自动给我们完成的。Integer= 1;
Integer 未赋初值的话,默认值是null. int 未赋初值的话,默认值是0,因为integer是对象.
字符串在使用的时候一定要判空。
Date
时间类
SimpleDateFormat SimpleDateFormat extends DateFormat 根据模版来展示时间,format模版要统一。
SimpleDateFormat继承与DateFormat
日期格式化
String 转换日期
日期转换字符串
Calendar
日历类计算国内的月份需要加1,西方是从0开始的。计算国内的星期需要加1;
数组和集合的区别
数组:长度固定,可以储存基本数据类型,也能存储对象。只能存储同一种数据类型的数据。[]
集合:长度可变,只能储存对象类型。在集合中可以存储任意类型。
集合Collection
1.集合也叫容器用于存储对象。我们根据不同的需求和不同的数据结构来对集合做了不同的抽象。
list 接口继承与collection ,同时衍生出ArrrayList,Vector,LinkedList
set 接口继承与collection,同时衍生出HashSet,TreeSet,LinkedHashSet
重点是List,Set,ArrayList,Vector,HashSet.
2.集合的方法
3.集合的遍历
迭代器
Iterator ,每次只能取一次
4.List
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
5.遍历的并发
多个线程对同一个集合操作时会产生并发安全性问题,java.util.ConcurrentModificationException Iterator依赖于list,只要list发生了变化Iterator就没有用了,就会发生并发修改异常。在迭代器中添加数据,其实就是添加到了list中,新添加的数据不会被当前的这次循环遍历出来,listIterator可以解决,在存在并发访问集合的时候一般建议使用for或者listIterator
List的子类
1. ArrayList
List 接口的大小可变数组的实现,实现了所有可选列表操作,并允许包括null在内的所有元素,除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
特点:ArrayList 中的元素可以重复,是有序的集合,长度不固定。不是线程安全的。效率高
2.LinkedList
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
Push压栈 Pop出栈
队列:
队列的特点是先进先出
链表:
3.Vector
Vector
类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
和ArrayList功能上类似,最主要的区别就在于Vector是线程并发安全的,缺点就是效率比较低。
1.2之后才实现list接口
泛型
我们在项目中使用集合基本99%都是在集合中存储同一种数据类型,既然我们在集合中存储同一种数据类型我们事先一定知道这个集合中要存储什么基本类型,我们就可以预先去指定要存储的数据类型。
范型:就是提前指定要操作的数据类型
在集合使用的语法:List<E>
在定义集合的时候
List<数据类型> 变量名 = new ArrayList<数据类型>().
增强的for循环
存在并发修改异常
在Jdk1.5之后出现了增强的for
for(String str:ss) {
}
for(数据类型 变量:集合变量){
}
Set
一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2)
的元素对 e1
和 e2
,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象
set 里面的方法绝大多数都是继承于collection,
set的特点
元素不可重复
元素是无序的
HashSet
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
equals:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
HashSet的唯一性
==表示地址相同 equals表示的是值相等。Set去重其实去重的不只是值还有hashCode也就是对象地址。所以对象去重要重写equals和hashCode方法。
HashSet和ArrayList一样都是线程不安全的
HashSet特点
1.元素的唯一性
2.无序性
3.允许null存在一个
4.不是线程安全的(效率高)
LinkedHashSet
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)
LinkedhashSet特点
1.元素的唯一性
2.有序性
3.允许null存在一个
4.不是线程安全的(效率高)
TreeSet
基于 TreeMap
的 NavigableSet
实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator
进行排序,具体取决于使用的构造方法。根据ASCII码进行排序.TreeSet在添加时会比较字符串的大小,调用String 中的compareTo的方法来比较
TreeSet 唯一性的规则使用的是comparedTo的规则
TreeSet可以支持自定义排序,如果TreeSet所存储的对象没有实现 comparable接口就会报错java.lang.ClassCastException,所以我们如果想要使用TreeSet来对自定义的对象进行排序必须使用comparable接口,内部排序类似于冒泡排序
TreeSet特点:
1.元素的唯一性
2.可自定义排序的
3.允许null存在一个
4.不是线程安全的(效率高)
compareTo比较
s1.compareTo(s2)如果比较的结果>0的话(正序),s1>s2,如果比较的结果<0的话(倒序),s1<s2。如果等于0的话相等(平级)根据ASCII码进行排序
可变参数
注意:参数p实际是一个数组,p都是同一种类型。
可变参数的语法:
修饰符 返回值类型 方法名(数据类型...变量){
}
工具类
Arrays:工具类方法都是静态的
数组的工具类,这里的方法都是静态的
要掌握的功能:
1.把数组转换成字符串toString
2.对任意数组排序Sort
3.二分法查找binarySearch
collections
collecton 和collections的区别
前者是集合的接口
后者是操作集合的工具类
Map
Map即使健值对的集合的接口抽象
我们可以通过key的值来获得相应的值,将健映射到值得对象,一个映射不能包含重复的健,每个键最多只能映射到一个值,允许有空值。
Map的特点:
1.数据成对出现
2.数据的健是唯一的
3.一个健只能对应一个值
4.值可以重复
6.健允许有一个为空,但可以多个是空
Map只是个接口,需要子类来实现
子类有:HashMap,HashTable,Treemap
遍历
Entry 接口实现是最好的方案
HashMap的特点
1.HashMap是Map的实现类
2.允许多个null值和一个null健
3.HashMap中的元素是无序的
4.HashMap不是线程安全的
IO概述
IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出,例如:键盘的输入,再比如显示器就是输出设备,输出图像。
对于java 来说,输入输出问题,java将它抽象成流对象来解决
以游戏程序为中心读取文件就是输入,写入文件就是输出。
IO流在java中从输入输出角度分类:
1.输入流:从文件中读取数据,或者从键盘输入数据都属于输入流
2.输出流 :向文件中写入数据
IO流在java中从数据的角度来分类
1.字符流(文本我们能读得懂的,都可以认为是字符流。比如:文章,java文件等等)
字符输入流的超类:Reader:FileReader,BufferReader
字符输出流的超类:Writer:子类 FileWriter,BufferWriter
2.字节流(二进制的数据,这种数据一般我们读不懂。比如:图片文件,map文件等等)
字节输入流的超类:InputStream:FileInputStream
字节输出流的超类:OutputStream:子类 FileOutputStreamFile类
我们操作系统中所有的设备的体现都是文件(包含文件夹),java对文件做了抽象,在java中IO包提供了文件的操作功能
Java中throw和throws的区别
throw是语句抛出一个异常。throws是方法可能抛出异常的声明 。目录可以刷新 refresh 当IO创建文件时,refresh就可见
休息一下
线程
进程:计算机中特定功能的程序在数据集上的一次运行。
线程:线程是进程的一个单元。
多线程:一个进程中有多个线程在同时运行,如迅雷下载,迅雷软件的一次运行就是一个进程,在迅雷中可以同时下载多个电影,这就是多线程,每一个下载就是一个线程。
JVM是多线程的,在我们运行JVM的时候后台会运行垃圾回收的线程,来清理没有被引用的对象。
创建新执行的线程有两种方法.
1.一种方法是将类声明为Thread的子类,该子类应重写Thread类的run方法,接下来可以分配并启动该子类的实例。
线程启动的时候使用线程的start方法而不是run
2. 实现Runnable接口,使用构造器创建
线程的执行原理
线程的并发执行是通过多个线程不断的切换cpu的资源,这个速度非常快,我们感知不到,我们能感知到的是三个线程在并发执行。
线程的生命周期
1.新建 线程被new出来
2.就绪 线程具有执行的资格,即线程调用了start()
3.运行 具备执行的资格和具备执行的权利
4.阻塞
5.销毁
针对线程的安全性问题,我们需要使用同步锁
网络编程
TCP/IP
四层协议
网络通信的三要素
1.IP地址
2.端口号
3.传输的协议
IP的最大值是233.255.255.255 以十进制表示
端口号用于标示进程的逻辑地址,不同的进程,端口不同。如果我们要和某一个计算的应用程序通信就必须指定这台计算机的IP地址和这个应用程序的端口号
协议就是计算机通信的规则