对于数据量比较小的数据可采用:

       int mid = Arrays.binarySearch(array, k);
       if(mid<0) return 0;
        int cnt = 1;
        for(int i=mid+1; i < array.length && array[i]==k;i++)
            cnt++;
        for(int i=mid-1; i >= 0 && array[i]==k;i--)
            cnt++;
        return cnt;

对于数据量比较大的数据可继续利用二分法进行优化:
比如:0 1 2 2 3 3 4 5 5 5 5 5 6 7 8 9 12 13 14
k=5
图片说明
以左边为例:

               int leftmid = mid;//定义左侧数组大指针
           int left =0;//定义左侧数组小指针
           int temp = 0;//存储前一个left
           int start = 0;//记录第一个出现k的位置索引
            //处理左边
            while(true){
                if(array[left]!=k){//移动left指针
                    int s = (leftmid+left)/2;
                    if(array[s]==k) temp = left;//
                    left = s;
                }else{//移动leftmid指针,此处借助temp恢复left指针
                    leftmid = left;
                    left = temp;
                }
                if((leftmid-left)==1){//两个指针碰到一起,此时leftmid就是第一个出现5的位置
                    start = leftmid;
                    break;
                }
            }

有些细节还需要去推敲,大体思路应该没错,欢迎大佬批评指正