- 重写equals和hashcode
- hashset add对象数据时,先比较hashcode是否相同,如果hashcode不同的话,直接写进去,如果相同的话会比较equals方法
- 在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法
- 接口
- 属性默认public static final,方法默认public abstract
- 抽象类
- 作为父类:没有抽象方法,可以有成员变量和成员方法,可以定义子类共有的方法给子类做默认实现,提高代码复用性
- 作为抽象类:有抽象方法,规定子类必须重写的方法
- 构造方法
- 创建子类对象时,默认调用父类无参构造
- 可以通过super(参数),访问父类的有参构造
- 重载(Overload)和重写(Override)的区别
- 重载:一个类中,同名的方法有不同的参数列表,与返回值无关,编译时的多态性
- 重写:子类继承父类方法,有相同的参数列表,有兼容的返回类型,运行时的多态性
- 多态
- 接口或父类的引用指向实现类或子类对象
- 接口或父类不能调用实现类或子类独有的方法,如要调用需向下转型(强转为子类对象)
- 流
- 字节流byte
- fileinputstream/fileoutputstream
- 高效:bufferinputsteam/bufferoutputstream
- 转换流---字节转字符
- inputstreamreader/outputstreamwriter
- 读写二进制文件datainputstream/dataouputstream
- 字符流char/string
- filereader/filewriter
- 高效:bufferedreader/bufferedwriter
- jvm
- exception
- 体系
- object
- throwable
- error程序无法解决的异常
- exception
- checked exception编译时期异常
- runtion exception
- try-cath-finally中存在return,则先执行finally释放资源,再return
- throw和throws
- throws声明异常,在方法参数后面,可以声明多个异常
- throw 抛出异常,在方法体内,抛出一个异常
- 异常链
- 调用MyException2的有参构造函数,把MyException1当作cause传递进去
- string、stringbuilder、stringbuffer
- string
- Immutable不可变的
- 没有大量的字符串操作的业务场景
- stringbuilder
- mutable可变的,线程不安全
- 在单线程,有大量的字符串操作的业务场景
- stringbuffer
- mutable可变的,线程安全
- 在多线程,有大量的字符串操作的业务场景
- 集合
- Collection单列集合add(Object)/remove(Object)/clear/isEmpty/size/contain()/sort()/shuffle()
- List不唯一,有序add(int index, Object)/remove(int index)/get(int index)
- ArrayList底层动态数组,适合查
- LinkedList底层链表,适合增删改
- Vector
- 遍历
- 迭代器
- Iteractor it = c.iterator();
- while(it.hasNext()) {
- System.out.println(it.next());
- }
- list.stream().forEach(System.out::println);
- Set唯一,无序
- HashSet底层哈希算法
- TreeSet底层二叉树,可以排序
- Map双列集合keySet()/entry entrySet()/Collection values()
- HashMap
- TreeMap
- HashTable
- 排序
- Comparable内比较器
- 基本数据类型/对象已实现Comparable接口,重写compareTo,返回值是int(1,0,-1)
- Comparator外比较器
- 对象未实现Comparable接口/比较方式不适合当前场景,重写compare,返回值是int(1,0,-1)
- 数组转集合
- Array.asList(arr/a,b,c...);
- 泛型
- 定义:参数化类型的一种语法
- 集合使用E,K,V等泛型来定义元素类型
- 创建集合时传输类型给泛型,来指定集合元素类型,防止存入错误类型的值
- 避免了使用object,取值时强转出错的问题
- 泛型类/接口
- public class/interface mydata<A> {A data;}
- 通配符(?)
- 在不确定方法的参数类型时,使用通配符继承其超类/父类,以确定一个参数类型范围
- List<? extends HasWord>

- 如果你想从一个数据类型里获取数据,使用 ? extends 通配符,add()方法受限,不能确定实例化对象类型
- List<? super HasWord>

- 如果你想把对象写入一个数据结构里,使用 ? super 通配符,get()方法受限,因为list存放的对象类型不确定
- 内部类
- 成员、静态、局部(方法中)
- 匿名内部类(方法中)
- new test(){重写父类方法}.equals(),相当于new一个test的实现类的对象,可在对象后直接调方法
- Collections.sort(list, comparingInt(Person::getAge).thenComparing(Person::getName));
- lambda
- Collections.sort(list, (o1, o2) -> {int result = o1.getAge()-o2.getAge(); return result==0? o1.getName().compareTo(o2.getName()): result;});
- 枚举enum test{male,female}
- 序列化/反序列化
- 序列化:将对象的状态写入特定流中的过程
- 反序列:将特定流中获取的数据构建为对象的过程
- 前提
- 实现serializable接口,标记实现类可以被序列化
- 创建序列化流ObjectOutputStream/ObjectInputStream
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.data"));
- 线程
- 线程的生命周期

- Thread 是实现的Runnable接口
- 因为java单继承、多实现,因此实现Runnable,预留继承位置更好
- start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,
- 当你直接调用run()方法的时候,只会是在原来的线程中调用, 没有新的线程启动,start()方法才会启动新线程
- 在执行完任务之后无法获取执行结果。
- 如果需要返回线程执行结果
- 使用Callable创建线程,使用Future接口的get()方法等待Callable结束获取结果
- CyclicBarrier和CountDownLatch
- 都可以用来让一组线程等待其它线程。CountdownLatch不能重新使用
- 网络协议
- 应用层:http/ftp/tftp/smtp/snmp/dns
- 传输层:基于tcp/udp协议的socket网络通信
- tcp:面向连接,可靠、双向通信,速度相对慢,三次握手方式验证
- udp:无连接,不可靠的,速度快,适合视频,通话等能够容忍部分数据丢失的场景
- 网络层:icmp/igmp/ip/arp/rarp
- 数据链路层/物理层:底层网络定义协议
- 可变长度形参
- public void test1(String ... books){}
|
|