JAVA基础

OOP概念 封装、继承、多态。 粗浅的解释封装就是对数据进行隐藏;继承就是子类继承父类(class)或接口(interface)的方法和属性,并实现代码复用;多态就是重载和重写。

抽象的理解: 抽象是从众多物质中抽取共同的、本质的特征,抽象是一种概念(比如public interface或抽象基类),抽象的过程是一个比较的过程,有比较才能抽象出共有特征和本质;抽象的过程也是一个裁剪的过程,剪掉非本质的特征。

对象:  一切事物都是对象,把事物的外观抽象为对象属性,事物的隐私看作为对象字段,事物的外部行为抽象为对象的公共方法,事物的内部行为看作为对象的私有方法。属性和公共方法称为接口,字段和私有方法称为本源。 private成员是对象的本源,private成员无法被继承。


类继承:  类继承的意义不仅仅是代码复用,更大的意义是类扩展,类扩展表现为方法的重载以及子类中有的方法和属性而父类中没有的方法和属性。在一定程度上,类扩展也可以看做是一种多态,这不仅仅表现在子类重写父类的方法,还表现在子类比父类具有更多的特性,子类是父类的变体,表现出和父类相似但比父类更丰富的形态。


方法的重载:  表现在“殊途同归”,对象做同样的事情,事情的结果相同(返回值类型),但是实现的途径不同(参数列表或方法体不同)。方法的重写表现在“青出于蓝而胜于蓝”,子类覆盖父类的方法并进行扩展,如果不是这样,重写就没有太大的意义。

final
1.修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。
2.修饰方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。

因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。

注:类的private方法会隐式地被指定为final方法。

3.修饰变量

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

方法一但被final时,无论该方法被public,protected及默认所修饰时,Son类根本不能重写Father类speak()方法


==和equals:    ==对比的是引用地址路径,equals比的是内容

多态:
存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象



重写方法的规则

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)

4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:

父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。


重载的规则:

1、必须具有不同的参数列表;

2、可以有不的返回类型,只要参数列表不同就可以了;

3、可以有不同的访问修饰符;

4、可以抛出不同的异常;

 

重写与重载的区别在于:

重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。

用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.


super 与 this 的区别 super 不是一个对象的引用,不能将 super 赋值给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字。
this: 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。


Java StringBuffer与StringBuider:
StringBuffer str =newStringBuffer();// 分配16个字节长度的缓冲区 默认16字节
StringBufferstr =newStringBuffer(512);// 分配512个字节长度的缓冲区
StringBuffer类的主要方法  

1.append() 方法      str . append ( true );    // append() 方法用于向当前字符串的末尾追加内容,类似于字符串的连接。  //  注意是str指向的内容变了,不是str的指向变了。  
2. deleteCharAt()   //deleteCharAt() 方法用来删除指定位置的字符,并将剩余的字符形成新的字符串
3.delete()  // 你也可以通过delete()方法一次性删除多个字符  str.delete(1,4);
4.insert() 方法 insert()   //用来在指定位置插入字符串,可以认为是append()的升级版。例如:  str.insert(3,"xyz");
5.setCharAt()    // setCharAt() 方法用来修改指定位置的字符  

StringBuffer与StringBuider使用方式差不多。

总结

线程安全: - StringBuffer:线程安全      - StringBuilder:线程不安全

速度:
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

使用环境:

操作少量的数据使用 String;
单线程操作大量数据使用 StringBuilder
多线程操作大量数据使用 StringBuffer



枚举:
switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强
enum Signal {  
    GREEN, YELLOW, RED  

Signal color = Signal.RED; 
System.out.println(color);



接口和抽象类: 抽象类是一些共有属性,接口类是共有属性外某些物品具备的属性:门抽象开门和关门,接口警报器


抽象: 方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

2)抽象类不能用来创建对象;

3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

在其他方面,抽象类和普通的类并没有区别。


接口: 英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。



泛型: 线程: Runnable ,Thread
IOThread t2 = new IOThread(megx);
t2.start();

判定一个线程是否结束:1.isAlive()(用得不多); 2.joi n()该方法等待所调用线程结束, 运用join()以确保主线程最后结束

线程优先级: 
final void setPriority(int level);
final int getPriority( );

level 指 定了对所调用的线程的新的优先权的设置。Level的值必须在MIN_PRIORITY到MAX_PRIORITY范围内。通常,它们的值分别是1和10。要返回一个线程为默认的优先级,指定NORM_PRIORITY,通常值为5。这些优先级在Thread中都被定义为final型变量。

线程同步: synchronized
 synchronized(this){ } //线程的对象必须是统一对象类this


线程间通信:
wait( ) 告知被调用的线程放弃管程进入睡眠直到其他线程进入相同管程并且调用notify( )。
notify( ) 恢复相同对象中第一个调用 wait( ) 的线程。
notifyAll( ) 恢复相同对象中所有调用 wait( ) 的线程。具有最高优先级的线程最先运行。

线程通信最经典的例子:消费者与生产者
1. 生产者线程对象
2. 消费者线程对象
3. 资源类(如,生产包子的容器)
4. wait方法和notify方法(切换运行,达到互相唤醒)
5. 实现条件是判断容器中的资源是否变化,到达一定变化时,调用wait方法,等待唤醒。
6. 反之亦然,notify通知沉睡的线程,继续执行。


死锁:发生在当两个线程对一对同步对象有循环依赖关系时。例如,假定一个线程进入了对象X的管程而另一个线程进入了对象Y的管程。如果X的线程试图调用Y的同步方法,它将像预料的一样被锁定。而Y的线程同样希望调用X的一些同步方法,线程永远等待,因为为到达X,必须释放自己的Y的锁定以使第一个线程可以完成。死锁是很难调试的错误.
例如:同步状态下XY已经在执行,但是XY需要取YX的函数才能释放同步互斥操作



IO流操作:
数据流(Data Stream)中包括输入流(Input Stream)和输出流(Output Stream)
输入输出流的特性:
 1.先进先出,最先写入输出流的数据最先被输入流读取到。
 2.顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。
 3.只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

缓冲流: 为了提高数据的传输效率,引入了缓冲流(Buffered Stream)的概念, 即为一个流配备一个缓冲区(Buffer),一个缓冲区就是专门用于传送数据的一块内存

  Java提供了两种类型的输入输出流:一种是面向字节的流,数据的处理以字节为基本单位;另一种是面向字符的流,用于字符数据的处理。


针对一些频繁的设备交互,Java语言系统预定了3个可以直接使用的流对象,分别是

 System.in(标准输入),通常代表键盘输入。
 System.out(标准输出):通常写往显示器。
 System.err(标准错误输出):通常写往显示器。

在Java语言中使用字节流和字符流的步骤基本相同,以输入流为例,首先创建一个与数据源相关的流对象,然后利用流对象的方法从流输入数据,最后执行close()方法关闭流。




JDBC数据库连接:

事务处理:
conn.setAutoCommit(false);  //设置手动提交
conn.commit();  //提交
conn.rollback();//异常实务回滚

1.prepareStatement 和  Statement 
接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。

(1).PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程

(2).使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

execute              //  用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
executeUpdate  //插入,删除,更新
executeQuery    //查看
ResultSet rs = null; //结果集
 
    
2. prepareCall     //执行存储过程
String strSql = "{call test(?)}";
CallableStatement   cstmt = conn.prepareCall(strSql);                
cstmt.setString(1, admin.getUsername());        
pstmt.setInt(3, admin.getId());
pstmt.executeUpdate();





网络编程:





Hash 哈希表:

1. HashTable 
 HashTable has=new HashTable();
 Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();
 Hashtable<String,  String> numbers = new Hashtable<String,  String>();

void clear()  //清空hash表

boolean contains (Object value); //是否存在对象

boolean containsKey (Object value);//是否存在key

boolean  isEmpty(); //是否为空

Object get(Object key);  //获取对应关键字对象,若不存在返回null

void rehash();  //再hash,扩充hash使之可以保持更多元素,当hash表满时,系统自动调用

Object put(Object  key,Object value); //用给定的关键字把对象保存到哈希表中,此处的关键字和元素均不可为空(X 错误 numbers.put("one", null);)

Object remove(Object key);  // 从哈希表中删除与给定关键字相对应的对象,若该对象不存在返回 null 
int size();   // 返回哈希表的大小 



2.HashMap
// 默认构造函数。
HashMap()
// 指定“容量大小”的构造函数
HashMap(int capacity)
// 指定“容量大小”和“加载因子”的构造函数
HashMap(int capacity, float loadFactor)
// 包含“子Map”的构造函数
HashMap(Map<? extends K, ? extends V> map)

void   clear();  // 清空hash表
Obj ect    clone();                                  // 返回此  HashMap  实例的浅表副本:并不复制键和值本身。
boolean   containsKey(Object key);       //  如果此映射包含对于指定键的映射关系,则返回  true
boolean   containsValue(Object value); // 如果此映射将一个或多个键映射到指定值,则返回  true
Set<Entry<K, V>>    entrySet();          // 返回此映射所包含的映射关系的  Set  视图。
V    get(Object key);                           // 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回  null 。  V所映射值的类型
boolean   isEmpty();                            //  如果此映射不包含键-值映射关系,则返回  true
Set<K>   keySet();                              // 返回此映射中所包含的键的  Set  视图。
V     put(K key, V value);                      //  在此映射中关联指定值与指定键。   V所映射值的类型
void   putAll(Map<? extends K, ? extends V> map);  // 将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。
V        remove(Object key);          // 从此映射中移除指定键的映射关系(如果存在)。 V所映射值的类型
int      size();                                 // 返回此映射中的键-值映射关系数。
Collection<V>    values();           // 返回此映射所包含的值的  Collection  视图。 V所映射值的类型


3.HashSet
 add(Object)
 addAll(Collection)
 remove(object)
 removeAll(Collection)
 size()
 iterator()
 toArray()
  clear()
  isEmpty()
  contain(object)
  containAll(Collection)





4. TreeSet



Hashtable和HashMap的区别:
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。


HashSet与HasnMap区别和方法

 区别:

1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Mapkey 

2.  MapkeySet都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.

3.  hashCodeequal()HashMap用的因为无需排序所以只需要关注定位和唯一性即可.

 a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.

b. hash表中的一个索引处存放的是一张链表所以还要通过equal方法循环比较链上的每一个对象 才可以真正定位到键值对应的Entry. 

c. put,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value 

4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的

a. Comparator可以在创建TreeMap时指定 

b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.

TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了



Java向量(Vector)及其应用:






JAVA常用类:









总结不好多多担待,文章只单纯个人总结,如不好勿喷,技术有限,有错漏麻烦指正提出。本人QQ:373965070
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值