• class是关键字,用于定义类,一个类只能有一个主函数;修饰类的关键字:public,final,private(仅内部类);
  • 每个对象都有自己的字符串表达形式;
  • 关键字所有字母都是小写;
  • 打印双引号:引号前加;\表示打印斜杠;
  • 一个汉字占两个字节,可用char类型存储;
  • &、|、^可以是关系运算符,不仅是位运算;java时&&左右两边只能跟真假,c时左右两边还可跟数字
  • &两边都运算,&&左false时跳过右边(与c语言相同);
  • 正常运算加减乘除不如位运算效率高,代码参加其他博客;
  • 通过位运算交换a,b: b=b^a;a=b^a;b=b^a;
  • java函数前加 public(可不写) static;函数重载:函数名可同,但参数类型或参数个数不同;
  • 定义数组:int a[]= new int[3];int a[]={1,2}注意这里中括号加数字会出错;java可以调用a[b],b是变量;int []a,b[]中a一维,b二维;可变参数:可以通过函数传形参(int... arr)直接将f(1,3,4)内元素转为数组传进函数,注意可变参数一定要定义在形参列表最后边;
  • java中null小写,可给数组、对象赋值;
  • java二维数组a[][]定义时第二个[]可以空,但初始化必须双层{},且a[0]和a[1]长度根据初始化进行内存分配,可以不同;java中String首字母大写;
  • StringBuffer sb=new StringBuffer()相当于容器,append是尾加,print(sb)是输出所有;
  • java可以通过数组名直接赋值;
  • 函数传对象运行结束后,可以改变对象的属性和方法;函数只能在类里面定义;
  • 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式;隐藏属性,提供公共方法对其访问;private权限修饰符,仅在本类中有效,可以通过成员函数(setData/getData)访问、返回,构造函数私有化后不能在类外初始化,可以在类内初始化new;
  • 构造函数名与类名相同,对象一建立就会调用对应构造函数,用于初始化;若未自定义,系统会默认创建空构造函数;构造函数前不能加void等返回声明;构造函数内可以调用成员函数,可以调用其他构造函数,调用方法this("初始化值");
  • 构造代码块是给所有对象统一初始化,不管构造函数重载类型;优于构造函数执行,不用函数名,直接在{}内写,调用直接new 名();若是静态代码块则只在第一次用类(new类或者调用类的静态方法)时执行一次,类初始化,若有多个则从上往下读,优先于主函数,优先于空间开辟,优先于对象;
  • 0.将类文件加载到内存空间1.静态代码块;2.开辟堆内存空间分配地址,成员变量初始化,显示初始化;3.代码块内容初始化;4.构造函数初始化;5.栈内存对象指向堆内存地址;
  • 类里面的变量是成员变量,函数里的变量的局部变量;成员变量存在于堆内存中,局部变量存于栈内存中,方法执行完释放;
  • this解决同名情况,引用的是对象,区分成员变量和局部变量同名情况;
  • this用于类的成员函数内,this.name代表对象的成员变量name;在以name为形参的成员函数中,this.name=name给成员变量赋值,函数传入的参数;也用于成员函数的互相调用;凡是本类功能内部使用了本类对象,都用this表示;
  • this用于构造函数内,引用的是属于该构造函数的对象;this.name=name给(调用此重载构造函数的对象)成员变量赋值,创建对象时括号内对应内容;
  • this用于构造函数内,还可调用其他构造函数,调用后this指代发生变化,转为指代新构造对象;调用方法this("初始化值"),只能定义在构造函数第一行,因为初始化要先执行;
  • static变量/函数可直接用类名直接调用(当然用对象也可以,除非构造函数私有化),类名.静态成员;随着类的加载而加载,随着类的消失而消失,称为类变量,类变量存于方法区,实例变量存于堆内存;静态方法只能访问静态成员,可以传参数,非静态方法可以访问静态成员;静态方法中不可以用this,可以用this调用静态方法;当功能中访问类中静态成员、不访问类中成员时,定义为静态函数;
  • public代表函数的访问权限是最大的,如果类被public修饰,默认构造函数也被public修饰;
  • main不是关键字,但可以被jvm识别,主函数可重载,但jvm只能识别以字符串数组为参数的主函数,字符串数组长度为0,要传参数要run as -> run configuration->Arguments输入,或者通过一个类的main中以成员函数形式,调用另一个类中的main;
  • api:application programming interface应用程序接口;生成api文档的类必须public
  • 单例设计模式:1.构造函数私有化;2.本类内创建私有静态对象;3.创建静态方法返回静态对象;4.通过这个静态方法调用;可保证一个类在内存中只有一个对象;分为饿汉式、懒汉式,区分于类内对象是否直接new;饿汉一进内存就创建好了私有对象,安全简单;懒汉是延迟加载,在调用方法时才建立私有对象,要synchronized,一个程序进入时关闭通道不让其他进入,保证只创建一个对象不bug,但会影响效率,可以if(空){ synchronized(类名.class即该类所属的字节码对象){if(空)初始化} }解决多线程安全隐患,恶汉没安全隐患;
  • extends继承,复用性;java中类间不支持多继承(一个继承多个,不同父类可能有同名同参同返方法,会混。解决办法:内部类,创建一个类,类内创建多个内部类分别继承,创建对象写函数调用即可),支持多层继承、多实现;接口与接口间支持多继承;子类构造函数第一行默认加super()空参数,因为子类对象建立时,要查看父类对象怎么初始化的,手动加super(参数)或者this(参数)后默认的super()会失效而非追加;子类每个构造函数this(参)和super(参)只能出现一个,子类中一定会有一个构造函数存在super(),否则会嵌套循环;继承同方法子覆盖父,静态只能覆盖静态,子覆盖父必须子权限>=父;继承有复写和扩展功能;
  • super在子类调用父类同方法(名同、返回同、参数同)成员变量、函数,与this的使用方法基本一致;super.成员变量;
  • final可以修饰类、函数、变量,最终类不可被继承,最终函数不可被复写,最终变量成为常量,只可被赋值一次;
  • abstract抽象方法(大括号改为分号)必须存放在抽象类中,抽象类中可以存在非抽象方法,可以不存在抽象方法;抽象类不可new对象;抽象类方法要被使用,子类必须复写所有抽象方法,否则子类还是抽象类;模板方法:抽象类中,确定的方法调用不确定的方法,确定final,不确定abstract,由子类完成,这个父类就是模板;
  • interface关键字(非修饰符)用于定义接口;当抽象类中所有方法抽象,则可用接口形式表示;常量修饰符:public static(能加static的接口一定是内部接口) final;方法修饰符:public,abstract,忘记写系统会默认添加;接口不用extends,而用implements,称为“实现”;有着抽象类的特点;java支持多实现,但不允许同名不同参不同返,一个类可以既继承又多实现;接口之间可以继承;接口是对外暴露的规则;基本功能继承,扩展功能实现;
  • 多态:事物存在的多种形态;父类的引用指向子类对象;用于函数同,参数为不同子类对象,改为父类对象,这样父 t=new 子();f(t)调用;提高程序扩展性,但只能引用访问父类中的父类成员;可以通过强制转换,让向上转型后的对象强制转换成子类对象:子 x=(子) t;只有初始化子类的父对象才能强制成子对象;多态自始至终都是子类发生着变化;通过if(t instanseof 子)判断一个对象是否为一个类的实例;多态只能调用父类中存在的成员函数,子类有相同非静态成员函数会覆盖(静态方法不覆盖),同名成员变量不覆盖;
  • 内部类:一个类定义在另一个类里面;好处是内部类可以直接访问外部类成员(即使private,方法:外.this.成员;若无同名变量系统会默认加);外部类访问内部类内容要在成员函数中建立对象;建立内部类对象:外.内 t=new 外().new 内();只有内部类可以用private修饰;静态内部类只可以访问外部类静态成员;其他类访问内部类静态成员:外.内.方法;其他类访问内部类非静态成员:new 外.内().方法;当内部类定义了静态成员,该内部类必须静态;内部类定义在局部(外部类方法)时,不可被成员修饰符修饰,可以直接访问外部类成员,要访问函数局部变量必须给其加final;匿名内部类必须继承类或实现接口:new 父(){}.方法();
  • 异常:try{需要检测代码} catch(异常类Exception 异常对象名){检测到错误后处理异常} finally(){一定会执行的语句,即使在catch中已经return,通常用于关闭资源,仅已经System.exit(0)不执行} catch可自动接收try发送的异常对象(无错误则不执行),可写进主函数,异常对象的方法可以通过java long中Throwable中查看,注意返回值,常用getMessage;jvm默认异常处理机制是调用其中printStackTrace方法,打印异常堆栈处理信息;自定义异常则定义继承于Exception的类,类构造函数内用super可实现getMessage();调用函数上throws 类名(声明异常,必须,不然报错,除非是RuntimeException类下的),函数内手动抛出语句throw new 类名("",实参);这样catch中getValue()拿到实参;
  • throws关键字用在成员函数的参数后void f() throws Exception{}抛出问题(或者抛出具体多个异常,多catch内传值具体异常,从而多异常处理),不处理编译不通过,除非主函数也抛;主函数throws是抛给jvm处理;
  • throws函数上,throw函数内;throws后面跟异常类,多个用逗号隔开;throw跟异常对象;
  • 异常体系:Throwable-Exception-RuntimeException;异常体系所有类和创建的对象都具有可抛型,可用throw和throws修饰,只有异常体系可以;当函数内有throw抛出异常对象,未try,必须函数上声明throws,除非RuntimeException;编译时异常,若没抛、没try编译失败;运行时异常建议让程序停止;如果父类或接口没有异常抛出时,子类覆盖出现异常,只能try不能抛;
  • 包:对类文件分类管理,多层命名空间;包与包之间访问,被访问的包中类和成员要public;不同包中子类可以访问父类被protected访问的成员;包与包间可使用的权限只有public和protected;import导入的是类,简化类名书写,把类名改为*相当于导入该包内所有类(便建议);
  • 进程:正在进行的程序,每个进程都有执行顺序,即执行路径、控制单元;线程:进程中的一个独立控制单元,控制着进程的执行,一个进程中至少一个线程。创建线程第一种方法是声明Thread子类,复写run放方法,调用start方法来启动线程同时调用run方法(直接调用run达不到启动线程的效果);多线程都获取CPU使用权,但每一时刻只能有一个线程运行(多核除外),因此可能出现数据共享错误,类似于双胞胎受精卵,解决办法:同步代码块synchronized(对象或this){需要同步的代码}(对多条操作共享数据的语句,只能让一个线程都执行完,执行过程中其他线程不执行),也可以在函数上synchronized修饰,转为同步函数,将同步代码块封装到另一个同步函数,this.同步函数调用;同步函数的锁(锁就是对应同步代码块的参数)是this,静态同步函数的锁:类名.class;Thread用于描述线程,通过run存储线程要运行的代码;死锁是同步中嵌套同步;线程五种状态:创建start、运行、堵塞(有运行资格,没执行权)、冻结sleep/wait/notify、消亡;
  • 线程默认名称Thread-*,自定义通过构造函数内super;创建线程第二种方法:声明类实现Runnable接口(只有一个run方法),将该类通过参数传给Thread构造函数即new Thread(该类),通过Thread类创建线程对象,start;第二种方法常用,可避免单继承局限性;wait,notify,notifyAll都使用在同步中,因为要对持有监视器(锁)的同步操作,只有同步有锁;等待和唤醒必须是同一个锁,故这些操作线程的方法要定义在Object类中,锁可以是任意对象,故任意对象的调用定义在Object类中;停止线程通过控制循环,使run方法结束;冻结状态时通过interrupt()方法强制恢复到运行状态再停止线程;所有前台线程结束后后台线程自动结束;守护线程是后台线程;线程.join()抢夺CPU执行权,该线程执行完其他线程再开始执行(包括主线程);
  • String s1="abc",s2=new String("abc"),s3="abc";s是类类型变量,"abc"是对象;字符串一旦被初始化就不能被改变,s1再赋值只是指向变了;StringBuffer可以改变字符串;String类复写了Object类中equals()方法,判断字符串内容是否同;s1内存中有一个对象,s2内存中两个对象,因为构造函数传值;s1!=s2;s1==s3因为"abc"内存中已存在不会再开辟内存空间;数组的length没有括号是属性,字符串有括号是方法;indexOf(str,idx) 返回的是下标值,不是从idx开始数,没找到-1; lastIndexof()返回的是下标,不是从后往前数;""是对象用isEmpty()判断,null是指向空;String[] arr=s.split(",");把s按逗号切割成多块存到字符串数组;substring(,)含头不含尾,二参不是数量;trim删首尾空格;java中比较字典序不可直接大于小于,要用compareTo();
  • StringBuffer是一个容器,对字符串内容增append删delete改insert,replace(idx,idx,str),reverse查toString,可变长度,一个sb可存多种数据类型;StringBuffer线程同步,StringBuilder线程不同步;因为没锁,StringBuilder效率更高;
  • Integer.toString(idx);Integer.parseInt(str);Integer.parseInt(str,idx进制);Integer.toBinaryString(idx);Hex,Octal;Integer类型可直接运算,先拆箱成int类型运算再装箱成Integer类型;在Byte范围内(-128~127),Integer新特性(如Integer a=7;)若数值已存在,不会开辟新空间;
  • 集合类存储对象,集合长度可变,可存储不同类型对象,存的是地址;Iterator it=col.Iterator();it.hasNext();it.next();List是有序的,可重复,该集合体系由索引,特有方法是操作角标增add(idx,elem),addAll删remove改set查next(),previous,get,subList,listIterator是Iterator子接口,多了add和set方法;ArrayList底层数据结构是数组,LinkedList底层数据结构是头尾指针链表(removeFirst()返回删除元素),可以做成栈和链表,Vector底层数组,线程同步,浪费空间,被ArrayList替代;Enumeration枚举被Iterator取代;List的contains,remove是判断List中元素或对象中的equals方法,自定义对象要写equals方法;Collections.sort(list,cmp);可以用max,binarySearch,fill,replaceAll;Array.asList(arr)可以把数组转为List,转后不能增删,因为数组长度固定,如果数组中的元素都是对象,这些元素直接转为集合元素,如果数组中的元素都是基本数据类型,该数组转为集合元素;List可以通过toArray转数组;
  • Set是无序的(存入取出顺序不一致),不重复;HashSet底层是哈希表,线程不同步;存对象时候要在对象的类中写equals和hashCode方法,这样Set才能判断自动去重(先判断hashCode是否相同,再判断equals);TreeSet虽存入取出顺序不一致,但内部会根据字典序自动排序,内部存储BST,c++用的set跟TreeSet比较像;第一种排序方法:元素自身具有可比性,实现Comparable接口强制让自定义对象具有比较性,只有一个compareTo方法,直接只返回1就是按时间顺序,直接只返回0就是只能存一个;第二种排序方法:元素自身不具有可比性,让集合自身具有可比性;定义比较器(实现Comparator接口,覆盖compare(obj1,obj2)),将其对象作为参数(传Collection.reverseOrder()可强行逆转自然顺序)传入TreeSet构造函数;两种排序方法都存在时以比较器为主;
  • 泛型:类型安全机制;<>用来接收类型;ArrayList<String> t=new ArrayList<String>();可以<?>作为形参穿任何类型的ArrayList;解决运行时候问题ClassCastException转到编译时期,更安全,避免强制转换问题;当类中要操作的引用数据类型不确定时,早期定义Object完成扩展,现在用泛型,类名后<自定义通用数据类型名>,内部函数传参用这个名定义;泛型类的对象要操作的数据类型确定后,这种数据类型就固定了(待议,我自己用时候可以传多类型);泛型函数把<>用在修饰符后返回值前,可以传泛型参,可以让一个对象内传多种数据类型;静态方法不可以访问类上定义的泛型;‘?’通配符;泛型上限定:? extands E可以接受E类型和E子类型;泛型下限定:? super E;
  • map的put方法会返回被覆盖的值;Map<,> mp=new HashMap<,>();第一种取出方式:通过Iterator<> it=mp.keySet().iterator();用it.next()得到所有键,用map的get得到对应value,其中mp.keySet()是Set集合对象存key;第二种取出方式:Set<Map.Entray<,>> s=mp.entraySet();映射关系取出存入set;这样可以通过it.getKey()和it.getValue()直接获得键值;Entry是Map接口中的一个内部接口(能加static的接口一定是内部接口);
    子类:Hashtable,HashMap,TreeMap;Hashtable不可以存入null键null值,线程同步;HashMap可存null键null值,线程非同步;TreeMap线程不同步,可对键排序;Set底层使用Map集合;
  • for(数据类型 变量名:被便利集合或数组){print(变量名);}用于遍历集合只能获取,迭代器还可以remove,ListIterator还可以增删改查;
  • System类中方法和属性都是静态的;out标准输出,in标准输入,默认键盘;RunTime类无构造函数,通过getRuntime()返回对象,是单例设计,exec方法能执行任何文件,destory只能杀exec启动的文件;java.text中的SimpleDateFormat类可以对Date对象进行格式化成字符串;Calender类可以获取int型时间;
  • io流,流按照操作数据分为字节流(抽象基类InputStream,OutputStream)和字符流(抽象基类Reader,Writer,FileReader,FileWriter);按流向分为输入流输出流;字符流基于字节流;io流会抛出异常,处理异常类似于饿汉式,在finally判断指针非空时关闭文件;
  • FileWriter创建文件,若该路径已存在同名文件会完全覆盖(除非构造函数加true);write方法将字符串写入流中,通过flush方法刷新缓冲数据,将数据刷到目标文件;未关流多次write会追加;close关闭会自动刷新流;Windows回车符是由‘rn’双字符表示,Linux中仅'n';FileReader的read会自动往下读,读到末尾会返回-1;BufferedWriter缓冲技术,提高字符写入流速度,readLine方法不返回回车符;LineNumberReader类可以获取、设置行号;
  • 装饰设计模式:对已有对象进行功能加强时,已有对象传入新类;
  • 字节流操作不需要刷新,无缓存数据,但写完要关;
  • 正则表达式:符合一定规则的表达式。用于操作字符串。大括号是次数。通过String的matches方法匹配(其实是Pattern和Matcher对象完成的,只是封装后功能单一),split方法切割,多空格切割" +",split返回数组,切割"."符号要用"\.","."代表任意字符。叠词"(.)\1+"其中括号是组,1是第一个组,是转义。替换:replaceAll替换符合规则为字符串。获取:取出符合规则的子串。
    Pattern正则表达式的编译表示,compile(regex)方法将规则封装成对象。 Matcher让正则对象和要作用的字符串相关联,获取匹配器对象,find()讲规则作用到字符串上,并进行符合规则子串查找,group获取匹配后结果。
  • lambda表达式:匿名函数。对接口的简单实现。并不是所有接口都可以用lambda实现,要求接口中定义的抽象方法只有一个(Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法)。修饰函数式方法。()表述参数列表,{}描述方法体,->运算符,读作goes to,加载参数列表和方法体间。
    接口名 标识符 = (参数列表) ->{方法体,return可不写表示无返回值};调用是 标识符.接口方法(实参如a:3);
  • socket是为网络编程提供的一种机制。网络通信其实就是socket间通信,数据在两个socket间通过IO传输。