文档章节

java琐碎知识

Scofieldxs
 Scofieldxs
发布于 2015/10/09 20:49
字数 1983
阅读 196
收藏 4
点赞 0
评论 0

###1.java二维数组

java实际上并没有二维数组的概念,二维数组第一个量实际上每一个元素都是另一个int数组的引用

实际的解释

因此访问顺序很重要,若是按行访问比较快,按列访问很慢

###2.java国际化(I18n) 主要是两个类:

  • java.util.Locale:提供静态常量

      Locale locale = Locale.CHINA;
      System.out.println(locale.getCountry());
      System.out.println(locale.getDisplayLanguage());
      //out:   CN    中文
    
  • ResourceBundle

###3.异常

父类:java.lang.Throwable

分为两大类:

  • Error:无法处理的异常,jvm会停止工作
  • Exception
    • checked Exception:强制程序员必须进行捕获
      • IOExeption
      • SQLException
    • unchecked Exception:=RuntimeException,不要求必须进行捕获
      • NullPointerException
      • IndexOutOfBoundsException

继承图:

  • throws:出现在方法声明中,表示可能会抛出的异常
  • throw:出现在方法体中,抛出异常

异常的最佳实践

  • 对可恢复的错误使用受检查异常,对变成错误使用非受检查异常
  • finally中释放资源
  • 受检查异常转为运行时异常:DataAccessException

###4.编码格式 ASCII unicode utf-8关系

  • 最早出现的是ASCII码,一个字节,只支持大小写字母和常用字符

  • 为了支持各国文字出现了unicode,两个字节表示。

  • ASCII转unicode前面补8位0即可

  • 为了节省存储空间,出现了utf-8.变长编码,常用英文一个字节,汉字3个字节。

  • 文本编辑时使用unicode,硬盘存储时使用utf-8

  • 浏览网页时把动态unicode转成utf-8显示

###5.string string存储在字符串常量池中,数组形式存储

向substring,split这样的方法,还是指向原字符数组,

如果substring拿了一小部分长时间保存的话,原string是无法GC的,因此最好new String()一个

###6.浅拷贝vs深拷贝

  • 等号赋值只是多了一个引用,指向同一块地址:

      Employee one = new Employee(100, new Date());
      Employee two = one;
      System.out.println(two.equals(one));//true
    
  • Object.clone()方法只是进行浅拷贝,对象中的reference拷贝的还只是引用,因此需要重写clone进行深拷贝

      public class Employee implements Cloneable {
    
          public Object clone() throws CloneNotSupportedException {
              Employee cloned = (Employee) super.clone();
              cloned.date = (Date) date.clone();
              return cloned;
          }
      }
    

必须实现Cloneable接口才行,否则调用clone()时会报 CloneNotSupportedException

  • clone时这样写:

    Employee two = (Employee) one.clone();

###7.native method 表示该方法是用其他语言实现的

常用于与操作系统交互

###8.= 和+= byte a = 127; byte b = 127; b += a;//b转换为int型 b = b + a;//报错:b为byte,b+a为int,无法赋值

###9.equals() and hashcode() 判断两个对象是否相等的规则:

  1. hashcode是否相等
  2. 不相等->对象不相等
  3. 相等->equals判断
  4. equals相等->相等
  5. equals不相等->不相等

原因:hashcode快,先用hashcode判断

equals相等---->hashcode相等 equals不同---->hashcode不一定(可能有哈希冲突)

###10.反射 动态语言:程序运行时能够改变其结构:比如新的函数被引进,旧的函数被删除

####定义:

  • 可以在运行时使用编译期间未知的类,只需要知道它的类名
  • 对于一个已经加载的类,能够知道和调用这个类的所有属性和方法

####通过反射创建对象,调用对象方法,访问成员变量:

1.class对象的newInstance()方法(要求有默认构造器)

2.获取指定的Constructor对象,再newInstance()(可以指定构造器)

目标类Myclass:

	public class Myclass {

	    private int key;

	    public int getKey() {
	        return key;
	    }

	    public void setKey(int key) {
	        this.key = key;
	    }

	}

反射

	public static void main(String[] args) {
        try {
            Class clazz=Class.forName("Myclass");
            //init
            Object object = clazz.newInstance();
            //Myclass myclass=(Myclass)clazz.newInstance();

            //setMethod
            Method setMethod=clazz.getMethod("setKey", int.class);
            setMethod.invoke(object, new Integer(10));

            //getMethod
            Method getMethod=clazz.getMethod("getKey");
            Object result=getMethod.invoke(object);

            System.out.println(result);

            //field
            Myclass myclass=(Myclass)object;
            Field field=Myclass.class.getDeclaredField("key");
            field.setAccessible(true);
            field.setInt(myclass, 20);
            int key=field.getInt(myclass);
            System.out.println(key);

        }catch (Exception e){

        }

    }

####spring中的应用 spring通过反射机制来串讲对象,类似于工厂模式

###11.cglib

代码生成类库,在运行时动态生成某个类的子类

####核心类

  • Enhancer:主要的增强类
  • MethodInterceptor:方法拦截器
  • MethodProxy:代理类

####使用:

  1. 目标类Person:

     public class Person {
    
         public void sayHi(){
             System.out.println("hi");
         }
     }
    
  2. cglib:

     public static void main(String[] args) {
         final Person person=new Person();
    
         Enhancer enhancer=new Enhancer();
         enhancer.setSuperclass(Person.class);
    
         enhancer.setCallback(new MethodInterceptor() {
             public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                 System.out.println("before");
                 Object obj = method.invoke(person);
    
                 System.out.println("after");
    
                 return obj;
    
             }
         });
    
         Person p=(Person) enhancer.create();
    
         p.sayHi();
     }
    

###12.设计模式原则

  • 多用组合,少用继承

  • 对扩展开放,对修改关闭

  • 装饰者模式

###13.xml解析方式

####1.DOM

将xml整体当做一颗树处理;需要全部加载进内存,占用内存;适合小文件

####2.SAX

采用流解析的技术,解决占用资源大的问题;解析过程复杂;适合大文件

###14.IO 在java.io包下

主要包括四部分:

  • 字节操作:InputStream,OutputStream
  • 字符操作:Writer,Reader
  • 磁盘操作:FIle
  • 网络操作:Socket

标准访问文件方式:

写入:用户程序调用write()接口将数据从用户地址空间复制到内核地址空间的缓存中,何时写到磁盘中由操作系统决定。

###15.序列化

指的是将一个对象转化成一串二进制表示的字节数组

必须继承java.io.Serializable接口

基本操作:

	File file=new File("person.out");

    ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(file));
    Person person=new Person("alis",11);
    out.writeObject(person);
    out.close();

    ObjectInputStream in=new ObjectInputStream(new FileInputStream(file));
    Object obj=in.readObject();
    Person newPerson=(Person)obj;
    System.out.println(newPerson);

静态变量无法序列化

序列化中的数据可以加密

###16.NIO

表示块IO,比原来的流IO效率高。

将最耗时的IO操作(填充和提取缓冲块)转移回操作系统,因此更快

####通道(Channel)和缓冲(Buffer)

对IO包中流的模拟,所有数据必须通过channel对象

通过通道的数据必须先放到Buffer

缓冲区提供了对数据的结构化访问

####读文件

三个步骤:

  • 从FileInputStream获取Channel
  • 创建Buffer
  • 将数据从Channel读到buffer

示例:

	public static void main(String[] args) throws IOException {

        FileInputStream in = new FileInputStream("read.txt");

        FileChannel channel = in.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(2);

        channel.read(buffer);

        System.out.println(Arrays.toString(buffer.array()));
    }

###17.final

####修饰类 这个类不能被继承

####修饰方法 防止该方法在子类中被覆盖

####修饰变量

  • 基本类型变量:初始化后不能改变
  • 引用类型变量:初始化后不能指向另一个对象

如果在编译期就能确切知道final变量的值,会被当做常量使用:

	final String b="hello";
	String c=b+2;
	String a="hello2"
	System.out.println((a==c));
	//true

###18.hashMap

####两个控制量

  • capacity:指bucket的大小
  • load factor:超载因子,指能放多少的比例

当entries中的数量多于capacity*loadfactor时,capacity扩充为原来2倍

####put()实现

  1. 对key的hashcode()做hash,然后计算index
  2. 如果没有碰撞,放到bucket里
  3. 如果有碰撞,以链表形式连在后面
  4. 如果链表过长,替换成红黑树
  5. 如果节点存在,替换old value
  6. 如果bucket超过限定,容量扩充

####get()实现

  1. 计算key的hashcode()的hash,获取index
  2. 如果第一个节点,直接命中
  3. 如果有冲突,通过key.equals(k)来查找

####hash计算下标index 算法:高16bit不变,低16bit和高16bit做异或

###19.代理proxy

java动态代理机制主类:java.lang.Proxy

代理对象和被代理对象必须实现同一个接口

重要类:

  • InvocationHandler:所有对动态代理对象的方法调用都会转到InvocationHandler接口的实现上

实现

  1. 定义一个目标接口:

     public interface TargetInterface {
    
         int getRandom(int key);
     }
    
  2. 定义接口的实现类

     public class Target implements  TargetInterface {
    
         public int getRandom(int key) {
             return new Random().nextInt(key);
         }
     }
    
  3. 定义一个InvocationHandler,代理的处理就放在这

     public class MyInvocationHandler implements InvocationHandler {
    
         private Object target;
    
         public MyInvocationHandler(Object object){
             this.target=object;
         }
    
         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
             System.out.println("proxy:"+proxy.getClass());
    
             System.out.println("method name:"+method.getName());
    
             System.out.println("args:"+Arrays.toString(args));
    
             return  method.invoke(target,args);
    
         }
     }
    
  4. 测试类:

     public static void main(String[] args) {
         InvocationHandler handler = new MyInvocationHandler(new Target());
    
         TargetInterface target = (TargetInterface) Proxy.newProxyInstance(TargetInterface.class.getClassLoader(),
                 new Class[]{TargetInterface.class}, handler);
    
         int result=target.getRandom(5);
         System.out.println("result:"+result);
    
     }
    

输出:

	proxy:class com.sun.proxy.$Proxy0
	method name:getRandom
	args:[5]
	result:3

应用

  1. spring 数据库事务管理

  2. Mock对象

  3. AOP拦截器

© 著作权归作者所有

共有 人打赏支持
Scofieldxs
粉丝 3
博文 24
码字总数 26524
作品 0
海淀
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Java学习---Java简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874 ⋅ 04/01 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

菜鸟网络java岗面经 已拿offer

牛客网上看了很多面经现在回馈一下牛友。 我是一个双非二本java。首先要谢谢我的一个李姓同学。他先去蚂蚁金服。这才告诉我们,双非二本只要技术好大公司也是不会拒绝你的。 还有就是牛客网上...

牛客网 ⋅ 05/10 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!

前几天写了一篇 Java 8 即将在 2019 年停止免费向企业提供更新的文章,企图迫使用户向更新一代的 Java 版本升级,但让人遗憾的是,小编今天收到了 Oracle Java 版本的升级推送,装完居然是 ...

Java技术栈 ⋅ 04/27 ⋅ 0

面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb ⋅ 05/12 ⋅ 0

JAVA工程师的工资真的很高吗?

Java工程师是个高薪的行业,让不少人羡慕不已,有很多人因为Java的高薪而转行。这也是近几年Java如此火热的原因之一。也正是因为Java如此之多,所以不少想要学习Java语言的人不禁产生一个疑问...

deng707273 ⋅ 04/09 ⋅ 0

Java 8 停止维护,Java 9 难产,IDEA 2018 发布,还有……

祝大家五一劳动节快乐,工作顺利! 又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,各种送书抽奖福利,各种面试题分享,各种最新动态资讯等。 - 5.1重磅活动 区块链免费送...

Java技术栈 ⋅ 04/30 ⋅ 0

Java序列化技术即将被废除!!!

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据...

Java技术栈 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 23分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 30分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 38分钟前 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 38分钟前 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 43分钟前 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 46分钟前 ⋅ 0

建造模式

《JAVA与模式》之建造模式

Cobbage ⋅ 今天 ⋅ 0

WePY框架开发的小程序如何在微信web开发者工具中运行起来

一、首先需要安装node.js,安装步骤如下: 首先下载安装包 https://nodejs.org/en/download/ 点击下载相应的zip版本 然后将文件夹解压到任意目录 比如我这里解压到了:C:\Program Files\node...

Helios51 ⋅ 今天 ⋅ 0

使用EnumSet 代替位域(32)

1、位域(Bit field):使用or 运算将几个常量合并到一个集合中 位操作,可以有效地执行 AND 、OR 这样的位操作 但是 位域比int 常量枚举缺点更多 2、java.util 包里面的EnumSet 类是有效的替...

职业搬砖20年 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部