java基础知识总结一

来源:互联网 发布:sql distinct多表 编辑:程序博客网 时间:2024/05/20 12:52

throwable的常用方法 :
toString();对throwable的简单描述 返回包名加类名+传入的参数
getMessage();返回throwable创建的对象里面传入的参数
//java虚拟机默认只能管理64m
printstackTrace();打印异常的栈信息

ERROR一把是由于jvm或者是硬件引发的问题,所以一般不会通过代码去修改错误
而异常时需要代码去处理的

如何区分错误与异常:
错误基本都是以Error结尾的
异常都是Exception

jvm虚拟机发现不正常情况会创建一个对应的异常对象,并且会调用异常对象的printStackTrace

捕获异常的细节:
1如果try块中的代码经过了处理 try catch外面的代码还可以正常执行
2try块中出现异常里面的后面的代码就不能执行
3一个try块中可以捕获多种异常类型的
4catch中的Exception包治百病 (利用了多态)
5捕获异常的顺序必须是从小到大不然会报错

一异常处理非常有用,
二现实开发中遇到不同的异常往往有不同的处理方式

异常处理:两种格式
一捕获处理的格式
try{
可能发生异常的代码
}
catch(捕获的异常类型 变量名)
{
处理异常的代码。。。
}

二抛出处理
throw throws
抛出异常的细节

自定义异常类的步骤
自定义类继承Exception

运行时异常:如果抛出一个运行时异常,那么方法上可以声明也可以不声明,调用者可以处理也可以不处理
编译时异常:如果抛出一个编译时异常,那么方法上必须要处理,调用者也必须处理
运行时异常RuntimeException以及RuntimeException的子类,都是运行时异常
除了运行时异常之外的都是编译时异常

导包语句的作用只是为了简写书写

/*
抽象类:
什么是时候使用抽象类:
描述一类事物的时候,发现该事物确实存在着某种 行为,但是 目前这种
是不具体的,这时候应该抽取这种行为的声明,而不去实现该种行为,这时候
这种行为我们把它称为抽象的行为,这时候应该使用抽象类。
抽象类要注意的细节:
1. 如果一个方法没有方法体,那么该方法必须使用abstract修饰。
2. 如果一个类函数抽象方法,那么这个类肯定是一个抽象类或者接口。
3. 抽象类不能创建对象。
4. 抽象类是含有构造方法的。
5. 抽象类可以存在非抽象方法与抽象方法。
6. 抽象类可以不存在抽象方法。
7. 非抽象类继承抽象类的时候,必须要把抽象类中所有抽象方法全部实现。
abstract不能与以下关键字一起使用
1.abstract 不能与static共同修饰一个方法。
2. abstract 不能与private共同修饰一个方法。
3. abstract不能以final关键字共同修饰一个方法。
接口:
接口的定义格式:
interface 接口名{
成员变量
成员函数..
}
接口的作用:
1. 程序解耦。
2. 定义约束规范
3. 拓展功能。

接口要注意的细节:
1. 接口中成员变量都是常量,默认 的修饰符是 public static fianl.
2. 接口中的方法全部都是抽象的方法,默认的修饰符: public abstract。
3. 接口不能创建对象。
4. 接口是没有构造函数 的。
5. 非抽象类通过implements实现接口的时候,必须要把接口中所有方法全部实现。
接口与类之间 的关系: 实现关系。
注意: 一个类可以实现多个接口。
接口与接口之间的关系: 继续关系。
注意: 一个接口是可以继承多个接口的。
多态:父类的引用类型变量指向了子类的对象,或者是接口的引用类型变量指向了接口实现类的对象。
多态要注意细节:
1. 多态情况下,如果子父类存在同名的成员变量时,访问的是父类的成员变量.
2. 多态情况下,如果子父类存在同名的非静态函数时,访问的是子类 的成员函数。
3. 多态情况下,如果子父类存在同名的静态函数时,访问的是父类的成员函数。
4. 多态情况下, 不能访问子类特有的成员。
多态的应用:
1.多态用于形参类型的时候,可以接收更多类型的数据
2. 多态用于返回值类型的时候,可以返回更多类型的数据
内部类:一个类定义在另外一个类的内部,那么该类就称作为内部类。
内部类的class文件名: 外部类$内部类. 好处:便于区分该class文件是属于哪个外部类的。
内部类的类别:
1. 成员内部类:
成员内部类的访问方式:
方式一:在外部类提供一个方法创建内部类的对象进行访问。
方式2二:在其他类直接创建内部类的对象。 格式:外部类.内部类 变量名 = new 外部类().new 内部类();
注意: 如果是一个静态内部类,那么在其他类创建 的格式:
外部类.内部类 变量名 = new 外部类.内部类();
内部类的应用场景: 我们在描述A事物的时候,发现描述的A事物内部还存在另外一个比较
复杂的事物B时候,而且这个比较复杂事物B还需要访问A事物的属性等数据,那么这时候
我们就可以使用内部类描述B事物。
比如: 人—>心脏
class 人{

氧气
等….
class 心脏{
}
}

       内部类的好处:内部类可以直接访问外部类的所有成员。        内部类要注意的细节:            1. 如果外部类与内部类存在同名的成员变量时,在内部类中默认情况下是访问内部类的成员变量。               可以通过"外部类.this.成员变量名" 指定访问外部类的 成员。            2. 私有的成员内部类只能在外部类提供一个方法创建内部类的对象进行访问,不能在其他类创建对象了。            3. 成员内部类一旦出现了静态的成员,那么该类也必须 使用static修饰。

/*
局部内部类: 在一个类 的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。

局部内部类要注意的细节:
1. 如果局部 内部类访问了一个局部变量,那么该局部变量必须使用final修饰、
匿名内部类:没有类名的类就称作为匿名内部类。
匿名内部类的好处:简化书写。
匿名内部类的使用前提:必须存在继承或者实现关系才能使用。
匿名内部类一般是用于实参。
/*
打jar包: 需要使用到jdk的开发工具(jar.exe).
jar的用法:
使用格式:
jar cvf jar文件的名字 class文件或者是文件夹
打jar包要注意的事项:
1. 一个程序打完了jar之后 必须要在清单文件上指定入口类: 格式 Main-Class: 包名.类名
2. jar包双击运行仅对于图形化界面的程序起作用,对控制台的程序不起作用。
jar文件的作用:
1. 方便用户快速运行一个项目。
2. 提供工具类以jar包的形式给别人使用。
如果使用jar包里面的类必须要先设置classpath路径。
jre = jvm+ 核心类库
模板模式 :解决某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们可以
为这类事情提供一个模板代码,从而提高效率 。
需求;编写一个计算程序运行时间 的模板。
模板模式的步骤:
1. 先写出解决该类事情其中 的一件的解决方案。
2. 分析代码,把会发生变化的代码抽取出来独立成一个方法。把该方法描述成一个抽象的方法。
3. 使用final修饰模板方法,防止别人 重写你的模板方法。
*/

如果用equals 那么常量作为方法的调用者写在前面、这样做的原因是如果传入的是null就会出现空指针异常

使用字节数组和字符数组可以构建一个字符串对象

字节数组,字符数组,字符串三者是可以相互转换的

java有begin和end都是包头不包尾

如果需要频繁修改字符串 的内容,建议使用字符串缓冲 类(StringBuffer)。

StringBuffer 其实就是一个存储字符 的容器。

笔试题目:使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?
StringBuffer 底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16, 如果字符数组的长度不够使用 死,自动增长1倍。

StringBuffer 是一个存储字符的容器

容器的具备 的行为

String增加    append(boolean b)    可以添加任意类型 的数据到容器中    insert(int offset, boolean b)  指定插入的索引值,插入对应 的内容。删除    delete(int start, int end)  根据指定的开始与结束的索引值删除对应的内容。    deleteCharAt(int index)   根据指定 的索引值删除一个字符。修改    replace(int start, int end, String str) 根据指定 的开始与结束索引值替代成指定的内容。    reverse()   翻转字符串缓冲类的内容。  abc--->cba    setCharAt(int index, char ch)  把指定索引值的字符替换指定的字符。    substring(int start, int end)  根据指定的索引值截取子串。    ensureCapacity(int minimumCapacity)  指定StringBuffer内部的字符数组长度的。查看    indexOf(String str, int fromIndex) 查找指定的字符串第一次出现的索引值,并且指定开始查找的位置。    lastIndexOf(String str)    capacity() 查看当前字符数组的长度。    length()    charAt(int index)    toString()   把字符串缓冲类的内容转成字符串返回。

StringBuffer 与 StringBuilder的相同处与不同处:

相同点:    1. 两个类都是字符串缓冲类。    2. 两个类的方法都是一致的。不同点:    1. StringBuffer是线程安全的,操作效率低 ,StringBuilder是线程非安全的,操作效率高。    2. StringBuffer是jdk1.0出现 的,StringBuilder 是jdk1.5的时候出现的。

推荐使用: StringBuilder,因为操作效率高。
*/
Random类
随机返回一个随机数实现的方法有 nexInt(参数)返回一个0-参数之间的数字不包括数字
还有nextFloat()等不加参数的用到的话可以上API里面查找

外循环与内循环根据内外数据写。内部写内部的i外部写外部的

list set
迭代
toArray
iterator
collection
List接口特有的方法

ArrayLIst的特点以及(特有方法(不重要))

ArrayList 的实现原理底层是数组实现的 查询快 删除添加慢效率低
查询多增删少就用ArrayList来存储这批数据
LinkList的特点以及特有的方法
底层是链表实现的查询慢
接口 返回值类型
为什么在collection里面itertor里面用的是接口因为有很多类用到这个接口中的方法 也有可能是分配原因
接口 return new实现类
看到array,就要想到角标。
看到link,就要想到first,last。
看到hash,就要想到hashCode,equals.
看到tree,就要想到两个接口。Comparable,Comparator。
Treeset
如果要加入的数据没有按照自然排序的规则来那么comparable接口实现comparable方法叫自然排序 要想使用iterator接口就必须实现重写comparatore
Treeset可以对字符串进行比较因为字符串已经实现了comparable接口
Treeset只与comparable有关与equals和hashcode没有关系
contains只与comparable有关
comparable比较字符串(字符串已经实现了comparble接口)
return x=(this .getName()).compareTo(s.getName());

HashSet

HashSet存储要想使用其中的iterotor重写hash码实现分桶存储排序
一般来说只与与hashcode跟equals有关
contains只与equals和hashcode有关

泛型

泛型可以赋值给对象但是不能赋值给基本数据类型 基本数据类型想要进行这样的惭怍需要先转换成对应的包装类在进行相应的操作

单例集合 的体系:
———| Collection 单例集合的根接口
————| List 如果是实现了List接口的集合类, 具备的特点:有序,重复。
—————| ArraryList 底层 是使用了Object数组实现的,特点: 查询速度快,增删慢。
—————| LinkedList 底层是使用了链表数据结构实现 的, 特点: 查询速度慢,增删快。
—————| Vector Vector的实现与ArrayList是一致,但是是线程安全 的,操作效率低。 jdk1.0的时候出现的
————| Set 如果是实现了Set接口的集合类,具备的特点:无序,不可重复。
—————-| HashSet 底层是使用了一个哈希表支持的, 特点:存取速度快。
HashSet添加元素的原理:
往HashSet添加元素的时候,首先HashSet会调用元素的hashCOde方法得到元素的哈希码值,然后会经过一系列运算
就可以算出该元素在哈希表中的存储位置/

情况1:如果算出该元素的位置目前没有任何元素存储,那么该元素可以直接存储 情况2: 如果算出该元素的位置目前已经存有其他的元素,那么还会调用元素的equals方法与该位置的元素再比较一次。如果equals方法返回的是false,那么该元素允许存储,如果euqlas方法返回的是true,那么该元素被视为重复元素,不允许存储。

——————| TreeSet 底层是使用了红黑树(二叉树)数据结构实现的, 特点:会对元素进行排序存储。

TreeSet要注意的事项:
1. 往TreeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么会根据元素自然顺序的特性进行排序存储。
2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么元素所属的类必须要实现Comparable接口,把元素的比较规则定义
在CompareTo方法上。
3. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现COmparable接口,那么必须要在创建
TreeSet对象的时候传入比较器。
4. 如果比较的方法(CompareTo 或者Compare )返回的是0的时候,那么该元素就被视为重复元素,不允许添加。
比较器的定义格式: 自定义一个类实现COmparator接口即可。
class 类名 implements Comparator{
}

泛型:泛型是jdk1.5出现的新特性。

泛型的好处:
1. 将运行时出现 的问题提前至了编译时。
2. 避免了无谓强制类型转换。
自定义泛型: 自定义泛型就是一个数据类型的占位符或者理解为一个数据类型的变量。

泛型方法:
修饰符 <声明自定义的泛型>返回值类型 函数名(自定义的泛型 变量名..)

泛型方法要注意的事项:
1. 泛型方法中 的自定义泛型的具体数据类型是在调用该函数的时候传入实参时确定的。
2. 自定义泛型所用 的标识符只要符合标识符 的命名规则即可。但是我们一般都习惯使用一个大写字母表示。
泛型类:
泛型类的定义格式
class 类名<声明自定义的泛型>{
}
泛型类要注意的事项:
1. 泛型类上的自定义泛型是在使用该类创建对象的时候指定具体的数据类型的。
2. 如果一个类已经自定义了泛型,使用该类创建对象的时候如果没有指定泛型的具体数据类型,那么默认为Object类型。
3. 静态的函数不能使用类上自定义的泛型,如果静态函数需要使用,必须要在函数上自定义泛型。

泛型接口:
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
泛型接口要注意事项:
1. 泛型接口上的自定义泛型是在实现该接口的时候指定具体数据类型的。
2. 如果实现接口的时候没有指定接口上 的自定义泛型的具体数据类型,那么默认为Object数据类型。
3. 如果需要在创建接口实现类对象的时候才指定接口上自定义泛型,那么需要以下格式: class 类名 implements 接口

泛型上下限:

? super Integer   允许是Integer数据类型或者是Integer父类类型       泛型的下限?  extedns Number  允许是Number数据类型或者是Number子类的数据类型   泛型的上限。泛型规定数据的类型,避免集合中向下转型的问题

*/
Key不可以重复Value可以重复
根据get(key)获取value
Collections

Hashmap
set keySet 把map集合中的所有键保存到set集合中
在调用iterator方法
Set it=map.keySet();
Iterator key=it.iterator();
while(key.hasNext()){
String it1=key.next();
System.out.println(“键”+it1+”值”+map.get(it1));
}
//迭代二只能返回值没有键
Collection c=map.values();
Iterator it2=c.iterator();
while(it2.hasNext()){
System.out.println(“值”+it2.next());
}
//迭代三
*/
Set

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格 Computer $1600 Phone $12 Pipe $1

可以使用冒号来定义对齐方式:

项目 价格 数量 Computer 1600 元 5 Phone 12 元 12 Pipe 1 元 234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorizationdef somefunc(param1='', param2=0):    '''A docstring'''    if param1 > param2: # interesting        print 'Greater'    return (param2 - param1 + 1) or Noneclass SomeClass:    pass>>> message = '''interpreter... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

    • 快捷键
    • Markdown及扩展
      • 表格
      • 定义列表
      • 代码块
      • 脚注
      • 目录
      • 数学公式
      • UML 图
    • 离线写博客
    • 浏览器兼容

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为:Γ(n)=(n1)!nN
  • 块级公式:

x=b±b24ac2a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.0张三张三李四李四嘿,小四儿, 写博客了没?李四愣了一下,说:忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0开始我的操作确认?结束yesno
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注内容. ↩
0 0