1-java

Posted lihaozong2013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-java相关的知识,希望对你有一定的参考价值。

————————————————————————————————————————————————————————————————————————————————————
*******************************************************************************面向对象************************************************************************************************************************************************
————————————————————————————————————————————————————————————————————————————————————

  运行:我们写代码是写在.java文件中,然后先编译成计算机能识别的.class文件,然后计算机运行。

  eg: 名为 MyClass 的类将写在名为 MyClass.java的源文件中,并被编译为字节码类文件 MyClass.class。

————————————————————————————————————————————————————————————————————————————————————

①代码段

__________________________________________________________________________________________________________________________________________________

  1、是实例化对象的时候自动调用, 每实例化一个对象, 都会调用一次

  2、执行在构造方法之前

  3、静态代码段类第一次被加载到内存中的时候触发, 只会触发一次
____________________________________________________________________________________________________________________________________________________

②static
____________________________________________________________________________________________________________________________________________________

  1、静态成员属于类, 需要用类来访问,非静态成员属于对象, 需要用对象来访问

  2、在静态方法中, 可以直接访问本类中的静态成员, 不能直接访问本类中的非静态成员

  3、在非静态的方法中, 可以直接直接访问本类中的静态成员, 也可以直接访问本类中的非静态成员
____________________________________________________________________________________________________________________________________________________

③Override
____________________________________________________________________________________________________________________________________________________

  1、@Override可以用来检测是否是重写, 不是必须的, 但最好加上

  2、重写方法的访问权限要大于等于父类中方法的访问权限

  3、返回值类型要小于等于父类中方法的返回值类型
____________________________________________________________________________________________________________________________________________________

④抽象类
____________________________________________________________________________________________________________________________________________________

  1、抽象类中的抽象方法是不能实现的,没有{}。

  2、抽象类中的可以存在非抽象方法和属性。

  3、抽象类的子类必须以重写父类的抽象方法
____________________________________________________________________________________________________________________________________________________

⑤接口
____________________________________________________________________________________________________________________________________________________

  1、接口中必须是抽象方法和常量(可以为静态常量),加defualt修饰符的也是抽象方法,只是默认实现

  2、接口只能实现接口,不能继承类。但是类可以继承类和实现接口,但必须重写所有接口的抽象方法。

  3、接口中定义的静态常量外部能访问,但不能改变,因为是常量。(就像类中的静态常量可以访问一样)
____________________________________________________________________________________________________________________________________________________

⑥内部类
____________________________________________________________________________________________________________________________________________________

  1、成员内部类

    OuterClass outer = new OuterClass(); //本类中成员可通过this来访问,外部类中成员可通过外部类名.this来访问
    InnerClass inner = outer.new InnerClass();


  2、局部内部类(方法内部类)

    只在方法中生效。

  3、静态内部类

    导入包后,和普通的类访问类似。

  4、匿名内部类
____________________________________________________________________________________________________________________________________________________

⑦包装类
____________________________________________________________________________________________________________________________________________________

  1、同种包装类可以自动转换;

      int a = new Integer(5);
      character c = ‘A‘;

  2、不同包装类需要用valueof()转化

      String str = String.ValueOf(new char[]); //字符数组转换为字符串

      int a = Integer.ValueOf(char c); //字符转化为整数
____________________________________________________________________________________________________________________________________________________

⑧String
____________________________________________________________________________________________________________________________________________________

  1、执行效率 : StringBuilder > StriingBuffer > String

  2、StringBuffer是线程安全的,StringBuilder是线程不安全的

  3、转换(new):


    char[] c = new char[]{‘A‘,‘B‘,‘C‘,‘D‘};

    String str = String.ValueOf(c);

    StringBuilder Builder = new StringBuilder (str);

    StriingBuffer Buffer= new StringBuffer (str);

    Striing str2 = new String (Buffer);

  _________________________________________________________________________________________________________________________________________

  ④String方法:

 

    length()

    charAt(int index)                //返回索引的字符


    compareTo(String anotherString)        //比较两个字符串的大小
    equals(Object anObject)             //比较字符串是否相同 (重要)

    getBytes()                  //转化为字节数组

    indexOf(String str)              //返回字符串出现的索引,如果没有,返回-1
    lastIndexOf(String str)

    matches(String regex)              //是否能匹配正则
    replaceAll(String regex, String replacement)   //替换
    split(String regex)                //分割

    substring(int beginIndex)
    substring(int beginIndex, int endIndex)

    toLowerCase()
    toUpperCase()
    toCharArray()

    trim()                    //去掉首尾空格

_______________________________________________________________________________________________________________________________________

⑨日期与日历
_______________________________________________________________________________________________________________________________________________

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date dt = sdf.parse("2000-11-22 22:10:10"); //字符串转化为日期格式
    String str = sdf.format(dt); //日期转化为字符串


    dt.getDate() //获取日期
    dt.getTime() //获取时间

    dt.getYear() //获取年月日 时分
    dt.getHours()
    dt.getDay()
    dt.getHours()
    dt.getMinutes()


    Calendar cal = Calendar.getInstance(); //获取当前日历

    cal.get(Calendar.YEAR); //年
    cal.get(Calendar.MONTH) + 1; //月(必须要+1)
    cal.get(Calendar.DATE); //日
    cal.get(Calendar.HOUR_OF_DAY); //时
    cal.get(Calendar.MINUTE); //分
    cal.get(Calendar.SECOND); //秒

    cal.set(new Date); //设置当前日历
    cal.set(Calendar.YEAR, 2014); //年
    cal.set(Calendar.MONTH, 7); //月(月份0代表1月)
    cal.set(Calendar.DATE, 11); //日
    cal.set(Calendar.HOUR_OF_DAY, 15); //时
    cal.set(Calendar.MINUTE, 33); //分
    cal.set(Calendar.SECOND, 32); //秒

    cal.add(Calendar.YEAR, 1); //年
    cal.add(Calendar.MONTH, 1); //月
    cal.add(Calendar.DATE, 1); //日
    cal.add(Calendar.HOUR_OF_DAY, -1); //时
    cal.add(Calendar.MINUTE, 1); //分
    cal.add(Calendar.SECOND, 1); //秒
    cal.add(Calendar.DATE, 7); //周

——————————————————————————————————————————————————————————————————————————
*******************************************************************************集合*************************************************************************************************
——————————————————————————————————————————————————————————————————————————

Collection (增删查,存储的是对象)
________________________________________________________________________________________________
  size()

  add(object o)
  addAll(Collection c) //把C集合中的所有元素加到原来集合

  remove(Object o) //移除第一次出现的此元素
  removeAll(Collection c) //移除所有出现在C集合中的元素,但是只移除一次
  clear()

  contains(Object o)
  containsAll(Collection c) //是否包含集合C中的所有元素

  iterator()

  toArray() //转化为数组

  equals(Object o) //很重要 collection.get(1).equals(collection.get(2));

  isEmpty()

 

 

  List(按索引进行增删查改,ArrayList,LinkedList,vector)

      add(int index, object o)
      addAll(int index, Collection c)


      get(int index)
      set(int index, object o)

      remove(int index)

      indexOf(Object o)
      lastIndexOf(Object o)

      subList(int fromIndex, int toIndex)

  Set(无序不重复集合,没有索引,hashset,treeset)
    方法和祖先类collection的方法一样

_________________________________________________________________________________________________________________

Map(hashmap,hashtable,treemap)
——————————————————————————————————————————————

    put (K key, V value) //增
    putAll(Map m)

    remove(Object key) //删除
    remove(Object key, Object value)

    get(Object key) //查

    Collection keys = map.keySet() //遍历所有键 用迭代器进行获取
    Collection value = map.values() //遍历所有值

    containsKey(Object key)
    containsValue(Object value)

    replace(K key, V value) //改
    replace(K key, V oldValue, V newValue)


    equals(Object o)
    size()
____________________________________________________________________________________________________________________________________________________________________

①Properties
——————————————————————————————
    Properties pro = new Properties();

    pro.setProperty("id", "1");
    pro.setProperty("name", "李昊宗");

    pro.store(new FileOutputStream("db.properties"), "db配置"); //写
——————————————————————————————

    Properties pro = new Properties();

    pro.load(new FileInputStream(".//db.properties"));


    String id = properties.getProperty("id");
    //读取
    String name = properties.getProperty("name");
    //读取
———————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————————
*******************************************************************************IO流*************************************************************************************************
——————————————————————————————————————————————————————————————————————————
文件操作(file)

  File fs = new File(".\\file") //初始化

  isDirectory()
  fs.isFile()

  fs.getAbsolutePath() //绝对路劲
  fs.getPath() //相对路劲
  fs.parent() //父目录

  fs.getName() //文件名(包含后缀名)

  fs.length() //文件大小

  fs.createNewFile(); //创建文件
  fs.mkdir(); //创建文件夹
  fs.mkdirs(); //创建路劲中的所有文件夹

  fs.delete(); //删除文件(夹),只能删空文件夹

  fs.renameTo(new File(".\\file\\3.txt")); //剪切并且重命名

  File[] files = fs.listFiles(); //返回当前路劲下,所有的子文件(夹)

——————————————————————————————————————————————————————————
IO
_________________________________________________________________________________________
抽象基类

  InputStream OutputStream
  Reader Writer

  共同方法: read() write() close() flush()
————————————————————————————————————————————————————
  注意:以下参数除了是路径,还可以是File类;
  例如:FileOutputStream os = new FileOutputStream(File fs,boolean append);
_______________________________________________________________________________________________________________________________

①字节流
————————————————————————————————————————————————

  FileInputStream is = new FileInputStream("D:\\testData.txt");

  FileOutputStream os = new FileOutputStream("D:\\testData.txt",boolean append);
_______________________________________________________________________________________________________________________

②字符流
—————————————————————————————————————————————————

  FileReader is = new FileReader("D:\\testData.txt");

  FileWriter os = new FileWriter("D:\\testData.txt",boolean append);
_______________________________________________________________________________________________________________________

③字节字符转化流
_______________________________________________________________________________________________________________________

  InputStreamReader is = new InputStreamReader(new FileInputStream(String path),"GBK");

  OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(String path,boolean append),"GBK");
_______________________________________________________________________________________________________________________

④缓冲流:本身不具IO功能,只是在别的流上加上缓冲提高效率,使用缓冲流能够更高效的读写信息。(推荐使用)
_______________________________________________________________________________________________________________________

新方法(读):readline() : //读取一行的数据,不包括结尾的换行符。
新方法(写):newLine(); //写出回车换行符

BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));
String line;
while ((tempString = reader.readLine()) != null) {
bw.write(line);
bw.newLine(); //写出回车换行符
}
bw.flush();
bw.close();
br.close();
________________________________________________________________________________________________________________________

1、字节缓冲流:在字节流上提高效率,参数为字节流
-------------------------------------------------------------------------------------------------------------

BufferedInputStream buf_In = new BufferedInputStream(new FileInputStream(String path));

BufferedOutputStream buf_Out = new BufferedOutputStream(new FileOutputStream(String path,boolean append) );

-------------------------------------------------------------------------------------------------------------

2、字符缓冲流:在字符流上提高效率,参数为字符流
-------------------------------------------------------------------------------------------------------------

BufferedReader buf_In = new BufferedReader(new FileReader(String path));

BufferedWriter buf_Out = new BufferedWriter(new FileWriter(String path,boolean append));

—————————————————————————————————————————————————

⑤对象流:在字节流的基础上,将对象序列化、反序列化

—————————————————————————————————————————————————
1、流只能序列化一个对象,若是多个对象,可以考虑先用list存储,然后存储list这个对象。
2、自定义的对象序列化需实现Serializable接口,并且传入的排序规则也要实现Serializable接口。

ObjectInputStream objIP = new ObjectInputStream(new FileInputStream(String path));

ObjectOutputStream objOP = new ObjectOutputStream(new FileOutputStream(String path,boolean append));

方法:read() write() 增加:writeObject() readObject()

—————————————————————————————————————————————————

⑥标准输入、输出流

—————————————————————————————————————————————————
System.in
System.out
System.err //和System.out功能一样,只是打印的是红色字体

1、使用System.setIn(), System.setOut(), System.setErr()方法设置新的系统流,输入、输出打印到文件中

OutputStream output = new FileOutputStream("c:\\data\\system.out.txt");
PrintStream printOut = new PrintStream(output);
System.setOut(printOut);

—————————————————————————————————————————————————

⑦内存流:用于处理临时存储信息的,程序结束,数据就从内存中消失。 (字符数组内存流雷同)

—————————————————————————————————————————————————
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(("hello").getBytes()); //向内存中写数据

byte[] bys = baos.toByteArray(); //可以直接读取为字节数组
System.out.println(new String(bys));

——————————————————————————————————————————————————————————————————————————
*******************************************************************************线程*************************************************************************************************
——————————————————————————————————————————————————————————————————————————

①多线程的实现
—————————————————————————————————————————————————————
1、继承Thread,重写Run()。
2、实现Runnable接口,重写Run() ,然后new thread()。
注:推荐使用匿名内部类(Runnable)。
—————————————————————————————————————————————————————

②start()和run()
—————————————————————————————————————————————————————
1、start会开辟一个线程,线程的任务就是run方法的逻辑。
2、run只是线程的一个方法,别处调用不会开辟线程。
—————————————————————————————————————————————————————

③Thread.currentThread():获取当前线程,一般用于重写Run()方法中,因为Run()中不能用this。

Thread t1= new Thread(Runnable Runner);

Thread.currentThread()

// 等同于 t1,所以t1有的方法,它都有,例如:

—————————————————————————————————————————————————

getName()

yield() //线程让步,从运行状态切换到了就绪状态

sleep() //线程休眠

t1.setDaemon(true) //设置为后台进程,调用start之前,才能生效

getPriority();
t1.setPriority(10) //设置优先级为10,,调用start之前,才能生效
//0表示最高优先级,1表示最低优先级,5是默认值
join()

stop() //在线程的run方法中,可以用return停止线程

.............................

注:后台线程:一个隐藏起来的, 一直默默地在后面执行的线程, 直到程序结束
如果所有的前台线程都死了, 后台线程会自动死亡

—————————————————————————————————————————————————————

④线程合并
—————————————————————————————————————————————————————

在线程A中,运行线程B。

1、如果B没有使用join方法:类似主线程(main)中开了一个线程,线程互不影响,抢夺CPU.
2、如果B使用join方法:那么B是线程A的一部分,A会等B执行完,才会继续执行。

Thread t1 = new Thread(Runnable Runner);
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
t1.start();
t1.join();
}
});
t2.start();
—————————————————————————————————————————————————————

⑤线程的生命周期
—————————————————————————————————————————————————————

new : 新生状态: 线程被实例化, 但是还没有开始执行(start)


runnable: 就绪状态: 已经执行过start, 线程已经启动了, 只是没有抢到CPU时间片


running: 运行状态: 抢到了CPU时间片

blocked: 阻塞状态: 阻塞中的线程, 是不能参数时间片的抢夺的 (不能被线程调度器调度)


dead: 死亡状态: 线程终止


①正常死亡 : run方法中的代码执行结束

(用return可以代码中途退出)
②非正常死亡 : 强制使用stop方法停止这个线程

—————————————————————————————————————————————————————

⑥锁
—————————————————————————————————————————————————————
1、同步代码块(锁名必须相同)

synchronized(“”){

}

3、同步方法

①如果是静态方法, 这个锁是类锁, 共用同一把锁
②如果是非静态方法, 这个锁是对象锁, 可能会公用同一把锁
public class object {
public static synchronized void method(){
System.out.println("我是第一种类锁");
}

2、同步锁 (必须是静态)

private static Lock lock = new ReentrantLock();


lock.lock();
.....
.....
lock.unlock();
—————————————————————————————————————————————————————

⑦线程阻塞与激活
—————————————————————————————————————————————————————
一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。

1、wait() //会释放当前的锁,然后让出CPU,进入阻塞状态。
2、notify() //激活一个等待状态的线程
3、notifyAll() //激活多个等待状态的线程

synchronized (""){
while(true){
while(now < need){
"".wait();
}
while(now > nees){
"".notifyAll(); //唤醒“”锁所有的等待线程
System.out.println("我被唤醒了!");
}
}

}
—————————————————————————————————————————————————————

以上是关于1-java的主要内容,如果未能解决你的问题,请参考以下文章

有那些关于IT的书籍?

java 都有哪些jar包直接提供了获得md5值的方法?

编程语言排行榜是怎样的?