内存分配

new

new(T)返回一个T的指针 指向一个零值T

make

make(T, args) 与new(T) 有着不同的功能。它只能创建slice,map和channel,并且返回一个有初始值(非零)的T 类型,而不是*T(返回的是引用,不是指针)。已完成初始化!

复合声明

复合声明&File{fd: fd, name: name} 从堆中分配。‘&’得到堆上分配到的内存地址。

Read More

array、slice 和map

array

array变量

1
2
3
4
var arr1 [10] int
arr2 := [3]int{1,2,3}
arr3 :=[…]int{1,2,1,3} //自动统计个数
a := [3][2]int { [2]int {1,2}, [2]int {3,4}, [2]int {5,6} }//多维数组

有一点需要注意:当向函数内传递一个数组的时候,它会获得一个数组的副本,而不是数组的指针。也就是说,数组做参数是值传递,不是引用传递,在函数内修改数组的元素,不会对函数外造成影响

Read More

整体感受

学了几天的GO语言,感觉GO的设计目的是简捷、简用,GO不能算是一种面向对象的程序设计语言,例如,没有oop中的很多概念:继承、this指针、构造函数/析构函数等,但是对面向对象编程提供支持,可以定义抽象数据类型,允许定义成员方法等,这些特性表现在GO语言中的接口(interface)和结构体(struct),特别是接口(interface)在整个GO语言的体系中的作用非常重要。

Read More

java language

  1. 变量修饰符:static(类级变量or实例级变量)、final、volatile(可见并发性,强制从主内存读写)、transient(可否序列化)
  2. 方法修饰符:static final synchronized native strictfp abstract
  3. static块在类被初始化的时候,仅仅调用一次。
  4. 方法重写:
    • 抛出的异常可以减少或删除,一定不能抛出新的或者更广的异常。
    • 声明为final的方法不能被重写。
    • 声明为static的方法不能被重写,但是能够被再次声明。
    • 访问权限不能比父类中被重写的方法的访问权限更严格。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  5. java.lang.Cloneable接口是一个空的接口,没有申明任何属性与方法。该接口只是告诉JVM,该接口的实现类需要开放“克隆”功能。
  6. java函数传参是浅拷贝。=赋值也相当于浅拷贝,例如 ArrayList list1 = list2 就只是赋于引用值,ArrayList list1 = new ArrayList(list2) 才是拷贝数值
  7. 继承:实际上,private,public,protected和继承没有关系,他们对成员函数和变量的限制只是在成员的可见性上。
    • public允许来自任何类的访问;
    • private只允许来自改类内部的方法访问,不允许任何来自该类外部的访问;
    • protected允许来自同一包中的任何类以及改类的任何地方的任何子类的方法访问.
      而关于成员变量的继承,父类的任何成员变量都是会被子类继承下去的,这些继承下来的私有成员虽对子类来说不可见,但子类仍然可以用父类的函数操作他们.
      这样的设计有何意义呢?我们可以用这个方法将我们的成员保护得更好,让子类的设计者也只能通过父类指定的方法修改父类的私有成员,这样将能把类保护得更好,这对一个完整的继承体系是尤为可贵的. jdk源码就有这样的例子,java.util.Observable就是这样设计的.

      JDK

      使用

      64位JDK管理大内存,需要考虑以下问题:
  • 内存回收导致的长时间停顿
  • 现阶段,64位JDK的性能测试结果普遍低于32位JDK
  • 需要保证程序足够稳定,因为这种应用要是产生堆溢出几乎就无法产生堆转储快照(因为要产生十几GB乃至更大的文件),哪怕产生了快照也几乎无法进行分析。
  • 相同的程序在64位JKD中消耗的内存一般比32位JDK大,这是由指针膨胀及数据类型对齐补白等因素导致。

    IO

    InputStream类——available()方法返回输入流的大小。
    使用:
    1
    2
    3
    FileInputStream fis = new FileInputStream("E:\\1.txt");
    byte[] b= new byte[fis.available()];//定义一个刚刚好的数组
    fis.read(b);//全部读完

InputStream类及子类(包括 FileInputStream BufferedInputStream)处理的都是字节流。OutputStream与之对应
Reader类及子类(包括FileReader BufferedReader)处理的都是字符流,构造函数需传入InputStream。Writer类与之对应
BufferedInputStream是包装类,必须传入要包装的InputStream。BufferedOutputStream与之对应
BufferedReader是包装类,必须传入要包装的Reader。BufferedWriter与之对应

InputStreamReader可以指定字符集,FileReader是使用系统默认字符集。OutputStreamWriter与之对应。例子:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\笔记1.txt"),"GBK"));